[
  {
    "path": ".gitattributes",
    "content": "*.art linguist-language=Red\n*.art linguist-vendored\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [drkameleon]"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: \"Release\"\non:\n  push:\n    tags:\n      - 'v*.*.*'\nenv:\n  app-name: grafito\n\ndefaults:\n  run:\n    shell: bash -l {0}\n\njobs:  \n  package:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os:\n          - ubuntu-latest\n          - macos-latest\n        version:\n          - full\n    steps:\n      - name: \"Cancel similar actions in progress\"\n        uses: styfle/cancel-workflow-action@0.6.0\n        with:\n          access_token: ${{ github.token }}\n\n      - name: \"Get Arturo\"\n        uses: actions/checkout@main\n        with:\n          repository: arturo-lang/arturo\n          submodules: recursive\n\n      - name: Install Nim\n        run: |\n          wget -qO - https://nim-lang.org/choosenim/init.sh | bash -s -- -y\n          echo \"$HOME/.nimble/bin\" >> $GITHUB_PATH\n\n      - name: Install dependencies\n        if: matrix.os == 'ubuntu-latest'\n        run: |\n          sudo apt-get update\n          sudo apt-get install libwebkit2gtk-4.0-dev\n          \n      - name: Verify dependecies\n        run: |\n          nim --version\n\n      - name: \"Checkout\"\n        uses: actions/checkout@main\n        with:\n          submodules: recursive\n          path: \"grafito\"\n          \n      - name: Package binary\n        run: |\n          mv grafito/grafito.art grafito.art\n          rm -rf grafito\n          ./package grafito.art\n          ls -la\n\n      - name: Create artifact\n        run: |\n          install -m 0755 ./grafito .\n          tar czf ${{ env.app-name }}-${{runner.os}}.tar.gz ${{ env.app-name }} README.md LICENSE\n\n      - name: Upload Artifact\n        uses: 'actions/upload-artifact@v1'\n        with:\n          name: ${{ env.app-name }}-${{runner.os}}.tar.gz\n          path: ${{ env.app-name }}-${{runner.os}}.tar.gz\n\n  upload:\n    name: \"Upload\"\n    runs-on: ubuntu-latest\n    if: ${{ always() }}\n    needs: \n      - package\n    steps:\n      - uses: actions/download-artifact@v2\n        with:\n          path: ./assets\n      \n      - name: Display structure of downloaded files\n        run: ls -R\n\n      - name: Create Release\n        id: create-release\n        uses: actions/create-release@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          tag_name: ${{ github.ref }}\n          release_name: ${{ github.ref }}\n          body: |\n            Official Release\n            ${{ github.ref }}\n          draft: false\n          prerelease: false\n\n      - name: Upload Release Assets\n        id: upload-release-assets\n        uses: dwenegar/upload-release-assets@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          release_id: ${{ steps.create-release.outputs.id }}\n          assets_path: ./assets\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: \"CI\"\non:\n    push:\n        branches:\n        - master\n    pull_request:\n        types: [opened, synchronize]\n    workflow_dispatch:\n\nconcurrency: \n    group: ${{ github.workflow }}-${{ github.ref }}\n    cancel-in-progress: true\n\njobs:  \n    build:\n        name: \"Test\"\n        runs-on: ${{ \n            (matrix.os == 'linux')   && (matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest') ||\n            (matrix.os == 'macos')   && (matrix.arch == 'arm64' && 'macos-latest' || 'macOS-15-intel') ||\n            (matrix.os == 'windows') && 'windows-latest' || \n                                        'ubuntu-latest'  }}\n\n        # TODO(workflows/test) FreeBSD workflow gets stuck\n        #  Not sure if it has to do with the VM setup on GitHub Actions\n        #  or something related to the implementation of Grafito, \n        #  but we'll have to investigate this.\n        #  labels: workflows, bug\n        strategy:\n            fail-fast: false\n            matrix:\n                include: \n                    - {os: linux,   arch: amd64}\n                    - {os: linux,   arch: arm64}\n                    # - {os: freebsd, arch: amd64}\n                    - {os: macos,   arch: amd64}\n                    - {os: macos,   arch: arm64}\n                    - {os: windows, arch: amd64}\n                    \n        defaults:\n            run:\n                shell: ${{ \n                    (matrix.os == 'freebsd') && 'freebsd {0}' ||\n                    (matrix.os == 'windows') && 'msys2 {0}'   || \n                                                'bash'        }}\n\n        steps:\n            - name: \"Checkout sources\"\n              uses: actions/checkout@v4\n              with:\n                submodules: recursive\n\n            - name: Setup Arturo\n              uses: arturo-lang/setup-arturo@v2\n              with: \n                token: ${{ secrets.GITHUB_TOKEN }}\n                os: ${{ matrix.os }}\n                arch: ${{ matrix.arch }}\n\n            - name: Run unit tests\n              run: |\n                cd $GITHUB_WORKSPACE\n                arturo -e \"inspect sys\\deps\"\n                arturo tests/test1.art"
  },
  {
    "path": ".github/workflows/todos.yml",
    "content": "name: \"TODO -> Issue\"\non:\n  push:\n    branches:\n      - 'main'\n    tags-ignore:\n      - '**'\njobs:\n  build:\n    runs-on: \"ubuntu-latest\"\n    steps:\n      - uses: \"actions/checkout@main\"\n      - name: \"TODO to Issue generator\"\n        uses: \"alstr/todo-to-issue-action@v4.5\"\n        id: \"todo\"\n        with:\n          TOKEN: ${{ secrets.GITHUB_TOKEN }}"
  },
  {
    "path": ".gitignore",
    "content": "*.db\n*.graf\ntest*.sql\ntest*.nim\ntest*.html\ntesty.art\ntest*.art\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM arturolang/arturo\n\nRUN  apk update && apk upgrade\nRUN apk add --no-cache sqlite-dev\nRUN apk add sqlite\n\nADD grafito.art /home/grafito.art\n\nWORKDIR /home\n\nENTRYPOINT [ \"/home/grafito.art\" ]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2024 Yanis Zafirópulos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n<p align=\"center\"><img align=\"center\" width=\"350\" src=\"https://raw.githubusercontent.com/arturo-lang/grafito/master/logo.png\"/></p>\n<p align=\"center\">\n  <b>Portable, Serverless & Lightweight<br>SQLite-based Graph Database</b>\n  <br><br>\n  <img src=\"https://img.shields.io/github/license/arturo-lang/grafito?style=for-the-badge\">\n  <a href=\"https://github.com/arturo-lang/arturo\" style=\"text-decoration: none; display: inline-block;\"><img src=\"https://img.shields.io/badge/language-Arturo-6A156B.svg?style=for-the-badge\" alt=\"Language\"/></a>\n  <img src=\"https://img.shields.io/github/actions/workflow/status/arturo-lang/grafito/test.yml?branch=main&style=for-the-badge\">\n</p>\n\n<p align=\"center\"><img width=\"90%\" align=\"center\" src=\"https://raw.githubusercontent.com/arturo-lang/grafito/master/ui-screenshot.png\"/></p>\n\n--- \n \n<!--ts-->\n\n* [At A Glance](#at-a-glance)\n* [Try Grafito](#try-grafito)\n    * [Docker](#docker)\n    * [Installation](#installation)\n        * [As a Library](#as-a-library)\n        * [As a Standalone tool](#as-a-standalone-tool)\n* [How To](#how-to)\n    * [Create a simple Node](#create-a-simple-node)\n    * [Create Relationships between Nodes](#create-relationships-between-nodes)\n    * [Search Nodes](#search-nodes)\n    * [Delete an existing Node](#delete-an-existing-node)\n    * [Delete an existing Relationship](#delete-an-existing-relationship)\n    * [Preview a Set of Nodes](#preview-a-set-of-nodes)\n    * [More complex queries](#more-complex-queries)\n    \t* [Reverse edge queries](#reverse-edge-queries) \n    \t* [Using filters](#using-filters)\n    * [Not just a query language!](#not-just-a-query-language)\n* [Command Reference](#command-reference)\n    * [put](#put)\n    * [unput](#unput)\n    * [link](#link)\n    * [unlink](#unlink)\n    * [what](#what)\n    * [fetch](#fetch)\n    * [preview](#preview)\n* [Filter Reference](#filter-reference)\n    * [contains](#contains)\n    * [prefix](#prefix)\n    * [suffix](#suffix)\n    * [over](#over)\n    * [under](#under)\n    * [overOrEqual](#greaterOrEqual)\n    * [underOrEqual](#underOrEqual)\n    * [in](#in)\n    * [not](#not)\n* [Community](#community)\n* [License](#license)   \n\n<!--te-->\n \n---\n\n## At A Glance\n\nI know you really don't care about long explanations and want to have a look at working code right away, so... here you are (this is the code that creates the graph in the image above):\n\n```red\n;---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\ndo.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample11\"\n    ;---------------------------------------------\n    graph .helpers: [person movie country book]\n          .create\n          .palette: 'default\n          \"sample11\" \n    [\n        unless dbExists? [\n            ;---------------------------------------------\n            ; Populate the database\n            ;---------------------------------------------\n\n            uk: country.new [name: \"United Kingdom\"]\n            au: country.new [name: \"Australia\"]\n            us: country.new [name: \"United States\"] \n            ca: country.new [name: \"Canada\"]\n            fr: country.new [name: \"France\"]\n            de: country.new [name: \"Germany\"]\n            se: country.new [name: \"Sweden\"]\n            es: country.new [name: \"Spain\"]\n            pl: country.new [name: \"Poland\"]\n\n            nolan:      person.new [name: \"Christopher Nolan\" birthday: 1970 sex: \"m\"]\n            pearce:     person.new [name: \"Guy Pearce\" birthday: 1967 sex: \"m\"]\n            hanson:     person.new [name: \"Curtis Hanson\" birthday: 1945 sex: \"m\"]\n            spacey:     person.new [name: \"Kevin Spacey\" birthday: 1959 sex: \"m\"]\n            dicaprio:   person.new [name: \"Leonardo DiCaprio\" birthday: 1974 sex: \"m\"]\n            hardy:      person.new [name: \"Tom Hardy\" birthday: 1977 sex: \"m\"]\n            cotillard:  person.new [name: \"Marion Cotillard\" birthday: 1975 sex: \"f\"]\n            moss:       person.new [name: \"Carrie-Ann Moss\" birthday: 1967 sex: \"f\"]\n            kidman:     person.new [name: \"Nicole Kidman\" birthday: 1967 sex: \"f\"]\n            cruise:     person.new [name: \"Tom Cruise\" birthday: 1962 sex: \"m\"]\n            kubrick:    person.new [name: \"Stanley Kubrick\" birthday: 1928 died: 1999 sex: \"m\" alive: false]\n            burton:     person.new [name: \"Tim Burton\" birthday: 1958 sex: \"m\"]\n            depp:       person.new [name: \"Johny Depp\" birthday: 1965 sex: \"m\"]\n            hallstrom:  person.new [name: \"Lasse Hallström\" birthday: 1946 sex: \"m\"]\n            scorsese:   person.new [name: \"Martin Scorsese\" birthday: 1942 sex: \"m\"]\n            sydow:      person.new [name: \"Max von Sydow\" birthday: 1929 died: 2020 sex: \"m\" alive: false]\n            binoche:    person.new [name: \"Juliette Binoche\" birthday: 1964 sex: \"f\"]\n            dench:      person.new [name: \"Judi Dench\" birthday: 1934 sex: \"f\"]\n            eastwood:   person.new [name: \"Clint Eastwood\" birthday: 1930 sex: \"m\"]\n            polanski:   person.new [name: \"Roman Polanski\" birthday: 1933 sex: \"m\"]\n            olin:       person.new [name: \"Lena Olin\" birthday: 1955 sex: \"f\"]\n            zimmer:     person.new [name: \"Hans Zimmer\" birthday: 1957 sex: \"m\"]\n            pook:       person.new [name: \"Jocelyn Pook\" birthday: 1960 sex: \"f\"]\n            lehane:     person.new [name: \"Dennis Lehane\" birthday: 1965 sex: \"m\"]\n            penn:       person.new [name: \"Sean Penn\" birthday: 1960 sex: \"m\"]\n            malick:     person.new [name: \"Terrence Malick\" birthday: 1943 sex: \"m\"]\n            brody:      person.new [name: \"Adrien Brody\" birthday: 1973 sex: \"m\"]\n            wach1:      person.new [name: \"Lana Wachowski\" birthday: 1965 sex: \"f\"]\n            wach2:      person.new [name: \"Lilly Wachowski\" birthday: 1967 sex: \"f\"]\n\n            memento:        movie.new [title: \"Memento\" year: 2000]\n            inception:      movie.new [title: \"Inception\" year: 2010]\n            laconfidential: movie.new [title: \"L.A. Confidential\" year: 1997]\n            matrix:         movie.new [title: \"The Matrix\" year: 1999]\n            eyes:           movie.new [title: \"Eyes Wide Shut\" year: 1999]\n            bigfish:        movie.new [title: \"Big Fish\" year: 2003]\n            sleepyhollow:   movie.new [title: \"Sleepy Hollow\" year: 1999]\n            chocolat:       movie.new [title: \"Chocolat\" year: 2000]\n            jedgar:         movie.new [title: \"J. Edgar\" year: 2011]\n            ninthgate:      movie.new [title: \"The Ninth Gate\" year: 1999]\n            shutter:        movie.new [title: \"Shutter Island\" year: 2010]\n            mystic:         movie.new [title: \"Mystic River\" year: 2003]\n            redline:        movie.new [title: \"Thin Red Line\" year: 1998]\n            pianist:        movie.new [title: \"The Pianist\" year: 2002]\n\n            mysticB:        book.new [title: \"Mystic River\" year: 2001 language: \"en\"]\n\n            ;---------------------------------------------\n            ; Define the relationships\n            ; between our nodes\n            ;---------------------------------------------\n\n            [nolan hardy dench pook] ~> 'isFrom uk\n            [pearce kidman] ~> 'isFrom au\n            [malick brody hanson spacey dicaprio wach1 wach2 cruise kubrick burton depp eastwood scorsese lehane penn] ~> 'isFrom us\n            moss ~> 'isFrom ca\n            [cotillard binoche] ~> 'isFrom fr\n            polanski ~> 'isFrom [fr pl]\n            [hallstrom olin sydow] ~> 'isFrom se\n            zimmer ~> 'isFrom de\n\n            nolan ~> 'directed [memento inception]\n            hanson ~> 'directed laconfidential\n            [wach1 wach2] ~> 'directed matrix\n            kubrick ~> 'directed eyes\n            burton ~> 'directed [bigfish sleepyhollow]\n            hallstrom ~> 'directed chocolat\n            eastwood ~> 'directed [jedgar mystic]\n            polanski ~> 'directed [pianist ninthgate]\n            scorsese ~> 'directed shutter\n            malick ~> 'directed [pianist redline]\n\n            pearce ~> 'actedIn [memento laconfidential]\n            spacey ~> 'actedIn laconfidential\n            [dicaprio hardy cotillard] ~> 'actedIn inception\n            [dicaprio sydow] ~> 'actedIn shutter\n            cotillard ~> 'actedIn bigfish\n            moss ~> 'actedIn [memento matrix chocolat]\n            [cruise kidman] ~> 'actedIn eyes\n            depp ~> 'actedIn [chocolat sleepyhollow]\n            [binoche dench olin] ~> 'actedIn chocolat\n            [dicaprio dench] ~> 'actedIn jedgar\n            [depp olin] ~> 'actedIn ninthgate\n            penn ~> 'actedIn [mystic redline]\n            brody ~> 'actedIn [redline pianist]\n\n            zimmer ~> 'composed inception\n            pook ~> 'composed eyes\n\n            nolan ~> 'written inception\n\n            lehane ~> 'written mysticB\n            mystic ~> 'basedOn mysticB\n\n            [redline bigfish memento laconfidential jedgar shutter mystic] ~> 'origin us\n            matrix ~> 'origin [us au]\n            [inception eyes chocolat] ~> 'origin [uk us]\n            sleepyhollow ~> 'origin [us de]\n            ninthgate ~> 'origin [us fr es]\n            pianist ~> 'origin [uk fr de pl]\n\n            wach1 ~> 'sibling wach2\n            cruise ~> 'married kidman\n        ]\n\n        ;---------------------------------------------\n        ; Fetch every \"person\" &\n        ; open the Desktop app for visualization\n        ;---------------------------------------------\n        \n        preview fetch 'person ø\n    ]\n]\n```\n\n## Try Grafito!\n\n### Docker\n\nThe easiest way to try Grafito is using Docker (although, without support for the Desktop app - yet)\n\n```\ndocker run -it arturolang/grafito\n```\n\nor, if you want to run a specific script:\n\n```\ndocker run -it -v $(pwd):/home arturolang/grafito <yourscript>\n```\n\n### Installation\n\nTo install local, first you have to have installed the latest version of [Arturo](https://github.com/arturo-lang/arturo).\n\nThen, just clone this repo and simply go to the folder via your terminal.\n\n\n#### As a Library\n\nAfter having installed the latest version of Arturo, you can use Grafito from any Arturo script as a library.\n\nFor example, here's how to run the above example:\n\n```\narturo examples/sample11.art\n```\n\n#### As a Standalone tool\n\nOf course, you can also run Grafito as a tool on it own:\n\n```\n./grafito.art <database>\n```\n\n(If you pass a name, it will use it as your database file. If not, the database will be in-memory)\n\n<p align=\"center\"><img width=\"100%\" align=\"center\" src=\"https://raw.githubusercontent.com/arturo-lang/grafito/master/console.png\"/></p>\n\nAnd you can see your lightweight graph engine in action!\n\n## How To\n\n### Create a simple Node\n\n```red\ngraph.create \"mygraph\" [\n\tput'person [name: \"John\" sex: 'm]\n]\n```\n\nThe exact same thing using node helpers:\n\n```red\ngraph.create \"mygraph\"\n     .helpers: [person]\n[\n\tperson.new [name: \"John\", sex: 'm]\n]\n```\n\n### Create Relationships between Nodes\n\n```red\ngraph.create \"mygraph\" [\n\tjohn: put 'person [name: \"John\" sex: 'm]\n\tjoan: put 'person [name: \"Joan\" sex: 'f]\n\n\tlink john 'marriedTo joan\n]\n```\n\nThe exact same thing using node helpers and some syntactic sugar:\n\n```red\ngraph.create \"mygraph\"\n     .helpers: [person]\n[\n\tjohn: person.new [name: \"John\", sex: 'm]\n\tjoan: person.new [name: \"Joan\", sex: 'f]\n\n\tjohn <~> 'marriedTo joan\n]\n```\n\n### Search Nodes\n\n```red\ngraph \"mygraph\" [\n\tinspect fetch 'person [name: \"Joan\"]\n]\n```\nThe exact same thing using node helpers:\n\n```red\ngraph \"mygraph\"\n     .helpers: [person]\n[\n\tinspect person [name: \"Joan\"]\n]\n```\n\n### Delete an existing Node\n\n```red\ngraph \"mygraph\" [\n\tunput fetch 'person [name: \"John\"]\n]\n```\n\n### Delete an existing Relationship\n\n```red\ngraph \"mygraph\" [\n\tunlink fetch 'person [name: \"John\"] 'marriedTo \n           fetch 'person [name: \"Joan\"]\n]\n```\n\n### Preview a Set of Nodes\n\n```red\ngraph \"mygraph\" [\n\tpreview fetch 'person ø\n]\n```\n\n(If you run the `sample4` in the *examples* folder, you'll be a minimal movie database. Running the command `preview` will open up the Desktop app with the image you see above ;-))\n\n### More complex queries\n\n```red\ngraph \"mygraph\" [\n\tinspect fetch'person [\n\t\tsex: \"m\"\n\t\tmarriedTo: fetch 'person [name: \"Joan\"]\n\t]\n]\n```\n\nThe exact same thing using node helpers:\n\n```red\ngraph \"mygraph\"\n     .helpers: [person]\n[\n\tinspect person [\n\t\tsex: \"m\"\n\t\tmarriedTo: person [name: \"Joan\"]\n\t]\n]\n```\n\n#### Reverse edge queries\n\n```red\n; using our sample11.art graph\n\nmovie [\n\tdirected: <| person \"Clint Eastwood\"\n]\n```\n\n#### Using filters\n\n```red\ngraph \"mygraph\" [\n\tfetch 'person [\n\t\tsurname:\"Doe\"\n\t\tage: -> over: 30\n\t]\n]\n```\n\n### Not just a query language!\n\nNow, let's be reminded that although Grafito may present itself as an easy-to-use\nGraph Query Language, actually it's a \"shell\" on top of Arturo. That is: you can use anything you would normally use in a full-blown programming language, *along with* the extra layer that is Grafito. Awesome, right?\n\nThe above is a - very simple - example, but gives you definitely a rough idea (and no, [`union`](https://arturo-lang.io/documentation/library/sets/union/) has nothing to do with Grafito... it's just a normal command from Arturo's standard library)\n\n```red\nunion \n    person [\n        sex: \"m\"\n        birthday: -> under: 1960\n    ]\n    person [\n        sex: \"f\n        isFrom: country \"France\"\n    ]\n```\n\n(totally random example: Find all the men that were born before 1960 + all the women from... France!)\n\n## Command Reference\n\nAll of the following commands must run within a `graph` environment. In order to set it up, use:\n\n```red\ngraph <database> [\n\t;; your code goes here\n]\n```\n> ⚠️  The `graph` command is not needed when you run Grafito as a tool, since the \"environment\" is already set up for you. ;-) \n\nIf you pass `null` (or `ø`) then the database will be *in-memory*. If you want to save to a file on disk, then pass a string with the desired database name. If the database already exists, it will be re-opened. If not, it will be created from scratch.\n\n> 💡  You may force the database to be re-created from scratch, regardless of whether it exists, by setting the `.create` attribute. E.g.\n> ```\n> graph.create \"mygraph\" [\n> \t;; your code goes here\n> ]\n> ```\n\n### put\n\n#### Description\n\nInsert new node(s) to graph with given name and attributes.\n\n#### Usage\n\n<pre>\n<b>put</b> <ins>name</ins> <i>:literal</i>, <i>:string</i>\n    <ins>attributes</ins> <i>:dictionary</i>, <i>:block</i>\n</pre>\n\n#### Returns\n\n- *:dictionary* (node)\n- *:block* (of nodes)\n\n#### Examples\n\n```red\nput 'person [name: \"John\" surname: \"Doe\" birthday: 1986]\n```\n\n### unput\n\n#### Description\n\nRemove given node(s) from graph.\n\n#### Usage\n\n<pre>\n<b>unput</b> <ins>node</ins> <i>:dictionary</i>, <i>:block</i>\n</pre>\n\n#### Examples\n\n```red\nx: put 'person [name: \"John\" surname: \"Doe\" birthday: 1986]\nunput x\n```\n\n### link\n\n#### Description\n\nCreate a connection from source to target node with given name.\n\n#### Usage\n\n<pre>\n<b>link</b> <ins>source</ins> <i>:dictionary</i> (node), <i>:block</i> (of nodes)\n     <ins>name</ins> <i>:literal</i>, <i>:string</i>\n     <ins>target</ins> <i>:dictionary</i> (node), <i>:block</i> (of nodes)\n</pre>\n\n#### Returns\n\n- *:dictionary* (edge)\n\n#### Examples\n\n```red\nlink put 'person [name: \"John\" surname: \"Doe\" birthday: 1986] 'marriedTo \n     put 'person [name: \"Mary\" surname: \"Doe\" birthday: 1986]\n```\n\n### unlink\n\n#### Description\n\nRemove connection from source to target node with given name\n\n#### Usage\n\n<pre>\n<b>unlink</b> <ins>source</ins> <i>:dictionary</i> (node), <i>:block</i> (of nodes)\n       <ins>name</ins> <i>:literal</i>, <i>:string</i>\n       <ins>target</ins> <i>:dictionary</i> (node), <i>:block</i> (of nodes)\n</pre>\n\n#### Examples\n\n```red\nx: put 'person [name: \"John\" surname: \"Doe\" birthday: 1986]\ny: put 'person [name: \"Mary\" surname: \"Doe\" birthday: 1986]\n\nlink 'marriedTo x y\nunlink 'marriedTo x y\n```\n\n### fetch\n\n#### Description\n\nRetrieves nodes with name that match all given attributes.\n\n#### Usage\n\n<pre>\n<b>fetch</b> <ins>name</ins> <i>:literal</i>, <i>:string</i>\n      <ins>properties</ins> <i>:block</i> <i>:dictionary</i> <i>:null</i>\n</pre>\n\n#### Returns\n\n- *:block* of *:dictionary* (node)\n\n#### Examples\n\n```red\nprint fetch 'person [surname: \"Doe\"]\nprint fetch 'person [\n\tsurname: \"Doe\"\n\tmarriedTo: fetch'person [name: \"Mary\"]\n]\n```\n\n### preview\n\n#### Description\n\nPreview given array of nodes in Desktop app.\n\n#### Usage\n\n<pre>\n<b>preview</b> <ins>nodes</ins> <i>:block</i>\n</pre>\n\n#### Examples\n\n```red\npreview fetch 'person [surname: \"Doe\"]\n```\n\n## Filter Reference\n\nWhen querying - e.g. with `fetch` or `what` - you can search for results, not only for exact matches, but also using one of the filters below.\n\n```red\nfetch'person [\n\tsurname: \"Doe\" \t; here, we are looking for an exact match\n\t\t\t; that is: people with the surname Doe\n]\n```\n\n```red\nfetch'person [\n\tsurname: [\n\t\tcontains: \"D\"\t; here, we are using the 'contains filter\n\t\t\t        ; that is: people whose surname contains the letter D\n\t]\n]\n```\n\n(The above, using Arturo's powerful syntax, could also be written like: \n```red\nfetch'person [ surname: -> contains: \"D\" ]\n```\n\n### contains\n\nGet rows that *contain* the given text.\n\n### prefix\n\nGet rows that start with, or \"have as prefix\", the given text.\n\n### suffix\n\nGet rows that end with, or \"have as suffix\", the given text.\n\n### over\n\nGet rows with a numeric value *greater than* the given one.\n\n### under\n\nGet rows with a numeric value *less than* the given one.\n\n### overOrEqual\n\nGet rows with a numeric value *greater than or equal to* the given one.\n\n### underOrEqual\n\nGet rows with a numeric value *less than or equal to* the given one.\n\n### in\n\nGet rows with a numeric value *equal* to *one of those in* the given block.\n\n### not\n\nGet rows with a value *not equal to* the given one (or block of given values).\n\nCommunity\n------------------------------\n\nIn case you want to ask a question, suggest an idea, or practically anything related to Grafito (or Arturo) - feel free! Everything and everyone is welcome.\n\nFor that, the most convenient place for me would be the [GitHub Issues](https://github.com/arturo-lang/grafito/issues) page.\n\n[![Stargazers over time](https://starchart.cc/arturo-lang/grafito.svg)](https://starchart.cc/arturo-lang/grafito)\n\n## License\n\nMIT License\n\nCopyright (c) 2023 Yanis Zafirópulos\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "examples/sample1.art",
    "content": ";; Just run this with:\n;; arturo sample.art\n;;\n;; This will create a local sample.db\n;; along with the corresponding dot file\n;; and its visualization as sample.png \n;; - provided GraphViz is installed\n;;\n;; Have fun!\n\ndo.import \"grafito.art\"\n\ndo [\n\tgraph.create \"sample1\" [\n\t\tjohn: put 'person [s: \"John\" sex: 'm]\n\t\tjoan: put 'person [s: \"Joan\" sex: 'f]\n\t\tbob:  put 'person [s: \"Bob\"  sex: 'm]\n\t\tjill: put 'person [s: \"Jill\" sex: 'f]\n\n\t\tlink'marriedTo john joan\n\t\tlink'childOf @[bob jill] @[john joan]\n\t]\n]\n\ndo [\n\tbenchmark [\n\t\tgraph.verbose \"sample1\" [\n\n\t\t\tprint \"getting first person named Joan...\"\n\t\t\tjoan: what'person [s: \"Joan\"]\n\t\t\tinspect joan\n\n\t\t\tprint \"getting all male people married to Joan...\"\n\t\t\thusband: what 'person [sex: 'm marriedTo: joan]\n\t\t\tinspect husband\n\n\t\t\t; inspect fetch 'person [\n\t\t\t; \tmarriedTo: what 'person [s: \"Joan\"]\n\t\t\t; ]\n\n\t\t\tpreview fetch 'person ø\n\t\t]\n\t]\n]\n\n; do [\n; \tgraph \"sample1\" [\n; \t\tpreview fetch 'person ø\n; \t]\n; ]\n\n; execute ~\"dot -Tpng sample.dot -o sample.png\"\n"
  },
  {
    "path": "examples/sample10.art",
    "content": "do.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample4\"\n    ;---------------------------------------------\n    graph.create \"sample10\" [\n        j: put 'person [name: \"John\" age: 35]\n        n: put 'person [name: \"Jane\" age: 41]\n        link 'likes j n\n        preview fetch 'person ø\n    ]\n]"
  },
  {
    "path": "examples/sample11.art",
    "content": ";---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\nimport ./{../grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample11\"\n    ;---------------------------------------------\n    graph .helpers: [person movie country book]\n          .create\n          .palette: 'default\n          \"sample11\" \n    [\n        unless dbExists? [\n            ;---------------------------------------------\n            ; Populate the database\n            ;---------------------------------------------\n\n            uk: country.new [name: \"United Kingdom\"]\n            au: country.new [name: \"Australia\"]\n            us: country.new [name: \"United States\"] \n            ca: country.new [name: \"Canada\"]\n            fr: country.new [name: \"France\"]\n            de: country.new [name: \"Germany\"]\n            se: country.new [name: \"Sweden\"]\n            es: country.new [name: \"Spain\"]\n            pl: country.new [name: \"Poland\"]\n\n            nolan:      person.new [name: \"Christopher Nolan\" birthday: 1970 sex: \"m\"]\n            pearce:     person.new [name: \"Guy Pearce\" birthday: 1967 sex: \"m\"]\n            hanson:     person.new [name: \"Curtis Hanson\" birthday: 1945 sex: \"m\"]\n            spacey:     person.new [name: \"Kevin Spacey\" birthday: 1959 sex: \"m\"]\n            dicaprio:   person.new [name: \"Leonardo DiCaprio\" birthday: 1974 sex: \"m\"]\n            hardy:      person.new [name: \"Tom Hardy\" birthday: 1977 sex: \"m\"]\n            cotillard:  person.new [name: \"Marion Cotillard\" birthday: 1975 sex: \"f\"]\n            moss:       person.new [name: \"Carrie-Ann Moss\" birthday: 1967 sex: \"f\"]\n            kidman:     person.new [name: \"Nicole Kidman\" birthday: 1967 sex: \"f\"]\n            cruise:     person.new [name: \"Tom Cruise\" birthday: 1962 sex: \"m\"]\n            kubrick:    person.new [name: \"Stanley Kubrick\" birthday: 1928 died: 1999 sex: \"m\" alive: false]\n            burton:     person.new [name: \"Tim Burton\" birthday: 1958 sex: \"m\"]\n            depp:       person.new [name: \"Johny Depp\" birthday: 1965 sex: \"m\"]\n            hallstrom:  person.new [name: \"Lasse Hallström\" birthday: 1946 sex: \"m\"]\n            scorsese:   person.new [name: \"Martin Scorsese\" birthday: 1942 sex: \"m\"]\n            sydow:      person.new [name: \"Max von Sydow\" birthday: 1929 died: 2020 sex: \"m\" alive: false]\n            binoche:    person.new [name: \"Juliette Binoche\" birthday: 1964 sex: \"f\"]\n            dench:      person.new [name: \"Judi Dench\" birthday: 1934 sex: \"f\"]\n            eastwood:   person.new [name: \"Clint Eastwood\" birthday: 1930 sex: \"m\"]\n            polanski:   person.new [name: \"Roman Polanski\" birthday: 1933 sex: \"m\"]\n            olin:       person.new [name: \"Lena Olin\" birthday: 1955 sex: \"f\"]\n            zimmer:     person.new [name: \"Hans Zimmer\" birthday: 1957 sex: \"m\"]\n            pook:       person.new [name: \"Jocelyn Pook\" birthday: 1960 sex: \"f\"]\n            lehane:     person.new [name: \"Dennis Lehane\" birthday: 1965 sex: \"m\"]\n            penn:       person.new [name: \"Sean Penn\" birthday: 1960 sex: \"m\"]\n            malick:     person.new [name: \"Terrence Malick\" birthday: 1943 sex: \"m\"]\n            brody:      person.new [name: \"Adrien Brody\" birthday: 1973 sex: \"m\"]\n            wach1:      person.new [name: \"Lana Wachowski\" birthday: 1965 sex: \"f\"]\n            wach2:      person.new [name: \"Lilly Wachowski\" birthday: 1967 sex: \"f\"]\n\n            memento:        movie.new [title: \"Memento\" year: 2000]\n            inception:      movie.new [title: \"Inception\" year: 2010]\n            laconfidential: movie.new [title: \"L.A. Confidential\" year: 1997]\n            matrix:         movie.new [title: \"The Matrix\" year: 1999]\n            eyes:           movie.new [title: \"Eyes Wide Shut\" year: 1999]\n            bigfish:        movie.new [title: \"Big Fish\" year: 2003]\n            sleepyhollow:   movie.new [title: \"Sleepy Hollow\" year: 1999]\n            chocolat:       movie.new [title: \"Chocolat\" year: 2000]\n            jedgar:         movie.new [title: \"J. Edgar\" year: 2011]\n            ninthgate:      movie.new [title: \"The Ninth Gate\" year: 1999]\n            shutter:        movie.new [title: \"Shutter Island\" year: 2010]\n            mystic:         movie.new [title: \"Mystic River\" year: 2003]\n            redline:        movie.new [title: \"Thin Red Line\" year: 1998]\n            pianist:        movie.new [title: \"The Pianist\" year: 2002]\n\n            mysticB:        book.new [title: \"Mystic River\" year: 2001 language: \"en\"]\n\n            ;---------------------------------------------\n            ; Define the relationships\n            ; between our nodes\n            ;---------------------------------------------\n\n            [nolan hardy dench pook] ~> 'isFrom uk\n            [pearce kidman] ~> 'isFrom au\n            [malick brody hanson spacey dicaprio wach1 wach2 cruise kubrick burton depp eastwood scorsese lehane penn] ~> 'isFrom us\n            moss ~> 'isFrom ca\n            [cotillard binoche] ~> 'isFrom fr\n            polanski ~> 'isFrom [fr pl]\n            [hallstrom olin sydow] ~> 'isFrom se\n            zimmer ~> 'isFrom de\n\n            nolan ~> 'directed [memento inception]\n            hanson ~> 'directed laconfidential\n            [wach1 wach2] ~> 'directed matrix\n            kubrick ~> 'directed eyes\n            burton ~> 'directed [bigfish sleepyhollow]\n            hallstrom ~> 'directed chocolat\n            eastwood ~> 'directed [jedgar mystic]\n            polanski ~> 'directed [pianist ninthgate]\n            scorsese ~> 'directed shutter\n            malick ~> 'directed [pianist redline]\n\n            pearce ~> 'actedIn [memento laconfidential]\n            spacey ~> 'actedIn laconfidential\n            [dicaprio hardy cotillard] ~> 'actedIn inception\n            [dicaprio sydow] ~> 'actedIn shutter\n            cotillard ~> 'actedIn bigfish\n            moss ~> 'actedIn [memento matrix chocolat]\n            [cruise kidman] ~> 'actedIn eyes\n            depp ~> 'actedIn [chocolat sleepyhollow]\n            [binoche dench olin] ~> 'actedIn chocolat\n            [dicaprio dench] ~> 'actedIn jedgar\n            [depp olin] ~> 'actedIn ninthgate\n            penn ~> 'actedIn [mystic redline]\n            brody ~> 'actedIn [redline pianist]\n\n            zimmer ~> 'composed inception\n            pook ~> 'composed eyes\n\n            nolan ~> 'written inception\n\n            lehane ~> 'written mysticB\n            mystic ~> 'basedOn mysticB\n\n            [redline bigfish memento laconfidential jedgar shutter mystic] ~> 'origin us\n            matrix ~> 'origin [us au]\n            [inception eyes chocolat] ~> 'origin [uk us]\n            sleepyhollow ~> 'origin [us de]\n            ninthgate ~> 'origin [us fr es]\n            pianist ~> 'origin [uk fr de pl]\n\n            wach1 ~> 'sibling wach2\n            cruise ~> 'married kidman\n        ]\n\n        ;---------------------------------------------\n        ; Fetch every \"person\" &\n        ; open the Desktop app for visualization\n        ;---------------------------------------------\n        \n        preview fetch 'person ø\n    ]\n]"
  },
  {
    "path": "examples/sample12.art",
    "content": "do.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample11\"\n    ;---------------------------------------------\n    graph .helpers: [word]\n          .create\n          .palette: 'default\n          \"sample12\" \n    [\n        unless dbExists? [\n            'word [name: \"for\" lang: \"en\"]\n\n            {for_en}: put'word [name: {for}, lang: \"en\"]\n{Because, as, since.}: put'sense [name: {Because, as, since.}]\n[ {parce que_fr}, {car_fr}, {da_de}, {weil_de}, {denn_de}, {διότι_el}, {επειδή_el}, {γιατί_el}, {perché_it}, {poiché_it}, {porque_pt}, {pentru că_ro}, {căci_ro}, {porque_es}, {pues_es}, {como_es} ]: put.many 'word  [ [name:{parce que}, lang:{fr}], [name:{car}, lang:{fr}], [name:{da}, lang:{de}], [name:{weil}, lang:{de}], [name:{denn}, lang:{de}], [name:{διότι}, lang:{el}], [name:{επειδή}, lang:{el}], [name:{γιατί}, lang:{el}], [name:{perché}, lang:{it}], [name:{poiché}, lang:{it}], [name:{porque}, lang:{pt}], [name:{pentru că}, lang:{ro}], [name:{căci}, lang:{ro}], [name:{porque}, lang:{es}], [name:{pues}, lang:{es}], [name:{como}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{for_en}] 'means var{Because, as, since.}\n{Towards; in the direction of.}: put'sense [name: {Towards; in the direction of.}]\n[ {pour_fr}, {zu_de}, {nach_de}, {για_el}, {per_it}, {verso_it}, {a_pt}, {para_pt}, {pentru_ro}, {a_es}, {hacia_es} ]: put.many 'word  [ [name:{pour}, lang:{fr}], [name:{zu}, lang:{de}], [name:{nach}, lang:{de}], [name:{για}, lang:{el}], [name:{per}, lang:{it}], [name:{verso}, lang:{it}], [name:{a}, lang:{pt}], [name:{para}, lang:{pt}], [name:{pentru}, lang:{ro}], [name:{a}, lang:{es}], [name:{hacia}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{for_en}] 'means var{Towards; in the direction of.}\n{Directed at; intended to belong to.}: put'sense [name: {Directed at; intended to belong to.}]\n[ {pour_fr}, {für_de}, {για_el}, {per_it}, {para_pt}, {pentru_ro}, {para_es} ]: put.many 'word  [ [name:{pour}, lang:{fr}], [name:{für}, lang:{de}], [name:{για}, lang:{el}], [name:{per}, lang:{it}], [name:{para}, lang:{pt}], [name:{pentru}, lang:{ro}], [name:{para}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{pour_fr} var{für_de} var{για_el} var{per_it} var{para_pt} var{pentru_ro} var{para_es} var{for_en}] 'means var{Directed at; intended to belong to.}\n{In order to help, benefit, gratify, honor etc. (someone or something).}: put'sense [name: {In order to help, benefit, gratify, honor etc. (someone or something).}]\n{To be used or treated in a stated way, or with a stated purpose.}: put'sense [name: {To be used or treated in a stated way, or with a stated purpose.}]\n{Supporting, in favour of.}: put'sense [name: {Supporting, in favour of.}]\n[ {pour_fr}, {für_de}, {υπέρ_el}, {pro_it}, {a favor de_pt}, {pentru_ro}, {por_es} ]: put.many 'word  [ [name:{pour}, lang:{fr}], [name:{für}, lang:{de}], [name:{υπέρ}, lang:{el}], [name:{pro}, lang:{it}], [name:{a favor de}, lang:{pt}], [name:{pentru}, lang:{ro}], [name:{por}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{pour_fr} var{für_de} var{για_el} var{per_it} var{para_pt} var{pentru_ro} var{para_es} var{pour_fr} var{für_de} var{υπέρ_el} var{pro_it} var{a favor de_pt} var{pentru_ro} var{por_es} var{for_en}] 'means var{Supporting, in favour of.}\n{Because of.}: put'sense [name: {Because of.}]\n[ {pour_fr}, {wegen_de}, {για_el}, {λόγω_el}, {per_it}, {por causa de_pt}, {por_pt}, {por_es} ]: put.many 'word  [ [name:{pour}, lang:{fr}], [name:{wegen}, lang:{de}], [name:{για}, lang:{el}], [name:{λόγω}, lang:{el}], [name:{per}, lang:{it}], [name:{por causa de}, lang:{pt}], [name:{por}, lang:{pt}], [name:{por}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{pour_fr} var{für_de} var{για_el} var{per_it} var{para_pt} var{pentru_ro} var{para_es} var{pour_fr} var{für_de} var{υπέρ_el} var{pro_it} var{a favor de_pt} var{pentru_ro} var{por_es} var{pour_fr} var{wegen_de} var{για_el} var{λόγω_el} var{per_it} var{por causa de_pt} var{por_pt} var{por_es} var{for_en}] 'means var{Because of.}\n{Intended to cure, remove or counteract; in order to cure, remove or counteract.}: put'sense [name: {Intended to cure, remove or counteract; in order to cure, remove or counteract.}]\n{Over (a period of time).}: put'sense [name: {Over (a period of time).}]\n[ {depuis_fr}, {pendant_fr}, {seit_de}, {lang_de}, {-lang_de}, {tagelang etc._de}, {durante_it}, {por_pt}, {durante_pt}, {por_es}, {durante_es} ]: put.many 'word  [ [name:{depuis}, lang:{fr}], [name:{pendant}, lang:{fr}], [name:{seit}, lang:{de}], [name:{lang}, lang:{de}], [name:{-lang}, lang:{de}], [name:{tagelang etc.}, lang:{de}], [name:{durante}, lang:{it}], [name:{por}, lang:{pt}], [name:{durante}, lang:{pt}], [name:{por}, lang:{es}], [name:{durante}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{pour_fr} var{für_de} var{για_el} var{per_it} var{para_pt} var{pentru_ro} var{para_es} var{pour_fr} var{für_de} var{υπέρ_el} var{pro_it} var{a favor de_pt} var{pentru_ro} var{por_es} var{pour_fr} var{wegen_de} var{για_el} var{λόγω_el} var{per_it} var{por causa de_pt} var{por_pt} var{por_es} var{depuis_fr} var{pendant_fr} var{seit_de} var{lang_de} var{-lang_de} var{tagelang etc._de} var{durante_it} var{por_pt} var{durante_pt} var{por_es} var{durante_es} var{for_en}] 'means var{Over (a period of time).}\n{Throughout or across (a distance in space).}: put'sense [name: {Throughout or across (a distance in space).}]\n{Used to introduce a subject within a to-infinitive clause.}: put'sense [name: {Used to introduce a subject within a to-infinitive clause.}]\n{On behalf of.}: put'sense [name: {On behalf of.}]\n{In the role or capacity of; instead of; in place of.}: put'sense [name: {In the role or capacity of; instead of; in place of.}]\n{In exchange for; in correspondence or equivalence with.}: put'sense [name: {In exchange for; in correspondence or equivalence with.}]\n{In order to obtain or acquire.}: put'sense [name: {In order to obtain or acquire.}]\n[ {pour_fr}, {für_de}, {por_pt}, {por_es} ]: put.many 'word  [ [name:{pour}, lang:{fr}], [name:{für}, lang:{de}], [name:{por}, lang:{pt}], [name:{por}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{pour_fr} var{für_de} var{για_el} var{per_it} var{para_pt} var{pentru_ro} var{para_es} var{pour_fr} var{für_de} var{υπέρ_el} var{pro_it} var{a favor de_pt} var{pentru_ro} var{por_es} var{pour_fr} var{wegen_de} var{για_el} var{λόγω_el} var{per_it} var{por causa de_pt} var{por_pt} var{por_es} var{depuis_fr} var{pendant_fr} var{seit_de} var{lang_de} var{-lang_de} var{tagelang etc._de} var{durante_it} var{por_pt} var{durante_pt} var{por_es} var{durante_es} var{pour_fr} var{für_de} var{por_pt} var{por_es} var{for_en}] 'means var{In order to obtain or acquire.}\n{By the standards of, usually with the implication of those standards being lower than one might otherwise expect.}: put'sense [name: {By the standards of, usually with the implication of those standards being lower than one might otherwise expect.}]\n[ {für_de}, {para_pt}, {para ser_es} ]: put.many 'word  [ [name:{für}, lang:{de}], [name:{para}, lang:{pt}], [name:{para ser}, lang:{es}] ]\nlink [var{parce que_fr} var{car_fr} var{da_de} var{weil_de} var{denn_de} var{διότι_el} var{επειδή_el} var{γιατί_el} var{perché_it} var{poiché_it} var{porque_pt} var{pentru că_ro} var{căci_ro} var{porque_es} var{pues_es} var{como_es} var{pour_fr} var{zu_de} var{nach_de} var{για_el} var{per_it} var{verso_it} var{a_pt} var{para_pt} var{pentru_ro} var{a_es} var{hacia_es} var{pour_fr} var{für_de} var{για_el} var{per_it} var{para_pt} var{pentru_ro} var{para_es} var{pour_fr} var{für_de} var{υπέρ_el} var{pro_it} var{a favor de_pt} var{pentru_ro} var{por_es} var{pour_fr} var{wegen_de} var{για_el} var{λόγω_el} var{per_it} var{por causa de_pt} var{por_pt} var{por_es} var{depuis_fr} var{pendant_fr} var{seit_de} var{lang_de} var{-lang_de} var{tagelang etc._de} var{durante_it} var{por_pt} var{durante_pt} var{por_es} var{durante_es} var{pour_fr} var{für_de} var{por_pt} var{por_es} var{für_de} var{para_pt} var{para ser_es} var{for_en}] 'means var{By the standards of, usually with the implication of those standards being lower than one might otherwise expect.}\n{To be, or as being.}: put'sense [name: {To be, or as being.}]\n{Despite, in spite of.}: put'sense [name: {Despite, in spite of.}]\n{Indicating something desired or anticipated.}: put'sense [name: {Indicating something desired or anticipated.}]\n{Introducing the first item(s) in a potential sequence.}: put'sense [name: {Introducing the first item(s) in a potential sequence.}]\n{In honor of; after.}: put'sense [name: {In honor of; after.}]\n{Due or facing (a certain outcome or fate).}: put'sense [name: {Due or facing (a certain outcome or fate).}]\n{Out of; used to indicate a fraction, a ratio}: put'sense [name: {Out of; used to indicate a fraction, a ratio}]\n{Used as part of a score to indicate the number of wickets that have fallen.}: put'sense [name: {Used as part of a score to indicate the number of wickets that have fallen.}]\n{Indicating that in prevention of which, or through fear of which, anything is done.}: put'sense [name: {Indicating that in prevention of which, or through fear of which, anything is done.}]\n{Used in various more-or-less idiomatic ways to construe individual verbs, indicating various semantic relationships such as target, purpose, result, etc.; see also the entries for individual phrasal verbs, e.g. ask for, look for, stand for, etc.}: put'sense [name: {Used in various more-or-less idiomatic ways to construe individual verbs, indicating various semantic relationships such as target, purpose, result, etc.; see also the entries for individual phrasal verbs, e.g. ask for, look for, stand for, etc.}]\n{So (that), in order to}: put'sense [name: {So (that), in order to}]\n{To, the particle for marking the following verb as an infinitive.}: put'sense [name: {To, the particle for marking the following verb as an infinitive.}]\n{desertification_en}: put'word [name: {desertification}, lang: \"en\"]\n{The process by which a geographic region becomes a desert, resulting from natural changes in climate or by human activity.}: put'sense [name: {The process by which a geographic region becomes a desert, resulting from natural changes in climate or by human activity.}]\n[ {désertification_fr}, {Desertifikation_de}, {fortschreitende Wüstenbildung_de}, {ερημοποίηση_el}, {desertificazione_it}, {desertificação_pt}, {desertificación_es} ]: put.many 'word  [ [name:{désertification}, lang:{fr}], [name:{Desertifikation}, lang:{de}], [name:{fortschreitende Wüstenbildung}, lang:{de}], [name:{ερημοποίηση}, lang:{el}], [name:{desertificazione}, lang:{it}], [name:{desertificação}, lang:{pt}], [name:{desertificación}, lang:{es}] ]\nlink [var{désertification_fr} var{Desertifikation_de} var{fortschreitende Wüstenbildung_de} var{ερημοποίηση_el} var{desertificazione_it} var{desertificação_pt} var{desertificación_es} var{desertification_en}] 'means var{The process by which a geographic region becomes a desert, resulting from natural changes in climate or by human activity.}\n{acute_en}: put'word [name: {acute}, lang: \"en\"]\n{Brief, quick, short.}: put'sense [name: {Brief, quick, short.}]\n{High or shrill.}: put'sense [name: {High or shrill.}]\n{Intense, sensitive, sharp.}: put'sense [name: {Intense, sensitive, sharp.}]\n[ {aigu_fr}, {aiguë_fr}, {scharf_de}, {οξύς_el}, {agudo_pt}, {agudo_es}, {perspicaz_es}, {sagaz_es} ]: put.many 'word  [ [name:{aigu}, lang:{fr}], [name:{aiguë}, lang:{fr}], [name:{scharf}, lang:{de}], [name:{οξύς}, lang:{el}], [name:{agudo}, lang:{pt}], [name:{agudo}, lang:{es}], [name:{perspicaz}, lang:{es}], [name:{sagaz}, lang:{es}] ]\nlink [var{aigu_fr} var{aiguë_fr} var{scharf_de} var{οξύς_el} var{agudo_pt} var{agudo_es} var{perspicaz_es} var{sagaz_es} var{acute_en}] 'means var{Intense, sensitive, sharp.}\n{Urgent.}: put'sense [name: {Urgent.}]\n[ {urgente_pt}, {grave_es} ]: put.many 'word  [ [name:{urgente}, lang:{pt}], [name:{grave}, lang:{es}] ]\nlink [var{aigu_fr} var{aiguë_fr} var{scharf_de} var{οξύς_el} var{agudo_pt} var{agudo_es} var{perspicaz_es} var{sagaz_es} var{urgente_pt} var{grave_es} var{acute_en}] 'means var{Urgent.}\n{With the sides meeting directly to form an acute angle (at an apex or base).}: put'sense [name: {With the sides meeting directly to form an acute angle (at an apex or base).}]\n{Of an angle: less than 90 degrees.}: put'sense [name: {Of an angle: less than 90 degrees.}]\n[ {aigu_fr}, {spitz_de}, {οξύς_el}, {acuto_it}, {agudo_pt}, {ascuțit_ro}, {agudo_es} ]: put.many 'word  [ [name:{aigu}, lang:{fr}], [name:{spitz}, lang:{de}], [name:{οξύς}, lang:{el}], [name:{acuto}, lang:{it}], [name:{agudo}, lang:{pt}], [name:{ascuțit}, lang:{ro}], [name:{agudo}, lang:{es}] ]\nlink [var{aigu_fr} var{aiguë_fr} var{scharf_de} var{οξύς_el} var{agudo_pt} var{agudo_es} var{perspicaz_es} var{sagaz_es} var{urgente_pt} var{grave_es} var{aigu_fr} var{spitz_de} var{οξύς_el} var{acuto_it} var{agudo_pt} var{ascuțit_ro} var{agudo_es} var{acute_en}] 'means var{Of an angle: less than 90 degrees.}\n{Of a triangle: having all three interior angles measuring less than 90 degrees.}: put'sense [name: {Of a triangle: having all three interior angles measuring less than 90 degrees.}]\n{Of an accent or tone: generally higher than others.}: put'sense [name: {Of an accent or tone: generally higher than others.}]\n{Of an abnormal condition of recent or sudden onset, in contrast to delayed onset; this sense does not imply severity, unlike the common usage.}: put'sense [name: {Of an abnormal condition of recent or sudden onset, in contrast to delayed onset; this sense does not imply severity, unlike the common usage.}]\n[ {aigu_fr}, {akut_de}, {agudo_pt} ]: put.many 'word  [ [name:{aigu}, lang:{fr}], [name:{akut}, lang:{de}], [name:{agudo}, lang:{pt}] ]\nlink [var{aigu_fr} var{aiguë_fr} var{scharf_de} var{οξύς_el} var{agudo_pt} var{agudo_es} var{perspicaz_es} var{sagaz_es} var{urgente_pt} var{grave_es} var{aigu_fr} var{spitz_de} var{οξύς_el} var{acuto_it} var{agudo_pt} var{ascuțit_ro} var{agudo_es} var{aigu_fr} var{akut_de} var{agudo_pt} var{acute_en}] 'means var{Of an abnormal condition of recent or sudden onset, in contrast to delayed onset; this sense does not imply severity, unlike the common usage.}\n{Of a short-lived condition, in contrast to a chronic condition; this sense also does not imply severity.}: put'sense [name: {Of a short-lived condition, in contrast to a chronic condition; this sense also does not imply severity.}]\n[ {aigu_fr}, {οξύς_el}, {agudo_pt} ]: put.many 'word  [ [name:{aigu}, lang:{fr}], [name:{οξύς}, lang:{el}], [name:{agudo}, lang:{pt}] ]\nlink [var{aigu_fr} var{aiguë_fr} var{scharf_de} var{οξύς_el} var{agudo_pt} var{agudo_es} var{perspicaz_es} var{sagaz_es} var{urgente_pt} var{grave_es} var{aigu_fr} var{spitz_de} var{οξύς_el} var{acuto_it} var{agudo_pt} var{ascuțit_ro} var{agudo_es} var{aigu_fr} var{akut_de} var{agudo_pt} var{aigu_fr} var{οξύς_el} var{agudo_pt} var{acute_en}] 'means var{Of a short-lived condition, in contrast to a chronic condition; this sense also does not imply severity.}\n{After a letter of the alphabet: having an acute accent.}: put'sense [name: {After a letter of the alphabet: having an acute accent.}]\n[ {aigu_fr} ]: put.many 'word  [ [name:{aigu}, lang:{fr}] ]\nlink [var{aigu_fr} var{aiguë_fr} var{scharf_de} var{οξύς_el} var{agudo_pt} var{agudo_es} var{perspicaz_es} var{sagaz_es} var{urgente_pt} var{grave_es} var{aigu_fr} var{spitz_de} var{οξύς_el} var{acuto_it} var{agudo_pt} var{ascuțit_ro} var{agudo_es} var{aigu_fr} var{akut_de} var{agudo_pt} var{aigu_fr} var{οξύς_el} var{agudo_pt} var{aigu_fr} var{acute_en}] 'means var{After a letter of the alphabet: having an acute accent.}\n{A person who has the acute form of a disorder, such as schizophrenia.}: put'sense [name: {A person who has the acute form of a disorder, such as schizophrenia.}]\n{An accent or tone higher than others.}: put'sense [name: {An accent or tone higher than others.}]\n{An acute accent (´).}: put'sense [name: {An acute accent (´).}]\n{To give an acute sound to.}: put'sense [name: {To give an acute sound to.}]\n{To make acute; to sharpen, to whet.}: put'sense [name: {To make acute; to sharpen, to whet.}]\n{humble_en}: put'word [name: {humble}, lang: \"en\"]\n{Not pretentious or magnificent; unpretending; unassuming.}: put'sense [name: {Not pretentious or magnificent; unpretending; unassuming.}]\n{Having a low opinion of oneself; not proud, arrogant, or assuming; modest.}: put'sense [name: {Having a low opinion of oneself; not proud, arrogant, or assuming; modest.}]\n[ {humble_fr}, {demütig_de}, {bescheiden_de}, {umile_it}, {modesto_it}, {humilde_pt}, {umil_ro}, {modesto_es}, {humilde_es} ]: put.many 'word  [ [name:{humble}, lang:{fr}], [name:{demütig}, lang:{de}], [name:{bescheiden}, lang:{de}], [name:{umile}, lang:{it}], [name:{modesto}, lang:{it}], [name:{humilde}, lang:{pt}], [name:{umil}, lang:{ro}], [name:{modesto}, lang:{es}], [name:{humilde}, lang:{es}] ]\nlink [var{humble_fr} var{demütig_de} var{bescheiden_de} var{umile_it} var{modesto_it} var{humilde_pt} var{umil_ro} var{modesto_es} var{humilde_es} var{humble_en}] 'means var{Having a low opinion of oneself; not proud, arrogant, or assuming; modest.}\n{To defeat or reduce the power, independence, or pride of}: put'sense [name: {To defeat or reduce the power, independence, or pride of}]\n{To make humble or lowly; to make less proud or arrogant; to make meek and submissive.}: put'sense [name: {To make humble or lowly; to make less proud or arrogant; to make meek and submissive.}]\n[ {erniedrigen_de}, {demütig machen_de}, {umili_ro} ]: put.many 'word  [ [name:{erniedrigen}, lang:{de}], [name:{demütig machen}, lang:{de}], [name:{umili}, lang:{ro}] ]\nlink [var{humble_fr} var{demütig_de} var{bescheiden_de} var{umile_it} var{modesto_it} var{humilde_pt} var{umil_ro} var{modesto_es} var{humilde_es} var{erniedrigen_de} var{demütig machen_de} var{umili_ro} var{humble_en}] 'means var{To make humble or lowly; to make less proud or arrogant; to make meek and submissive.}\n{An arrest based on weak evidence intended to demean or punish the subject.}: put'sense [name: {An arrest based on weak evidence intended to demean or punish the subject.}]\n{To hum.}: put'sense [name: {To hum.}]\n{Alternative form of hummel.}: put'sense [name: {Alternative form of hummel.}]\n{Alternative form of hummel.}: put'sense [name: {Alternative form of hummel.}]\n{million_en}: put'word [name: {million}, lang: \"en\"]\n{The cardinal number 1,000,000: 10⁶; a thousand thousand.}: put'sense [name: {The cardinal number 1,000,000: 10⁶; a thousand thousand.}]\n[ {million_fr}, {Million_de}, {εκατομμύριο_el}, {milione_it}, {milhão_pt}, {milion_ro}, {millón_es} ]: put.many 'word  [ [name:{million}, lang:{fr}], [name:{Million}, lang:{de}], [name:{εκατομμύριο}, lang:{el}], [name:{milione}, lang:{it}], [name:{milhão}, lang:{pt}], [name:{milion}, lang:{ro}], [name:{millón}, lang:{es}] ]\nlink [var{million_fr} var{Million_de} var{εκατομμύριο_el} var{milione_it} var{milhão_pt} var{milion_ro} var{millón_es} var{million_en}] 'means var{The cardinal number 1,000,000: 10⁶; a thousand thousand.}\n{An unspecified very large number.}: put'sense [name: {An unspecified very large number.}]\n{before_en}: put'word [name: {before}, lang: \"en\"]\n{Earlier than (in time).}: put'sense [name: {Earlier than (in time).}]\n[ {avant_fr}, {avant que_fr}, {vor_de}, {πριν_el}, {prima_it}, {innanzi_it}, {antes de_pt}, {înainte_ro}, {anterior_ro}, {antes de_es}, {antes que_es} ]: put.many 'word  [ [name:{avant}, lang:{fr}], [name:{avant que}, lang:{fr}], [name:{vor}, lang:{de}], [name:{πριν}, lang:{el}], [name:{prima}, lang:{it}], [name:{innanzi}, lang:{it}], [name:{antes de}, lang:{pt}], [name:{înainte}, lang:{ro}], [name:{anterior}, lang:{ro}], [name:{antes de}, lang:{es}], [name:{antes que}, lang:{es}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{before_en}] 'means var{Earlier than (in time).}\n{In front of in space.}: put'sense [name: {In front of in space.}]\n[ {devant_fr}, {vor_de}, {μπροστά σε_el}, {μπροστά από_el}, {davanti_it}, {innanzi_it}, {ante_pt}, {em frente a_pt}, {na frente de_pt}, {diante de_pt}, {înainte_ro}, {în față_ro}, {ante_es}, {frente a_es}, {enfrente de_es} ]: put.many 'word  [ [name:{devant}, lang:{fr}], [name:{vor}, lang:{de}], [name:{μπροστά σε}, lang:{el}], [name:{μπροστά από}, lang:{el}], [name:{davanti}, lang:{it}], [name:{innanzi}, lang:{it}], [name:{ante}, lang:{pt}], [name:{em frente a}, lang:{pt}], [name:{na frente de}, lang:{pt}], [name:{diante de}, lang:{pt}], [name:{înainte}, lang:{ro}], [name:{în față}, lang:{ro}], [name:{ante}, lang:{es}], [name:{frente a}, lang:{es}], [name:{enfrente de}, lang:{es}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{before_en}] 'means var{In front of in space.}\n{In the presence of.}: put'sense [name: {In the presence of.}]\n{Under consideration, judgment, authority of (someone).}: put'sense [name: {Under consideration, judgment, authority of (someone).}]\n{In store for, in the future of (someone).}: put'sense [name: {In store for, in the future of (someone).}]\n{In front of, according to a formal system of ordering items.}: put'sense [name: {In front of, according to a formal system of ordering items.}]\n[ {avant_fr}, {vor_de}, {antes de_pt}, {antes de_es} ]: put.many 'word  [ [name:{avant}, lang:{fr}], [name:{vor}, lang:{de}], [name:{antes de}, lang:{pt}], [name:{antes de}, lang:{es}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{avant_fr} var{vor_de} var{antes de_pt} var{antes de_es} var{before_en}] 'means var{In front of, according to a formal system of ordering items.}\n{At a higher or greater position than, in a ranking.}: put'sense [name: {At a higher or greater position than, in a ranking.}]\n{At an earlier time.}: put'sense [name: {At an earlier time.}]\n[ {avant_fr}, {zuvor_de}, {vorher_de}, {prima_it}, {antes_pt}, {înainte_ro} ]: put.many 'word  [ [name:{avant}, lang:{fr}], [name:{zuvor}, lang:{de}], [name:{vorher}, lang:{de}], [name:{prima}, lang:{it}], [name:{antes}, lang:{pt}], [name:{înainte}, lang:{ro}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{avant_fr} var{vor_de} var{antes de_pt} var{antes de_es} var{avant_fr} var{zuvor_de} var{vorher_de} var{prima_it} var{antes_pt} var{înainte_ro} var{before_en}] 'means var{At an earlier time.}\n{In advance.}: put'sense [name: {In advance.}]\n[ {eher_de}, {im Voraus_de}, {primeiro_pt}, {în avans_ro} ]: put.many 'word  [ [name:{eher}, lang:{de}], [name:{im Voraus}, lang:{de}], [name:{primeiro}, lang:{pt}], [name:{în avans}, lang:{ro}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{avant_fr} var{vor_de} var{antes de_pt} var{antes de_es} var{avant_fr} var{zuvor_de} var{vorher_de} var{prima_it} var{antes_pt} var{înainte_ro} var{eher_de} var{im Voraus_de} var{primeiro_pt} var{în avans_ro} var{before_en}] 'means var{In advance.}\n{At the front end.}: put'sense [name: {At the front end.}]\n[ {vorn_de}, {vorne_de} ]: put.many 'word  [ [name:{vorn}, lang:{de}], [name:{vorne}, lang:{de}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{avant_fr} var{vor_de} var{antes de_pt} var{antes de_es} var{avant_fr} var{zuvor_de} var{vorher_de} var{prima_it} var{antes_pt} var{înainte_ro} var{eher_de} var{im Voraus_de} var{primeiro_pt} var{în avans_ro} var{vorn_de} var{vorne_de} var{before_en}] 'means var{At the front end.}\n{In advance of the time when.}: put'sense [name: {In advance of the time when.}]\n[ {avant que_fr}, {bevor_de}, {prima_it}, {antes de que_es} ]: put.many 'word  [ [name:{avant que}, lang:{fr}], [name:{bevor}, lang:{de}], [name:{prima}, lang:{it}], [name:{antes de que}, lang:{es}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{avant_fr} var{vor_de} var{antes de_pt} var{antes de_es} var{avant_fr} var{zuvor_de} var{vorher_de} var{prima_it} var{antes_pt} var{înainte_ro} var{eher_de} var{im Voraus_de} var{primeiro_pt} var{în avans_ro} var{vorn_de} var{vorne_de} var{avant que_fr} var{bevor_de} var{prima_it} var{antes de que_es} var{before_en}] 'means var{In advance of the time when.}\n{Rather or sooner than.}: put'sense [name: {Rather or sooner than.}]\n[ {bevor_de} ]: put.many 'word  [ [name:{bevor}, lang:{de}] ]\nlink [var{avant_fr} var{avant que_fr} var{vor_de} var{πριν_el} var{prima_it} var{innanzi_it} var{antes de_pt} var{înainte_ro} var{anterior_ro} var{antes de_es} var{antes que_es} var{devant_fr} var{vor_de} var{μπροστά σε_el} var{μπροστά από_el} var{davanti_it} var{innanzi_it} var{ante_pt} var{em frente a_pt} var{na frente de_pt} var{diante de_pt} var{înainte_ro} var{în față_ro} var{ante_es} var{frente a_es} var{enfrente de_es} var{avant_fr} var{vor_de} var{antes de_pt} var{antes de_es} var{avant_fr} var{zuvor_de} var{vorher_de} var{prima_it} var{antes_pt} var{înainte_ro} var{eher_de} var{im Voraus_de} var{primeiro_pt} var{în avans_ro} var{vorn_de} var{vorne_de} var{avant que_fr} var{bevor_de} var{prima_it} var{antes de que_es} var{bevor_de} var{before_en}] 'means var{Rather or sooner than.}\n{overall_en}: put'word [name: {overall}, lang: \"en\"]\n{All-encompassing, all around.}: put'sense [name: {All-encompassing, all around.}]\n[ {global_fr}, {total_fr}, {Gesamt-_de}, {complessivo_it}, {globale_it}, {generale_it}, {abrangente_pt}, {geral_pt}, {total_es}, {completo_es}, {general_es} ]: put.many 'word  [ [name:{global}, lang:{fr}], [name:{total}, lang:{fr}], [name:{Gesamt-}, lang:{de}], [name:{complessivo}, lang:{it}], [name:{globale}, lang:{it}], [name:{generale}, lang:{it}], [name:{abrangente}, lang:{pt}], [name:{geral}, lang:{pt}], [name:{total}, lang:{es}], [name:{completo}, lang:{es}], [name:{general}, lang:{es}] ]\nlink [var{global_fr} var{total_fr} var{Gesamt-_de} var{complessivo_it} var{globale_it} var{generale_it} var{abrangente_pt} var{geral_pt} var{total_es} var{completo_es} var{general_es} var{overall_en}] 'means var{All-encompassing, all around.}\n{Generally; with everything considered.}: put'sense [name: {Generally; with everything considered.}]\n[ {en général_fr}, {insgesamt_de}, {tutto sommato_it}, {in generale_it}, {complessivamente_it}, {nell'insieme_it}, {em geral_pt}, {sobretodo_es}, {totalmente_es}, {completamente_es} ]: put.many 'word  [ [name:{en général}, lang:{fr}], [name:{insgesamt}, lang:{de}], [name:{tutto sommato}, lang:{it}], [name:{in generale}, lang:{it}], [name:{complessivamente}, lang:{it}], [name:{nell'insieme}, lang:{it}], [name:{em geral}, lang:{pt}], [name:{sobretodo}, lang:{es}], [name:{totalmente}, lang:{es}], [name:{completamente}, lang:{es}] ]\nlink [var{global_fr} var{total_fr} var{Gesamt-_de} var{complessivo_it} var{globale_it} var{generale_it} var{abrangente_pt} var{geral_pt} var{total_es} var{completo_es} var{general_es} var{en général_fr} var{insgesamt_de} var{tutto sommato_it} var{in generale_it} var{complessivamente_it} var{nell'insieme_it} var{em geral_pt} var{sobretodo_es} var{totalmente_es} var{completamente_es} var{overall_en}] 'means var{Generally; with everything considered.}\n{A garment worn over other clothing to protect it; a coverall or boiler suit. A garment, for manual labor or for casual wear, often made of a single piece of fabric, with long legs and a bib upper, supported from the shoulders with straps, and having several large pockets and loops for carrying tools.}: put'sense [name: {A garment worn over other clothing to protect it; a coverall or boiler suit. A garment, for manual labor or for casual wear, often made of a single piece of fabric, with long legs and a bib upper, supported from the shoulders with straps, and having several large pockets and loops for carrying tools.}]\n[ {blouse_fr}, {combinaison_fr}, {salopette_fr}, {Overall_de}, {Latzhose_de}, {blusa_it}, {tuta da lavoro_it}, {macacão_pt}, {braga_es}, {mono_es}, {overol_es} ]: put.many 'word  [ [name:{blouse}, lang:{fr}], [name:{combinaison}, lang:{fr}], [name:{salopette}, lang:{fr}], [name:{Overall}, lang:{de}], [name:{Latzhose}, lang:{de}], [name:{blusa}, lang:{it}], [name:{tuta da lavoro}, lang:{it}], [name:{macacão}, lang:{pt}], [name:{braga}, lang:{es}], [name:{mono}, lang:{es}], [name:{overol}, lang:{es}] ]\nlink [var{global_fr} var{total_fr} var{Gesamt-_de} var{complessivo_it} var{globale_it} var{generale_it} var{abrangente_pt} var{geral_pt} var{total_es} var{completo_es} var{general_es} var{en général_fr} var{insgesamt_de} var{tutto sommato_it} var{in generale_it} var{complessivamente_it} var{nell'insieme_it} var{em geral_pt} var{sobretodo_es} var{totalmente_es} var{completamente_es} var{blouse_fr} var{combinaison_fr} var{salopette_fr} var{Overall_de} var{Latzhose_de} var{blusa_it} var{tuta da lavoro_it} var{macacão_pt} var{braga_es} var{mono_es} var{overol_es} var{overall_en}] 'means var{A garment worn over other clothing to protect it; a coverall or boiler suit. A garment, for manual labor or for casual wear, often made of a single piece of fabric, with long legs and a bib upper, supported from the shoulders with straps, and having several large pockets and loops for carrying tools.}\n{A garment, worn for manual labor, with an integral covering extending to the chest, supported by straps.}: put'sense [name: {A garment, worn for manual labor, with an integral covering extending to the chest, supported by straps.}]\n{do_en}: put'word [name: {do}, lang: \"en\"]\n{A syntactic marker.}: put'sense [name: {A syntactic marker.}]\n{A syntactic marker.}: put'sense [name: {A syntactic marker.}]\n[ {_fr}, {_de}, {_it}, {_pt}, {_es} ]: put.many 'word  [ [name:{}, lang:{fr}], [name:{}, lang:{de}], [name:{}, lang:{it}], [name:{}, lang:{pt}], [name:{}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{do_en}] 'means var{A syntactic marker.}\n{A syntactic marker.}: put'sense [name: {A syntactic marker.}]\n[ {schon_de}, {sim_pt}, {sí_es} ]: put.many 'word  [ [name:{schon}, lang:{de}], [name:{sim}, lang:{pt}], [name:{sí}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{do_en}] 'means var{A syntactic marker.}\n{A syntactic marker.}: put'sense [name: {A syntactic marker.}]\n[ {_fr}, {_de}, {_it}, {_pt}, {_es} ]: put.many 'word  [ [name:{}, lang:{fr}], [name:{}, lang:{de}], [name:{}, lang:{it}], [name:{}, lang:{pt}], [name:{}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{do_en}] 'means var{A syntactic marker.}\n{To perform; to execute.}: put'sense [name: {To perform; to execute.}]\n[ {faire_fr}, {tun_de}, {machen_de}, {κάμνω_el}, {κάνω_el}, {fare_it}, {fazer_pt}, {realizar_pt}, {face_ro}, {hacer_es}, {fazer_pt} ]: put.many 'word  [ [name:{faire}, lang:{fr}], [name:{tun}, lang:{de}], [name:{machen}, lang:{de}], [name:{κάμνω}, lang:{el}], [name:{κάνω}, lang:{el}], [name:{fare}, lang:{it}], [name:{fazer}, lang:{pt}], [name:{realizar}, lang:{pt}], [name:{face}, lang:{ro}], [name:{hacer}, lang:{es}], [name:{fazer}, lang:{pt}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{do_en}] 'means var{To perform; to execute.}\n{To cause, make (someone) (do something).}: put'sense [name: {To cause, make (someone) (do something).}]\n{To suffice.}: put'sense [name: {To suffice.}]\n[ {aller_fr}, {reichen_de}, {servir_pt}, {valer_es} ]: put.many 'word  [ [name:{aller}, lang:{fr}], [name:{reichen}, lang:{de}], [name:{servir}, lang:{pt}], [name:{valer}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{do_en}] 'means var{To suffice.}\n{To be reasonable or acceptable.}: put'sense [name: {To be reasonable or acceptable.}]\n[ {aller_fr}, {andare_it}, {servir_pt}, {valer_es} ]: put.many 'word  [ [name:{aller}, lang:{fr}], [name:{andare}, lang:{it}], [name:{servir}, lang:{pt}], [name:{valer}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{do_en}] 'means var{To be reasonable or acceptable.}\n{To have (as an effect).}: put'sense [name: {To have (as an effect).}]\n[ {fazer_pt} ]: put.many 'word  [ [name:{fazer}, lang:{pt}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{do_en}] 'means var{To have (as an effect).}\n{To fare, perform (well or poorly).}: put'sense [name: {To fare, perform (well or poorly).}]\n[ {ir_pt} ]: put.many 'word  [ [name:{ir}, lang:{pt}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{do_en}] 'means var{To fare, perform (well or poorly).}\n{To have as one's job.}: put'sense [name: {To have as one's job.}]\n[ {fazer_pt}, {hacer_es} ]: put.many 'word  [ [name:{fazer}, lang:{pt}], [name:{hacer}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{do_en}] 'means var{To have as one's job.}\n{To perform the tasks or actions associated with (something).}: put'sense [name: {To perform the tasks or actions associated with (something).}]\n{To cook.}: put'sense [name: {To cook.}]\n[ {fazer_pt}, {preparar_pt}, {hacer_es} ]: put.many 'word  [ [name:{fazer}, lang:{pt}], [name:{preparar}, lang:{pt}], [name:{hacer}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{do_en}] 'means var{To cook.}\n{To travel in, to tour, to make a circuit of.}: put'sense [name: {To travel in, to tour, to make a circuit of.}]\n{To treat in a certain way.}: put'sense [name: {To treat in a certain way.}]\n{To work for or on, by way of caring for, looking after, preparing, cleaning, keeping in order, etc.}: put'sense [name: {To work for or on, by way of caring for, looking after, preparing, cleaning, keeping in order, etc.}]\n{To act or behave in a certain manner; to conduct oneself.}: put'sense [name: {To act or behave in a certain manner; to conduct oneself.}]\n{To spend (time) in jail. (See also do time)}: put'sense [name: {To spend (time) in jail. (See also do time)}]\n[ {passar_pt} ]: put.many 'word  [ [name:{passar}, lang:{pt}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{passar_pt} var{do_en}] 'means var{To spend (time) in jail. (See also do time)}\n{To impersonate or depict.}: put'sense [name: {To impersonate or depict.}]\n{To copy or emulate the actions or behaviour that is associated with the person or thing mentioned.}: put'sense [name: {To copy or emulate the actions or behaviour that is associated with the person or thing mentioned.}]\n{To kill.}: put'sense [name: {To kill.}]\n{To deal with for good and all; to finish up; to undo; to ruin; to do for.}: put'sense [name: {To deal with for good and all; to finish up; to undo; to ruin; to do for.}]\n{To punish for a misdemeanor.}: put'sense [name: {To punish for a misdemeanor.}]\n{To have sex with. (See also do it)}: put'sense [name: {To have sex with. (See also do it)}]\n[ {se faire_fr}, {comer_pt}, {coger_es}, {culear_es}, {joder_es} ]: put.many 'word  [ [name:{se faire}, lang:{fr}], [name:{comer}, lang:{pt}], [name:{coger}, lang:{es}], [name:{culear}, lang:{es}], [name:{joder}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{passar_pt} var{se faire_fr} var{comer_pt} var{coger_es} var{culear_es} var{joder_es} var{do_en}] 'means var{To have sex with. (See also do it)}\n{To cheat or swindle.}: put'sense [name: {To cheat or swindle.}]\n{To convert into a certain form; especially, to translate.}: put'sense [name: {To convert into a certain form; especially, to translate.}]\n{To finish.}: put'sense [name: {To finish.}]\n{To work as a domestic servant (with for).}: put'sense [name: {To work as a domestic servant (with for).}]\n{Used to form the present progressive of verbs.}: put'sense [name: {Used to form the present progressive of verbs.}]\n{To cash or to advance money for, as a bill or note.}: put'sense [name: {To cash or to advance money for, as a bill or note.}]\n{To make or provide.}: put'sense [name: {To make or provide.}]\n{To injure (one's own body part).}: put'sense [name: {To injure (one's own body part).}]\n{To take drugs.}: put'sense [name: {To take drugs.}]\n[ {nehmen_de}, {usar_pt} ]: put.many 'word  [ [name:{nehmen}, lang:{de}], [name:{usar}, lang:{pt}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{passar_pt} var{se faire_fr} var{comer_pt} var{coger_es} var{culear_es} var{joder_es} var{nehmen_de} var{usar_pt} var{do_en}] 'means var{To take drugs.}\n{To exist with a purpose or for a reason.}: put'sense [name: {To exist with a purpose or for a reason.}]\n[ {fazer_pt}, {hacer_es} ]: put.many 'word  [ [name:{fazer}, lang:{pt}], [name:{hacer}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{passar_pt} var{se faire_fr} var{comer_pt} var{coger_es} var{culear_es} var{joder_es} var{nehmen_de} var{usar_pt} var{fazer_pt} var{hacer_es} var{do_en}] 'means var{To exist with a purpose or for a reason.}\n{A party, celebration, social function.}: put'sense [name: {A party, celebration, social function.}]\n{A hairdo.}: put'sense [name: {A hairdo.}]\n[ {penteado_pt} ]: put.many 'word  [ [name:{penteado}, lang:{pt}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{passar_pt} var{se faire_fr} var{comer_pt} var{coger_es} var{culear_es} var{joder_es} var{nehmen_de} var{usar_pt} var{fazer_pt} var{hacer_es} var{penteado_pt} var{do_en}] 'means var{A hairdo.}\n{Something that can or should be done (usually in the phrase dos and don'ts).}: put'sense [name: {Something that can or should be done (usually in the phrase dos and don'ts).}]\n{Ado; bustle; stir; to-do; A period of confusion or argument.}: put'sense [name: {Ado; bustle; stir; to-do; A period of confusion or argument.}]\n{A cheat; a swindler.}: put'sense [name: {A cheat; a swindler.}]\n{An act of swindling; a fraud or deception.}: put'sense [name: {An act of swindling; a fraud or deception.}]\n{A syllable used in solfège to represent the first and eighth tonic of a major scale.}: put'sense [name: {A syllable used in solfège to represent the first and eighth tonic of a major scale.}]\n[ {do_fr}, {ντο_el}, {dó_pt}, {do_es} ]: put.many 'word  [ [name:{do}, lang:{fr}], [name:{ντο}, lang:{el}], [name:{dó}, lang:{pt}], [name:{do}, lang:{es}] ]\nlink [var{_fr} var{_de} var{_it} var{_pt} var{_es} var{schon_de} var{sim_pt} var{sí_es} var{_fr} var{_de} var{_it} var{_pt} var{_es} var{faire_fr} var{tun_de} var{machen_de} var{κάμνω_el} var{κάνω_el} var{fare_it} var{fazer_pt} var{realizar_pt} var{face_ro} var{hacer_es} var{fazer_pt} var{aller_fr} var{reichen_de} var{servir_pt} var{valer_es} var{aller_fr} var{andare_it} var{servir_pt} var{valer_es} var{fazer_pt} var{ir_pt} var{fazer_pt} var{hacer_es} var{fazer_pt} var{preparar_pt} var{hacer_es} var{passar_pt} var{se faire_fr} var{comer_pt} var{coger_es} var{culear_es} var{joder_es} var{nehmen_de} var{usar_pt} var{fazer_pt} var{hacer_es} var{penteado_pt} var{do_fr} var{ντο_el} var{dó_pt} var{do_es} var{do_en}] 'means var{A syllable used in solfège to represent the first and eighth tonic of a major scale.}\n{Abbreviation of ditto.}: put'sense [name: {Abbreviation of ditto.}]\n{The cardinal number occurring after el and before do one in a duodecimal system. Written 10, decimal value 12.}: put'sense [name: {The cardinal number occurring after el and before do one in a duodecimal system. Written 10, decimal value 12.}]\n{literature_en}: put'word [name: {literature}, lang: \"en\"]\n{The body of all written works.}: put'sense [name: {The body of all written works.}]\n[ {littérature_fr}, {Literatur_de}, {λογοτεχνία_el}, {βιβλιογραφία_el}, {letteratura_it}, {literatura_pt}, {literatură_ro}, {literatura_es} ]: put.many 'word  [ [name:{littérature}, lang:{fr}], [name:{Literatur}, lang:{de}], [name:{λογοτεχνία}, lang:{el}], [name:{βιβλιογραφία}, lang:{el}], [name:{letteratura}, lang:{it}], [name:{literatura}, lang:{pt}], [name:{literatură}, lang:{ro}], [name:{literatura}, lang:{es}] ]\nlink [var{littérature_fr} var{Literatur_de} var{λογοτεχνία_el} var{βιβλιογραφία_el} var{letteratura_it} var{literatura_pt} var{literatură_ro} var{literatura_es} var{literature_en}] 'means var{The body of all written works.}\n{The collected creative writing of a nation, people, group, or culture.}: put'sense [name: {The collected creative writing of a nation, people, group, or culture.}]\n[ {literatura_pt}, {literatura_es} ]: put.many 'word  [ [name:{literatura}, lang:{pt}], [name:{literatura}, lang:{es}] ]\nlink [var{littérature_fr} var{Literatur_de} var{λογοτεχνία_el} var{βιβλιογραφία_el} var{letteratura_it} var{literatura_pt} var{literatură_ro} var{literatura_es} var{literatura_pt} var{literatura_es} var{literature_en}] 'means var{The collected creative writing of a nation, people, group, or culture.}\n{All the papers, treatises, etc. published in academic journals on a particular subject.}: put'sense [name: {All the papers, treatises, etc. published in academic journals on a particular subject.}]\n[ {littérature_fr}, {letteratura_it}, {literatura_pt}, {literatura_es} ]: put.many 'word  [ [name:{littérature}, lang:{fr}], [name:{letteratura}, lang:{it}], [name:{literatura}, lang:{pt}], [name:{literatura}, lang:{es}] ]\nlink [var{littérature_fr} var{Literatur_de} var{λογοτεχνία_el} var{βιβλιογραφία_el} var{letteratura_it} var{literatura_pt} var{literatură_ro} var{literatura_es} var{literatura_pt} var{literatura_es} var{littérature_fr} var{letteratura_it} var{literatura_pt} var{literatura_es} var{literature_en}] 'means var{All the papers, treatises, etc. published in academic journals on a particular subject.}\n{Written fiction of a high standard.}: put'sense [name: {Written fiction of a high standard.}]\n{sufficient_en}: put'word [name: {sufficient}, lang: \"en\"]\n{An adequate quantity of; enough.}: put'sense [name: {An adequate quantity of; enough.}]\n{A quantity (of something) that is as large as is needed.}: put'sense [name: {A quantity (of something) that is as large as is needed.}]\n{Of a type or kind that suffices, that satisfies requirements or needs.}: put'sense [name: {Of a type or kind that suffices, that satisfies requirements or needs.}]\n{Possessing adequate talents or accomplishments; of competent power or ability; qualified; fit.}: put'sense [name: {Possessing adequate talents or accomplishments; of competent power or ability; qualified; fit.}]\n[ {appropriato_it}, {suficiente_pt}, {autosuffisant_fr}, {autosufficiente_it} ]: put.many 'word  [ [name:{appropriato}, lang:{it}], [name:{suficiente}, lang:{pt}], [name:{autosuffisant}, lang:{fr}], [name:{autosufficiente}, lang:{it}] ]\nlink [var{appropriato_it} var{suficiente_pt} var{autosuffisant_fr} var{autosufficiente_it} var{sufficient_en}] 'means var{Possessing adequate talents or accomplishments; of competent power or ability; qualified; fit.}\n{Capable of meeting obligations; responsible.}: put'sense [name: {Capable of meeting obligations; responsible.}]\n[ {idoneo_it} ]: put.many 'word  [ [name:{idoneo}, lang:{it}] ]\nlink [var{appropriato_it} var{suficiente_pt} var{autosuffisant_fr} var{autosufficiente_it} var{idoneo_it} var{sufficient_en}] 'means var{Capable of meeting obligations; responsible.}\n{Having enough money to meet obligations and live comfortably.}: put'sense [name: {Having enough money to meet obligations and live comfortably.}]\n{modernism_en}: put'word [name: {modernism}, lang: \"en\"]\n{Modern or contemporary ideas, thought, practices, etc.}: put'sense [name: {Modern or contemporary ideas, thought, practices, etc.}]\n{Anything that is characteristic of modernity.}: put'sense [name: {Anything that is characteristic of modernity.}]\n{Any of several styles of art, architecture, literature, philosophy, etc., that flourished in the 20th century.}: put'sense [name: {Any of several styles of art, architecture, literature, philosophy, etc., that flourished in the 20th century.}]\n[ {modernisme_fr}, {Modernismus_de}, {νεωτερισμός_el}, {modernismo_it}, {modernismo_pt}, {modernismo_es} ]: put.many 'word  [ [name:{modernisme}, lang:{fr}], [name:{Modernismus}, lang:{de}], [name:{νεωτερισμός}, lang:{el}], [name:{modernismo}, lang:{it}], [name:{modernismo}, lang:{pt}], [name:{modernismo}, lang:{es}] ]\nlink [var{modernisme_fr} var{Modernismus_de} var{νεωτερισμός_el} var{modernismo_it} var{modernismo_pt} var{modernismo_es} var{modernism_en}] 'means var{Any of several styles of art, architecture, literature, philosophy, etc., that flourished in the 20th century.}\n{A religious movement in the early 20th century that tried to reconcile Roman Catholic dogma with modern science and philosophy.}: put'sense [name: {A religious movement in the early 20th century that tried to reconcile Roman Catholic dogma with modern science and philosophy.}]\n{midnight_en}: put'word [name: {midnight}, lang: \"en\"]\n{The middle of the night: the sixth temporal hour, equidistant between sunset and sunrise.}: put'sense [name: {The middle of the night: the sixth temporal hour, equidistant between sunset and sunrise.}]\n[ {medianoche_es}, {madrugada_es} ]: put.many 'word  [ [name:{medianoche}, lang:{es}], [name:{madrugada}, lang:{es}] ]\nlink [var{medianoche_es} var{madrugada_es} var{midnight_en}] 'means var{The middle of the night: the sixth temporal hour, equidistant between sunset and sunrise.}\n{Twelve o'clock at night exactly.}: put'sense [name: {Twelve o'clock at night exactly.}]\n[ {minuit_fr}, {Mitternacht_de}, {μεσάνυχτα_el}, {mezzanotte_it}, {meia-noite_pt}, {miezul nopții_ro}, {miez de noapte_ro}, {mijloc de noapte_ro}, {medianoche_es} ]: put.many 'word  [ [name:{minuit}, lang:{fr}], [name:{Mitternacht}, lang:{de}], [name:{μεσάνυχτα}, lang:{el}], [name:{mezzanotte}, lang:{it}], [name:{meia-noite}, lang:{pt}], [name:{miezul nopții}, lang:{ro}], [name:{miez de noapte}, lang:{ro}], [name:{mijloc de noapte}, lang:{ro}], [name:{medianoche}, lang:{es}] ]\nlink [var{medianoche_es} var{madrugada_es} var{minuit_fr} var{Mitternacht_de} var{μεσάνυχτα_el} var{mezzanotte_it} var{meia-noite_pt} var{miezul nopții_ro} var{miez de noapte_ro} var{mijloc de noapte_ro} var{medianoche_es} var{midnight_en}] 'means var{Twelve o'clock at night exactly.}\n{boxcars}: put'sense [name: {boxcars}]\n{Utterly dark or black.}: put'sense [name: {Utterly dark or black.}]\n{able_en}: put'word [name: {able}, lang: \"en\"]\n{Having the necessary powers or the needed resources to accomplish a task.}: put'sense [name: {Having the necessary powers or the needed resources to accomplish a task.}]\n{Free from constraints preventing completion of task; permitted to; not prevented from.}: put'sense [name: {Free from constraints preventing completion of task; permitted to; not prevented from.}]\n[ {capable_fr}, {imstande_de}, {fähig_de}, {δυνάμενος_el}, {μπορώ να_el}, {είμαι ικανός να_el}, {capace_it}, {possível_pt}, {permitido_pt}, {capaz_es} ]: put.many 'word  [ [name:{capable}, lang:{fr}], [name:{imstande}, lang:{de}], [name:{fähig}, lang:{de}], [name:{δυνάμενος}, lang:{el}], [name:{μπορώ να}, lang:{el}], [name:{είμαι ικανός να}, lang:{el}], [name:{capace}, lang:{it}], [name:{possível}, lang:{pt}], [name:{permitido}, lang:{pt}], [name:{capaz}, lang:{es}] ]\nlink [var{capable_fr} var{imstande_de} var{fähig_de} var{δυνάμενος_el} var{μπορώ να_el} var{είμαι ικανός να_el} var{capace_it} var{possível_pt} var{permitido_pt} var{capaz_es} var{able_en}] 'means var{Free from constraints preventing completion of task; permitted to; not prevented from.}\n{Gifted with skill, intelligence, knowledge, or competence.}: put'sense [name: {Gifted with skill, intelligence, knowledge, or competence.}]\n[ {capable_fr}, {expérimenté_fr}, {fähig_de}, {tüchtig_de}, {ικανός_el}, {abile_it}, {capaz_pt}, {abil_ro}, {capabil_ro}, {diestro_es}, {hábil_es}, {capaz_es} ]: put.many 'word  [ [name:{capable}, lang:{fr}], [name:{expérimenté}, lang:{fr}], [name:{fähig}, lang:{de}], [name:{tüchtig}, lang:{de}], [name:{ικανός}, lang:{el}], [name:{abile}, lang:{it}], [name:{capaz}, lang:{pt}], [name:{abil}, lang:{ro}], [name:{capabil}, lang:{ro}], [name:{diestro}, lang:{es}], [name:{hábil}, lang:{es}], [name:{capaz}, lang:{es}] ]\nlink [var{capable_fr} var{imstande_de} var{fähig_de} var{δυνάμενος_el} var{μπορώ να_el} var{είμαι ικανός να_el} var{capace_it} var{possível_pt} var{permitido_pt} var{capaz_es} var{capable_fr} var{expérimenté_fr} var{fähig_de} var{tüchtig_de} var{ικανός_el} var{abile_it} var{capaz_pt} var{abil_ro} var{capabil_ro} var{diestro_es} var{hábil_es} var{capaz_es} var{able_en}] 'means var{Gifted with skill, intelligence, knowledge, or competence.}\n{Legally qualified or competent.}: put'sense [name: {Legally qualified or competent.}]\n[ {habilité_fr}, {kompetent_de}, {αρτιμελής_el}, {έχων σώας τας φρένας_el}, {competente_pt}, {abilitat_ro}, {competent_ro}, {competente_es} ]: put.many 'word  [ [name:{habilité}, lang:{fr}], [name:{kompetent}, lang:{de}], [name:{αρτιμελής}, lang:{el}], [name:{έχων σώας τας φρένας}, lang:{el}], [name:{competente}, lang:{pt}], [name:{abilitat}, lang:{ro}], [name:{competent}, lang:{ro}], [name:{competente}, lang:{es}] ]\nlink [var{capable_fr} var{imstande_de} var{fähig_de} var{δυνάμενος_el} var{μπορώ να_el} var{είμαι ικανός να_el} var{capace_it} var{possível_pt} var{permitido_pt} var{capaz_es} var{capable_fr} var{expérimenté_fr} var{fähig_de} var{tüchtig_de} var{ικανός_el} var{abile_it} var{capaz_pt} var{abil_ro} var{capabil_ro} var{diestro_es} var{hábil_es} var{capaz_es} var{habilité_fr} var{kompetent_de} var{αρτιμελής_el} var{έχων σώας τας φρένας_el} var{competente_pt} var{abilitat_ro} var{competent_ro} var{competente_es} var{able_en}] 'means var{Legally qualified or competent.}\n{Capable of performing all the requisite duties; as an able seaman.}: put'sense [name: {Capable of performing all the requisite duties; as an able seaman.}]\n{Having the physical strength; robust; healthy.}: put'sense [name: {Having the physical strength; robust; healthy.}]\n{Easy to use.}: put'sense [name: {Easy to use.}]\n{Suitable; competent.}: put'sense [name: {Suitable; competent.}]\n{Liable to.}: put'sense [name: {Liable to.}]\n{Rich; well-to-do.}: put'sense [name: {Rich; well-to-do.}]\n{To make ready.}: put'sense [name: {To make ready.}]\n{To make capable; to enable.}: put'sense [name: {To make capable; to enable.}]\n{To dress.}: put'sense [name: {To dress.}]\n{To give power to; to reinforce; to confirm.}: put'sense [name: {To give power to; to reinforce; to confirm.}]\n{To vouch for; to guarantee.}: put'sense [name: {To vouch for; to guarantee.}]\n{The letter \"A\" in Navy Phonetic Alphabet.}: put'sense [name: {The letter \"A\" in Navy Phonetic Alphabet.}]\n{signal_en}: put'word [name: {signal}, lang: \"en\"]\n{A sequence of states representing an encoded message in a communication channel.}: put'sense [name: {A sequence of states representing an encoded message in a communication channel.}]\n{Any variation of a quantity or change in an entity over time that conveys information upon detection.}: put'sense [name: {Any variation of a quantity or change in an entity over time that conveys information upon detection.}]\n{A sign made to give notice of some occurrence, command, or danger, or to indicate the start of a concerted action.}: put'sense [name: {A sign made to give notice of some occurrence, command, or danger, or to indicate the start of a concerted action.}]\n[ {signal_fr}, {Signal_de}, {σήμα_el}, {segnale_it}, {sinal_pt}, {semnal_ro}, {señal_es} ]: put.many 'word  [ [name:{signal}, lang:{fr}], [name:{Signal}, lang:{de}], [name:{σήμα}, lang:{el}], [name:{segnale}, lang:{it}], [name:{sinal}, lang:{pt}], [name:{semnal}, lang:{ro}], [name:{señal}, lang:{es}] ]\nlink [var{signal_fr} var{Signal_de} var{σήμα_el} var{segnale_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{signal_en}] 'means var{A sign made to give notice of some occurrence, command, or danger, or to indicate the start of a concerted action.}\n{An on-off light, semaphore, or other device used to give an indication to another person.}: put'sense [name: {An on-off light, semaphore, or other device used to give an indication to another person.}]\n{An electromagnetic action, normally a voltage that is a function of time, that conveys the information of the radio or TV program or of communication with another party.}: put'sense [name: {An electromagnetic action, normally a voltage that is a function of time, that conveys the information of the radio or TV program or of communication with another party.}]\n[ {segnale_it}, {campo_it}, {sinal_pt}, {semnal_ro}, {señal_es} ]: put.many 'word  [ [name:{segnale}, lang:{it}], [name:{campo}, lang:{it}], [name:{sinal}, lang:{pt}], [name:{semnal}, lang:{ro}], [name:{señal}, lang:{es}] ]\nlink [var{signal_fr} var{Signal_de} var{σήμα_el} var{segnale_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{segnale_it} var{campo_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{signal_en}] 'means var{An electromagnetic action, normally a voltage that is a function of time, that conveys the information of the radio or TV program or of communication with another party.}\n{An action, change or process done to convey information and thus reduce uncertainty.}: put'sense [name: {An action, change or process done to convey information and thus reduce uncertainty.}]\n{A token; an indication; a foreshadowing; a sign.}: put'sense [name: {A token; an indication; a foreshadowing; a sign.}]\n[ {sinal_pt} ]: put.many 'word  [ [name:{sinal}, lang:{pt}] ]\nlink [var{signal_fr} var{Signal_de} var{σήμα_el} var{segnale_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{segnale_it} var{campo_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{sinal_pt} var{signal_en}] 'means var{A token; an indication; a foreshadowing; a sign.}\n{Useful information, as opposed to noise.}: put'sense [name: {Useful information, as opposed to noise.}]\n[ {sinal_pt} ]: put.many 'word  [ [name:{sinal}, lang:{pt}] ]\nlink [var{signal_fr} var{Signal_de} var{σήμα_el} var{segnale_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{segnale_it} var{campo_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{sinal_pt} var{sinal_pt} var{signal_en}] 'means var{Useful information, as opposed to noise.}\n{A simple interprocess communication used to notify a process or thread of an occurrence.}: put'sense [name: {A simple interprocess communication used to notify a process or thread of an occurrence.}]\n[ {signal_fr} ]: put.many 'word  [ [name:{signal}, lang:{fr}] ]\nlink [var{signal_fr} var{Signal_de} var{σήμα_el} var{segnale_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{segnale_it} var{campo_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{sinal_pt} var{sinal_pt} var{signal_fr} var{signal_en}] 'means var{A simple interprocess communication used to notify a process or thread of an occurrence.}\n{A signalling interaction between cells}: put'sense [name: {A signalling interaction between cells}]\n{To indicate; to convey or communicate by a signal.}: put'sense [name: {To indicate; to convey or communicate by a signal.}]\n[ {signaler_fr}, {signalisieren_de}, {segnalare_it}, {indicare_it}, {señalar_es} ]: put.many 'word  [ [name:{signaler}, lang:{fr}], [name:{signalisieren}, lang:{de}], [name:{segnalare}, lang:{it}], [name:{indicare}, lang:{it}], [name:{señalar}, lang:{es}] ]\nlink [var{signal_fr} var{Signal_de} var{σήμα_el} var{segnale_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{segnale_it} var{campo_it} var{sinal_pt} var{semnal_ro} var{señal_es} var{sinal_pt} var{sinal_pt} var{signal_fr} var{signaler_fr} var{signalisieren_de} var{segnalare_it} var{indicare_it} var{señalar_es} var{signal_en}] 'means var{To indicate; to convey or communicate by a signal.}\n{To communicate with (a person or system) by a signal.}: put'sense [name: {To communicate with (a person or system) by a signal.}]\n{Standing above others in rank, importance, or achievement.}: put'sense [name: {Standing above others in rank, importance, or achievement.}]\n{weapon_en}: put'word [name: {weapon}, lang: \"en\"]\n{An instrument of attack or defense in combat or hunting, e.g. most guns, missiles, or swords; arm.}: put'sense [name: {An instrument of attack or defense in combat or hunting, e.g. most guns, missiles, or swords; arm.}]\n[ {arme_fr}, {Waffe_de}, {όπλο_el}, {arma_it}, {arma_pt}, {armă_ro}, {arma_es} ]: put.many 'word  [ [name:{arme}, lang:{fr}], [name:{Waffe}, lang:{de}], [name:{όπλο}, lang:{el}], [name:{arma}, lang:{it}], [name:{arma}, lang:{pt}], [name:{armă}, lang:{ro}], [name:{arma}, lang:{es}] ]\nlink [var{arme_fr} var{Waffe_de} var{όπλο_el} var{arma_it} var{arma_pt} var{armă_ro} var{arma_es} var{weapon_en}] 'means var{An instrument of attack or defense in combat or hunting, e.g. most guns, missiles, or swords; arm.}\n{An instrument or other means of harming or exerting control over another.}: put'sense [name: {An instrument or other means of harming or exerting control over another.}]\n[ {όπλο_el} ]: put.many 'word  [ [name:{όπλο}, lang:{el}] ]\nlink [var{arme_fr} var{Waffe_de} var{όπλο_el} var{arma_it} var{arma_pt} var{armă_ro} var{arma_es} var{όπλο_el} var{weapon_en}] 'means var{An instrument or other means of harming or exerting control over another.}\n{A tool of any kind.}: put'sense [name: {A tool of any kind.}]\n{An idiot, an oaf, a fool, a tool; a contemptible or incompetent person.}: put'sense [name: {An idiot, an oaf, a fool, a tool; a contemptible or incompetent person.}]\n{Any very skilled, competent, or capable person or thing worthy of awe.}: put'sense [name: {Any very skilled, competent, or capable person or thing worthy of awe.}]\n{To equip with a weapon; to arm.}: put'sense [name: {To equip with a weapon; to arm.}]\n{devastation_en}: put'word [name: {devastation}, lang: \"en\"]\n{The act of devastating, or the state of being devastated; a laying waste.}: put'sense [name: {The act of devastating, or the state of being devastated; a laying waste.}]\n[ {dévastation_fr}, {Verwüstung_de}, {Zerstörung_de}, {αφανισμός_el}, {συντριβή_el}, {καταστροφή_el}, {devastação_pt}, {devastare_ro}, {devastación_es}, {asolamiento_es}, {arrasamiento_es}, {quebranto_es} ]: put.many 'word  [ [name:{dévastation}, lang:{fr}], [name:{Verwüstung}, lang:{de}], [name:{Zerstörung}, lang:{de}], [name:{αφανισμός}, lang:{el}], [name:{συντριβή}, lang:{el}], [name:{καταστροφή}, lang:{el}], [name:{devastação}, lang:{pt}], [name:{devastare}, lang:{ro}], [name:{devastación}, lang:{es}], [name:{asolamiento}, lang:{es}], [name:{arrasamiento}, lang:{es}], [name:{quebranto}, lang:{es}] ]\nlink [var{dévastation_fr} var{Verwüstung_de} var{Zerstörung_de} var{αφανισμός_el} var{συντριβή_el} var{καταστροφή_el} var{devastação_pt} var{devastare_ro} var{devastación_es} var{asolamiento_es} var{arrasamiento_es} var{quebranto_es} var{devastation_en}] 'means var{The act of devastating, or the state of being devastated; a laying waste.}\n{Waste or misapplication of the assets of a deceased person by an executor or administrator; devastavit.}: put'sense [name: {Waste or misapplication of the assets of a deceased person by an executor or administrator; devastavit.}]\n{solidary_en}: put'word [name: {solidary}, lang: \"en\"]\n{Having community of interests and responsibilities.}: put'sense [name: {Having community of interests and responsibilities.}]\n{itself_en}: put'word [name: {itself}, lang: \"en\"]\n{it; A thing as the object of a verb or preposition that also appears as the subject}: put'sense [name: {it; A thing as the object of a verb or preposition that also appears as the subject}]\n[ {se_fr}, {von selbst_de}, {von allein_de}, {selbst_de}, {sich selbst_de}, {sé_it}, {se_pt}, {a si mesmo_pt}, {se_es}, {solo_es}, {a si mismo_es}, {por si mismo_es} ]: put.many 'word  [ [name:{se}, lang:{fr}], [name:{von selbst}, lang:{de}], [name:{von allein}, lang:{de}], [name:{selbst}, lang:{de}], [name:{sich selbst}, lang:{de}], [name:{sé}, lang:{it}], [name:{se}, lang:{pt}], [name:{a si mesmo}, lang:{pt}], [name:{se}, lang:{es}], [name:{solo}, lang:{es}], [name:{a si mismo}, lang:{es}], [name:{por si mismo}, lang:{es}] ]\nlink [var{se_fr} var{von selbst_de} var{von allein_de} var{selbst_de} var{sich selbst_de} var{sé_it} var{se_pt} var{a si mesmo_pt} var{se_es} var{solo_es} var{a si mismo_es} var{por si mismo_es} var{itself_en}] 'means var{it; A thing as the object of a verb or preposition that also appears as the subject}\n{it; used to intensify the subject, especially to emphasize that it is the only participant in the predicate}: put'sense [name: {it; used to intensify the subject, especially to emphasize that it is the only participant in the predicate}]\n[ {soi-même_fr}, {se stesso_it}, {sé stesso_it}, {ele/ela mesmo_pt}, {próprio_pt}, {própria_pt}, {sí mismo_es}, {mismo_es} ]: put.many 'word  [ [name:{soi-même}, lang:{fr}], [name:{se stesso}, lang:{it}], [name:{sé stesso}, lang:{it}], [name:{ele/ela mesmo}, lang:{pt}], [name:{próprio}, lang:{pt}], [name:{própria}, lang:{pt}], [name:{sí mismo}, lang:{es}], [name:{mismo}, lang:{es}] ]\nlink [var{se_fr} var{von selbst_de} var{von allein_de} var{selbst_de} var{sich selbst_de} var{sé_it} var{se_pt} var{a si mesmo_pt} var{se_es} var{solo_es} var{a si mismo_es} var{por si mismo_es} var{soi-même_fr} var{se stesso_it} var{sé stesso_it} var{ele/ela mesmo_pt} var{próprio_pt} var{própria_pt} var{sí mismo_es} var{mismo_es} var{itself_en}] 'means var{it; used to intensify the subject, especially to emphasize that it is the only participant in the predicate}\n{it; used to refer back to an earlier subject}: put'sense [name: {it; used to refer back to an earlier subject}]\n{audience_en}: put'word [name: {audience}, lang: \"en\"]\n{A group of people within hearing; specifically, a large gathering of people listening to or watching a performance, speech, etc.}: put'sense [name: {A group of people within hearing; specifically, a large gathering of people listening to or watching a performance, speech, etc.}]\n[ {assistance_fr}, {public_fr}, {auditoire_fr}, {Publikum_de}, {Zuschauer_de}, {Audienzen_de}, {ακροατήριο_el}, {κοινό_el}, {pubblico_it}, {uditorio_it}, {público_pt}, {plateia_pt}, {asistență_ro}, {audiencia_es}, {público_es} ]: put.many 'word  [ [name:{assistance}, lang:{fr}], [name:{public}, lang:{fr}], [name:{auditoire}, lang:{fr}], [name:{Publikum}, lang:{de}], [name:{Zuschauer}, lang:{de}], [name:{Audienzen}, lang:{de}], [name:{ακροατήριο}, lang:{el}], [name:{κοινό}, lang:{el}], [name:{pubblico}, lang:{it}], [name:{uditorio}, lang:{it}], [name:{público}, lang:{pt}], [name:{plateia}, lang:{pt}], [name:{asistență}, lang:{ro}], [name:{audiencia}, lang:{es}], [name:{público}, lang:{es}] ]\nlink [var{assistance_fr} var{public_fr} var{auditoire_fr} var{Publikum_de} var{Zuschauer_de} var{Audienzen_de} var{ακροατήριο_el} var{κοινό_el} var{pubblico_it} var{uditorio_it} var{público_pt} var{plateia_pt} var{asistență_ro} var{audiencia_es} var{público_es} var{audience_en}] 'means var{A group of people within hearing; specifically, a large gathering of people listening to or watching a performance, speech, etc.}\n{Hearing; the condition or state of hearing or listening.}: put'sense [name: {Hearing; the condition or state of hearing or listening.}]\n{A widespread or nationwide viewing or listening public, as of a TV or radio network or program.}: put'sense [name: {A widespread or nationwide viewing or listening public, as of a TV or radio network or program.}]\n{A formal meeting with a state or religious dignitary.}: put'sense [name: {A formal meeting with a state or religious dignitary.}]\n[ {audience_fr}, {Audienz_de}, {ακρόαση_el}, {udienza_it}, {audiência_pt}, {audiență_ro}, {audiencia_es} ]: put.many 'word  [ [name:{audience}, lang:{fr}], [name:{Audienz}, lang:{de}], [name:{ακρόαση}, lang:{el}], [name:{udienza}, lang:{it}], [name:{audiência}, lang:{pt}], [name:{audiență}, lang:{ro}], [name:{audiencia}, lang:{es}] ]\nlink [var{assistance_fr} var{public_fr} var{auditoire_fr} var{Publikum_de} var{Zuschauer_de} var{Audienzen_de} var{ακροατήριο_el} var{κοινό_el} var{pubblico_it} var{uditorio_it} var{público_pt} var{plateia_pt} var{asistență_ro} var{audiencia_es} var{público_es} var{audience_fr} var{Audienz_de} var{ακρόαση_el} var{udienza_it} var{audiência_pt} var{audiență_ro} var{audiencia_es} var{audience_en}] 'means var{A formal meeting with a state or religious dignitary.}\n{The readership of a book or other written publication.}: put'sense [name: {The readership of a book or other written publication.}]\n[ {lectorat_fr}, {Publikum_de}, {κοινό_el}, {pubblico_it}, {público_pt}, {público-alvo_pt}, {leitorado_pt}, {público_es} ]: put.many 'word  [ [name:{lectorat}, lang:{fr}], [name:{Publikum}, lang:{de}], [name:{κοινό}, lang:{el}], [name:{pubblico}, lang:{it}], [name:{público}, lang:{pt}], [name:{público-alvo}, lang:{pt}], [name:{leitorado}, lang:{pt}], [name:{público}, lang:{es}] ]\nlink [var{assistance_fr} var{public_fr} var{auditoire_fr} var{Publikum_de} var{Zuschauer_de} var{Audienzen_de} var{ακροατήριο_el} var{κοινό_el} var{pubblico_it} var{uditorio_it} var{público_pt} var{plateia_pt} var{asistență_ro} var{audiencia_es} var{público_es} var{audience_fr} var{Audienz_de} var{ακρόαση_el} var{udienza_it} var{audiência_pt} var{audiență_ro} var{audiencia_es} var{lectorat_fr} var{Publikum_de} var{κοινό_el} var{pubblico_it} var{público_pt} var{público-alvo_pt} var{leitorado_pt} var{público_es} var{audience_en}] 'means var{The readership of a book or other written publication.}\n{A following.}: put'sense [name: {A following.}]\n[ {κοινό_el}, {público_pt}, {audiencia_es} ]: put.many 'word  [ [name:{κοινό}, lang:{el}], [name:{público}, lang:{pt}], [name:{audiencia}, lang:{es}] ]\nlink [var{assistance_fr} var{public_fr} var{auditoire_fr} var{Publikum_de} var{Zuschauer_de} var{Audienzen_de} var{ακροατήριο_el} var{κοινό_el} var{pubblico_it} var{uditorio_it} var{público_pt} var{plateia_pt} var{asistență_ro} var{audiencia_es} var{público_es} var{audience_fr} var{Audienz_de} var{ακρόαση_el} var{udienza_it} var{audiência_pt} var{audiență_ro} var{audiencia_es} var{lectorat_fr} var{Publikum_de} var{κοινό_el} var{pubblico_it} var{público_pt} var{público-alvo_pt} var{leitorado_pt} var{público_es} var{κοινό_el} var{público_pt} var{audiencia_es} var{audience_en}] 'means var{A following.}\n{An audiencia (judicial court of the Spanish empire), or the territory administered by it.}: put'sense [name: {An audiencia (judicial court of the Spanish empire), or the territory administered by it.}]\n{diary_en}: put'word [name: {diary}, lang: \"en\"]\n{A daily log of experiences, especially those of the writer.}: put'sense [name: {A daily log of experiences, especially those of the writer.}]\n[ {journal intime_fr}, {Tagebuch_de}, {ημερολόγιο_el}, {diario_it}, {diário_pt}, {jurnal intim_ro}, {diario_es} ]: put.many 'word  [ [name:{journal intime}, lang:{fr}], [name:{Tagebuch}, lang:{de}], [name:{ημερολόγιο}, lang:{el}], [name:{diario}, lang:{it}], [name:{diário}, lang:{pt}], [name:{jurnal intim}, lang:{ro}], [name:{diario}, lang:{es}] ]\nlink [var{journal intime_fr} var{Tagebuch_de} var{ημερολόγιο_el} var{diario_it} var{diário_pt} var{jurnal intim_ro} var{diario_es} var{diary_en}] 'means var{A daily log of experiences, especially those of the writer.}\n{A personal organizer or appointment diary.}: put'sense [name: {A personal organizer or appointment diary.}]\n{Lasting for one day.}: put'sense [name: {Lasting for one day.}]\n{To keep a diary or journal.}: put'sense [name: {To keep a diary or journal.}]\n        ]\n\n        preview fetch 'word ø\n    ]\n]"
  },
  {
    "path": "examples/sample2.art",
    "content": "do.import {grafito.art}\n\ndo [ graph.create \"sample2\" [\n    honorEnN: put'Pos [p:\"noun\"]\n    honorEsN: put'Pos [p:\"noun\"]\n    dishonorEnN: put'Pos [p:\"noun\"]\n\n    tokenS: put'Sense [s:\"token of praise or respect\"]\n\n    link'has (put'Lemma [w:\"honor\" l:\"en\"]) honorEnN\n    link'has (put'Lemma [w:\"honor\" l:\"es\"]) honorEsN\n    link'has (put'Lemma [w:\"dishonor\" l:\"en\"]) dishonorEnN\n\n    link'means honorEnN tokenS\n    link'means honorEsN tokenS\n\n    link'antonym dishonorEnN honorEnN\n\n    preview fetch 'Pos ø\n]]"
  },
  {
    "path": "examples/sample3.art",
    "content": "do.import {grafito.art}\n\ndo [\n    graph.create \"sample3\" [\n        nick: put'person [name: \"Nick\", sex: \"m\", birth: 1957]\n        eleftheria: put'person [name: \"Eleftheria\", sex: \"f\", birth: 1960]\n        angela: put'person [name: \"Angela\", sex: \"f\", birth: 1999]\n        john: put'person [name: \"John\", sex: \"m\", birth: 1986]\n        \n        niovi: put'person [name: \"Niovi\", sex: \"f\", birth: 1928]\n        johnA: put'person [name: \"John\", sex: \"m\", birth: 1933]\n\n        tatie: put'person [name: \"Tatie\", sex: \"m\", birth: 1958]\n\n        spaghetti: put'food [name: \"Spaghetti\"]\n        pizza: put'food [name: \"Pizza\"]\n        steak: put'food [name: \"Steak\"]\n\n        link'marriedTo nick eleftheria\n        link'marriedTo johnA niovi\n\n        link'childOf @[angela john] @[nick eleftheria]\n        link'childOf @[nick tatie] @[johnA niovi]\n\n        link'likes @[john angela niovi] @[spaghetti]\n        link'likes @[eleftheria johnA nick] @[pizza]\n        link'likes @[john tatie nick] @[steak]\n\n        preview fetch 'person ø\n    ]\n]"
  },
  {
    "path": "examples/sample4.art",
    "content": ";---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\ndo.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample4\"\n    ;---------------------------------------------\n    graph.create \"sample4\" [\n\n        ;---------------------------------------------\n        ; Populate the database\n        ;---------------------------------------------\n\n        uk: put'country [name: \"United Kingdom\"]\n        au: put'country [name: \"Australia\"]\n        us: put'country [name: \"United States\"] \n        ca: put'country [name: \"Canada\"]\n\n        nolan:    put'person [name: \"Christopher Nolan\" birthday: 1970 sex: \"m\"]\n        pearce:   put'person [name: \"Guy Pearce\" birthday: 1967 sex: \"m\"]\n        hanson:   put'person [name: \"Curtis Hanson\" birthday: 1945 sex: \"m\"]\n        spacey:   put'person [name: \"Kevin Spacey\" birthday: 1959 sex: \"m\"]\n        dicaprio: put'person [name: \"Leonardo DiCaprio\" birthday: 1974 sex: \"m\"]\n        moss:     put'person [name: \"Carrie-Ann Moss\" birthday: 1967 sex: \"f\"]\n\n        wach1: put'person [name: \"Lana Wachowski\" birthday: 1965 sex: \"f\"]\n        wach2: put'person [name: \"Lilly Wachowski\" birthday: 1967 sex: \"f\"]\n\n        memento:         put'movie [title: \"Memento\" year: 2000]\n        inception:       put'movie [title: \"Inception\" year: 2010]\n        laconfidential:  put'movie [title: \"L.A. Confidential\" year: 1997]\n        matrix:          put'movie [title: \"The Matrix\" year: 1999]\n\n        ;---------------------------------------------\n        ; Define the relationships\n        ; between our nodes\n        ;---------------------------------------------\n\n        link'isFrom nolan uk\n        link'isFrom pearce au\n        link'isFrom @[hanson spacey dicaprio wach1 wach2] us\n        link'isFrom moss ca\n\n        link'directed nolan @[memento inception]\n        link'directed hanson laconfidential\n        link'directed @[wach1 wach2] matrix\n\n        link'actedIn pearce @[memento laconfidential]\n        link'actedIn spacey laconfidential\n        link'actedIn dicaprio inception\n        link'actedIn moss @[memento matrix]\n\n        ;---------------------------------------------\n        ; Fetch every \"person\" &\n        ; open the Desktop app for visualization\n        ;---------------------------------------------\n        \n        preview fetch 'person ø\n    ]\n]"
  },
  {
    "path": "examples/sample4b.art",
    "content": ";---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\ndo.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample4\"\n    ;---------------------------------------------\n    graph.create \"sample4b\" [\n        ;---------------------\n        ; HELPERS\n        ;---------------------\n        \n        country: function [block] -> put 'country block\n        person: function [block] -> put 'person block\n        movie: function [block] -> put 'movie block\n\n        country?: function [block] -> fetch 'country block\n        person?: function [block] -> fetch 'person block\n        movie?: function [block] -> fetch 'movie block\n\n        ;---------------------------------------------\n        ; Populate the database\n        ;---------------------------------------------\n\n        uk: country [name: \"United Kingdom\"]\n        au: country [name: \"Australia\"]\n        us: country [name: \"United States\"] \n        ca: country [name: \"Canada\"]\n\n        nolan:    person [name: \"Christopher Nolan\" birthday: 1970 sex: \"m\"]\n        pearce:   person [name: \"Guy Pearce\" birthday: 1967 sex: \"m\"]\n        hanson:   person [name: \"Curtis Hanson\" birthday: 1945 sex: \"m\"]\n        spacey:   person [name: \"Kevin Spacey\" birthday: 1959 sex: \"m\"]\n        dicaprio: person [name: \"Leonardo DiCaprio\" birthday: 1974 sex: \"m\"]\n        moss:     person [name: \"Carrie-Ann Moss\" birthday: 1967 sex: \"f\"]\n\n        wach1: person [name: \"Lana Wachowski\" birthday: 1965 sex: \"f\"]\n        wach2: person [name: \"Lilly Wachowski\" birthday: 1967 sex: \"f\"]\n\n        memento:         movie [title: \"Memento\" year: 2000]\n        inception:       movie [title: \"Inception\" year: 2010]\n        laconfidential:  movie [title: \"L.A. Confidential\" year: 1997]\n        matrix:          movie [title: \"The Matrix\" year: 1999]\n\n        ;---------------------------------------------\n        ; Define the relationships\n        ; between our nodes\n        ;---------------------------------------------\n\n        link'isFrom nolan uk\n        link'isFrom pearce au\n        link'isFrom @[hanson spacey dicaprio wach1 wach2] us\n        link'isFrom moss ca\n\n        link'directed nolan @[memento inception]\n        link'directed hanson laconfidential\n        link'directed @[wach1 wach2] matrix\n\n        link'actedIn pearce @[memento laconfidential]\n        link'actedIn spacey laconfidential\n        link'actedIn dicaprio inception\n        link'actedIn moss @[memento matrix]\n\n        ;---------------------------------------------\n        ; Fetch every \"person\" &\n        ; open the Desktop app for visualization\n        ;---------------------------------------------\n\n        ; person? [isFrom: first country? -> name: \"United States\" name: -> contains: \"d\"\n        ; ] ; returns DiCaprio\n\n        ; person? [\n        ;     isFrom: country? \"United States\" \n        ;     name: -> contains: \"d\"\n        ; ] ; should return DiCaprio\n\n        ; pythonic (potentially)\n        ; person? \n        ;     isFrom: country? \n        ;         name: \n        ;             contains: \"United\"\n\n        ; person? [\n        ;     isFrom: country? [\n        ;         name: [\n        ;             contains: \"United\"\n        ;         ]\n        ;     ] \n        ;     name: [\n        ;         contains: \"w\"\n        ;     ]\n        ; ]\n        \n        preview fetch 'person ø\n    ]\n]"
  },
  {
    "path": "examples/sample4c.art",
    "content": ";---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\ndo.import {grafito.art}\n\ndo [\n\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample4\"\n    ;---------------------------------------------\n    graph .create\n          .helpers: [person movie country] \n          \"sample4c\" \n    [\n        ;---------------------------------------------\n        ; Populate the database\n        ;---------------------------------------------\n\n        uk: country.new [name: \"United Kingdom\"]\n        au: country.new [name: \"Australia\"]\n        us: country.new [name: \"United States\"] \n        ca: country.new [name: \"Canada\"]\n\n        nolan:    person.new [name: \"Christopher Nolan\" birthday: 1970 sex: \"m\"]\n        pearce:   person.new [name: \"Guy Pearce\" birthday: 1967 sex: \"m\"]\n        hanson:   person.new [name: \"Curtis Hanson\" birthday: 1945 sex: \"m\"]\n        spacey:   person.new [name: \"Kevin Spacey\" birthday: 1959 sex: \"m\"]\n        dicaprio: person.new [name: \"Leonardo DiCaprio\" birthday: 1974 sex: \"m\"]\n        moss:     person.new [name: \"Carrie-Ann Moss\" birthday: 1967 sex: \"f\"]\n        kidman:   person.new [name: \"Nicole Kidman\" birthday: 1967 sex: \"f\"]\n        cruise:   person.new [name: \"Tom Cruise\" birthday: 1962 sex: \"m\"]\n        kubrick:  person.new [name: \"Stanley Kubrick\" birthday: 1928 sex: \"m\"]\n\n        wach1: person.new [name: \"Lana Wachowski\" birthday: 1965 sex: \"f\"]\n        wach2: person.new [name: \"Lilly Wachowski\" birthday: 1967 sex: \"f\"]\n\n        memento:         movie.new [title: \"Memento\" year: 2000]\n        inception:       movie.new [title: \"Inception\" year: 2010]\n        laconfidential:  movie.new [title: \"L.A. Confidential\" year: 1997]\n        matrix:          movie.new [title: \"The Matrix\" year: 1999]\n        eyes:            movie.new [title: \"Eyes Wide Shut\" year: 1999]\n\n        ;---------------------------------------------\n        ; Define the relationships\n        ; between our nodes\n        ;---------------------------------------------\n\n        link'isFrom nolan uk\n        link'isFrom @[pearce kidman] au\n        link'isFrom @[hanson spacey dicaprio wach1 wach2 cruise kubrick] us\n        link'isFrom moss ca\n\n        link'directed nolan @[memento inception]\n        link'directed hanson laconfidential\n        link'directed @[wach1 wach2] matrix\n        link'directed kubrick eyes\n\n        link'actedIn pearce @[memento laconfidential]\n        link'actedIn spacey laconfidential\n        link'actedIn dicaprio inception\n        link'actedIn moss @[memento matrix]\n        link'actedIn @[cruise kidman] eyes\n\n        link'origin memento us\n        link'origin laconfidential us \n        link'origin matrix @[us au]\n        link'origin @[inception eyes] @[uk us]\n\n        link'sibling wach1 wach2\n        link'married cruise kidman\n\n        ;---------------------------------------------\n        ; Fetch every \"person\" &\n        ; open the Desktop app for visualization\n        ;---------------------------------------------\n        \n        preview fetch 'person ø\n    ]\n]"
  },
  {
    "path": "examples/sample4d.art",
    "content": ";---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\ndo.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample4\"\n    ;---------------------------------------------\n    graph.create \"sample4b\" [\n        ;---------------------\n        ; HELPERS\n        ;---------------------\n        \n        newCountry: function [block] -> put 'country block\n        newPerson: function [block] -> put 'person block\n        newMovie: function [block] -> put 'movie block\n\n        country: function [block] -> fetch 'country block\n        person: function [block] -> fetch 'person block\n        movie: function [block] -> fetch 'movie block\n\n        ;---------------------------------------------\n        ; Populate the database\n        ;---------------------------------------------\n\n        uk: newCountry [name: \"United Kingdom\"]\n        au: newCountry [name: \"Australia\"]\n        us: newCountry [name: \"United States\"] \n        ca: newCountry [name: \"Canada\"]\n\n        nolan:    newPerson [name: \"Christopher Nolan\" birthday: 1970 sex: \"m\"]\n        pearce:   newPerson [name: \"Guy Pearce\" birthday: 1967 sex: \"m\"]\n        hanson:   newPerson [name: \"Curtis Hanson\" birthday: 1945 sex: \"m\"]\n        spacey:   newPerson [name: \"Kevin Spacey\" birthday: 1959 sex: \"m\"]\n        dicaprio: newPerson [name: \"Leonardo DiCaprio\" birthday: 1974 sex: \"m\"]\n        moss:     newPerson [name: \"Carrie-Ann Moss\" birthday: 1967 sex: \"f\"]\n\n        wach1: newPerson [name: \"Lana Wachowski\" birthday: 1965 sex: \"f\"]\n        wach2: newPerson [name: \"Lilly Wachowski\" birthday: 1967 sex: \"f\"]\n\n        memento:         newMovie [title: \"Memento\" year: 2000]\n        inception:       newMovie [title: \"Inception\" year: 2010]\n        laconfidential:  newMovie [title: \"L.A. Confidential\" year: 1997]\n        matrix:          newMovie [title: \"The Matrix\" year: 1999]\n\n        ;---------------------------------------------\n        ; Define the relationships\n        ; between our nodes\n        ;---------------------------------------------\n\n        link'isFrom nolan uk\n        link'isFrom pearce au\n        link'isFrom @[hanson spacey dicaprio wach1 wach2] us\n        link'isFrom moss ca\n\n        link'directed nolan @[memento inception]\n        link'directed hanson laconfidential\n        link'directed @[wach1 wach2] matrix\n\n        link'actedIn pearce @[memento laconfidential]\n        link'actedIn spacey laconfidential\n        link'actedIn dicaprio inception\n        link'actedIn moss @[memento matrix]\n\n        ;---------------------------------------------\n        ; Fetch every \"person\" &\n        ; open the Desktop app for visualization\n        ;---------------------------------------------\n\n        ; person? [isFrom: first country? -> name: \"United States\" name: -> contains: \"d\"\n        ; ] ; returns DiCaprio\n\n        ; person? [\n        ;     isFrom: country? \"United States\" \n        ;     name: -> contains: \"d\"\n        ; ] ; should return DiCaprio\n\n        ; pythonic (potentially)\n        ; person? \n        ;     isFrom: country? \n        ;         name: \n        ;             contains: \"United\"\n\n        ; person? [\n        ;     isFrom: country? [\n        ;         name: [\n        ;             contains: \"United\"\n        ;         ]\n        ;     ] \n        ;     name: [\n        ;         contains: \"w\"\n        ;     ]\n        ; ]\n        \n        preview person ø\n    ]\n]"
  },
  {
    "path": "examples/sample5.art",
    "content": "do.import {grafito.art}\n\ndo [\n    graph.create \"sample5\" [\n        lemma8b257cd027: put 'lemma [w: {book} l: {en}]\n        pos3722df1028: put'pos [p: {noun}]\n        link'is lemma8b257cd027 pos3722df1028\n        sensef86f08d2e2: put'sense [s:{collection of sheets of paper bound together containing printed or written material}]\n        link'means pos3722df1028 sensef86f08d2e2\n        lemma493be85c29: put'lemma [w: {كتاب} l: {apc}]\n        pose499631911: put'pos [p: {noun}]\n        link'is lemma493be85c29 pose499631911\n        link'means pose499631911 sensef86f08d2e2\n        lemma693a742816: put'lemma [w: {ᏗᎪᏪᎵ} l: {chr}]\n        pos22d786790a: put'pos [p: {noun}]\n        link'is lemma693a742816 pos22d786790a\n        link'means pos22d786790a sensef86f08d2e2\n        lemma26fd5156d7: put'lemma [w: {書} l: {gan}]\n        posf6b3172996: put'pos [p: {noun}]\n        link'is lemma26fd5156d7 posf6b3172996\n        link'means posf6b3172996 sensef86f08d2e2\n        lemma9a3a17ffe8: put'lemma [w: {书} l: {gan}]\n        pos9b9ff30210: put'pos [p: {noun}]\n        link'is lemma9a3a17ffe8 pos9b9ff30210\n        link'means pos9b9ff30210 sensef86f08d2e2\n        lemma3027ada842: put'lemma [w: {書} l: {cjy}]\n        pose7e0f1482c: put'pos [p: {noun}]\n        link'is lemma3027ada842 pose7e0f1482c\n        link'means pose7e0f1482c sensef86f08d2e2\n        lemmafb0ebfc12a: put'lemma [w: {书} l: {cjy}]\n        pos83a0d216aa: put'pos [p: {noun}]\n        link'is lemmafb0ebfc12a pos83a0d216aa\n        link'means pos83a0d216aa sensef86f08d2e2\n        lemmafdf3beed04: put'lemma [w: {書} l: {mnp}]\n        pos49fb33a5c6: put'pos [p: {noun}]\n        link'is lemmafdf3beed04 pos49fb33a5c6\n        link'means pos49fb33a5c6 sensef86f08d2e2\n        lemmae8ba2100e7: put'lemma [w: {书} l: {mnp}]\n        pos45b2f78257: put'pos [p: {noun}]\n        link'is lemmae8ba2100e7 pos45b2f78257\n        link'means pos45b2f78257 sensef86f08d2e2\n        lemmabfb684d055: put'lemma [w: {書} l: {hsn}]\n        pos21c619ca73: put'pos [p: {noun}]\n        link'is lemmabfb684d055 pos21c619ca73\n        link'means pos21c619ca73 sensef86f08d2e2\n        lemma49e788e226: put'lemma [w: {书} l: {hsn}]\n        pos53828a28f1: put'pos [p: {noun}]\n        link'is lemma49e788e226 pos53828a28f1\n        link'means pos53828a28f1 sensef86f08d2e2\n        lemma3de6f10595: put'lemma [w: {𞤣𞤫𞤬𞤼𞤫𞤪𞤫} l: {ff}]\n        pos61a1c07120: put'pos [p: {noun}]\n        link'is lemma3de6f10595 pos61a1c07120\n        link'means pos61a1c07120 sensef86f08d2e2\n        lemmadd03b675a5: put'lemma [w: {deftere} l: {ff}]\n        pos2ba9f770dd: put'pos [p: {noun}]\n        link'is lemmadd03b675a5 pos2ba9f770dd\n        link'means pos2ba9f770dd sensef86f08d2e2\n        lemmab6adde549d: put'lemma [w: {ブック} l: {ja}]\n        posefc5173c6e: put'pos [p: {noun}]\n        link'is lemmab6adde549d posefc5173c6e\n        link'means posefc5173c6e sensef86f08d2e2\n        lemma979bc5909e: put'lemma [w: {buku} l: {jv}]\n        pos53c5fefdd3: put'pos [p: {noun}]\n        link'is lemma979bc5909e pos53c5fefdd3\n        link'means pos53c5fefdd3 sensef86f08d2e2\n        lemma77d51b75ed: put'lemma [w: {layang} l: {jv}]\n        pose41277bf28: put'pos [p: {noun}]\n        link'is lemma77d51b75ed pose41277bf28\n        link'means pose41277bf28 sensef86f08d2e2\n        lemmada9979caf2: put'lemma [w: {serat} l: {jv}]\n        pos89453006b2: put'pos [p: {noun}]\n        link'is lemmada9979caf2 pos89453006b2\n        link'means pos89453006b2 sensef86f08d2e2\n        lemmaf9128c3a63: put'lemma [w: {hun} l: {tr}]\n        posc360a20e09: put'pos [p: {noun}]\n        link'is lemmaf9128c3a63 posc360a20e09\n        link'means posc360a20e09 sensef86f08d2e2\n        senseb2f79ce965: put'sense [s:{record of betting}]\n        link'means pos3722df1028 senseb2f79ce965\n        sensee629d8b849: put'sense [s:{convenient collection of small paper items, such as stamps}]\n        link'means pos3722df1028 sensee629d8b849\n        sense92e15899d7: put'sense [s:{major division of a published work, larger than a chapter}]\n        link'means pos3722df1028 sense92e15899d7\n        sensea5f1ab78b7: put'sense [s:{script of a musical}]\n        link'means pos3722df1028 sensea5f1ab78b7\n        sense310968d56f: put'sense [s:{usually in plural: records of the accounts of a business}]\n        link'means pos3722df1028 sense310968d56f\n        pos7f8fc0a70a: put'pos [p: {verb}]\n        link'is lemma8b257cd027 pos7f8fc0a70a\n        senseda38a026ab: put'sense [s:{to reserve}]\n        link'means pos7f8fc0a70a senseda38a026ab\n        lemma5ffab7eaf1: put'lemma [w: {حَجَزَ} l: {ar}]\n        pos8f96b36193: put'pos [p: {verb}]\n        link'is lemma5ffab7eaf1 pos8f96b36193\n        link'means pos8f96b36193 senseda38a026ab\n        lemmab052952b74: put'lemma [w: {запазвам} l: {bg}]\n        pos400e2c04fa: put'pos [p: {verb}]\n        link'is lemmab052952b74 pos400e2c04fa\n        link'means pos400e2c04fa senseda38a026ab\n        lemmac68abfa48d: put'lemma [w: {reservar} l: {ca}]\n        pos718825f926: put'pos [p: {verb}]\n        link'is lemmac68abfa48d pos718825f926\n        link'means pos718825f926 senseda38a026ab\n        lemma99b2986739: put'lemma [w: {預訂} l: {cmn}]\n        pos4cd050d838: put'pos [p: {verb}]\n        link'is lemma99b2986739 pos4cd050d838\n        link'means pos4cd050d838 senseda38a026ab\n        lemmafa2b938743: put'lemma [w: {预订} l: {cmn}]\n        posb4eb4eba86: put'pos [p: {verb}]\n        link'is lemmafa2b938743 posb4eb4eba86\n        link'means posb4eb4eba86 senseda38a026ab\n        lemma0f0d44abcf: put'lemma [w: {rezervovat} l: {cs}]\n        pos162f335187: put'pos [p: {verb}]\n        link'is lemma0f0d44abcf pos162f335187\n        link'means pos162f335187 senseda38a026ab\n        lemmaef137e0718: put'lemma [w: {zarezervovat} l: {cs}]\n        posf6d7b3a598: put'pos [p: {verb}]\n        link'is lemmaef137e0718 posf6d7b3a598\n        link'means posf6d7b3a598 senseda38a026ab\n        lemma2692b18099: put'lemma [w: {zabukovat} l: {cs}]\n        poscc0eb62b54: put'pos [p: {verb}]\n        link'is lemma2692b18099 poscc0eb62b54\n        link'means poscc0eb62b54 senseda38a026ab\n        lemma1654d11c38: put'lemma [w: {reservere} l: {da}]\n        pos9f550e3669: put'pos [p: {verb}]\n        link'is lemma1654d11c38 pos9f550e3669\n        link'means pos9f550e3669 senseda38a026ab\n        lemma3eb280bc1c: put'lemma [w: {bestille} l: {da}]\n        pos269495d662: put'pos [p: {verb}]\n        link'is lemma3eb280bc1c pos269495d662\n        link'means pos269495d662 senseda38a026ab\n        lemmaa5e7be2c82: put'lemma [w: {boeken} l: {nl}]\n        pos9fb854c050: put'pos [p: {verb}]\n        link'is lemmaa5e7be2c82 pos9fb854c050\n        link'means pos9fb854c050 senseda38a026ab\n        lemmac9f87cbf24: put'lemma [w: {reserveren} l: {nl}]\n        pos66b6ed688a: put'pos [p: {verb}]\n        link'is lemmac9f87cbf24 pos66b6ed688a\n        link'means pos66b6ed688a senseda38a026ab\n        lemmabbc5f17f49: put'lemma [w: {rezervi} l: {eo}]\n        pos37d07f5e83: put'pos [p: {verb}]\n        link'is lemmabbc5f17f49 pos37d07f5e83\n        link'means pos37d07f5e83 senseda38a026ab\n        lemmab7f16f3b0b: put'lemma [w: {varata} l: {fi}]\n        pos810ea59d98: put'pos [p: {verb}]\n        link'is lemmab7f16f3b0b pos810ea59d98\n        link'means pos810ea59d98 senseda38a026ab\n        lemmaea73a2348c: put'lemma [w: {tehdä varaus} l: {fi}]\n        pos8c953c4fbb: put'pos [p: {verb}]\n        link'is lemmaea73a2348c pos8c953c4fbb\n        link'means pos8c953c4fbb senseda38a026ab\n        lemmaa6e05310a1: put'lemma [w: {réserver} l: {fr}]\n        posdb48c2f6f9: put'pos [p: {verb}]\n        link'is lemmaa6e05310a1 posdb48c2f6f9\n        link'means posdb48c2f6f9 senseda38a026ab\n        lemma57ee34b617: put'lemma [w: {reservar} l: {gl}]\n        posedc5b0780b: put'pos [p: {verb}]\n        link'is lemma57ee34b617 posedc5b0780b\n        link'means posedc5b0780b senseda38a026ab\n        lemma20e6bcda51: put'lemma [w: {რეგისტრირება} l: {ka}]\n        posa462660823: put'pos [p: {verb}]\n        link'is lemma20e6bcda51 posa462660823\n        link'means posa462660823 senseda38a026ab\n        lemmab7b174e6b7: put'lemma [w: {რეგისტრაციაში გატარება} l: {ka}]\n        pos7f7fb6d403: put'pos [p: {verb}]\n        link'is lemmab7b174e6b7 pos7f7fb6d403\n        link'means pos7f7fb6d403 senseda38a026ab\n        lemmad0bd3f2e5f: put'lemma [w: {დაბრონვა} l: {ka}]\n        pos217871f31e: put'pos [p: {verb}]\n        link'is lemmad0bd3f2e5f pos217871f31e\n        link'means pos217871f31e senseda38a026ab\n        lemma419efd5922: put'lemma [w: {ბრონირება} l: {ka}]\n        pos8f34f3db49: put'pos [p: {verb}]\n        link'is lemma419efd5922 pos8f34f3db49\n        link'means pos8f34f3db49 senseda38a026ab\n        lemma9ce011469e: put'lemma [w: {buchen} l: {de}]\n        posbc3dcacdaa: put'pos [p: {verb}]\n        link'is lemma9ce011469e posbc3dcacdaa\n        link'means posbc3dcacdaa senseda38a026ab\n        lemma4adc255247: put'lemma [w: {reservieren} l: {de}]\n        posabf9ceb9e3: put'pos [p: {verb}]\n        link'is lemma4adc255247 posabf9ceb9e3\n        link'means posabf9ceb9e3 senseda38a026ab\n        lemma8142abc97f: put'lemma [w: {κρατώ} l: {el}]\n        pos29eb57cafc: put'pos [p: {verb}]\n        link'is lemma8142abc97f pos29eb57cafc\n        link'means pos29eb57cafc senseda38a026ab\n        lemma64c115b11d: put'lemma [w: {προκρατ} l: {el}]\n        posf6043dbd1d: put'pos [p: {verb}]\n        link'is lemma64c115b11d posf6043dbd1d\n        link'means posf6043dbd1d senseda38a026ab\n        lemma0c080e4747: put'lemma [w: {κλείνω} l: {el}]\n        pos9be526592e: put'pos [p: {verb}]\n        link'is lemma0c080e4747 pos9be526592e\n        link'means pos9be526592e senseda38a026ab\n        lemma1445c3359b: put'lemma [w: {रिज़र्व करना} l: {hi}]\n        pos2652d23622: put'pos [p: {verb}]\n        link'is lemma1445c3359b pos2652d23622\n        link'means pos2652d23622 senseda38a026ab\n        lemmad879fb0956: put'lemma [w: {lefoglal} l: {hu}]\n        posfa7a7ccc22: put'pos [p: {verb}]\n        link'is lemmad879fb0956 posfa7a7ccc22\n        link'means posfa7a7ccc22 senseda38a026ab\n        lemmad3a1fe2739: put'lemma [w: {foglal} l: {hu}]\n        posc4b80a955a: put'pos [p: {verb}]\n        link'is lemmad3a1fe2739 posc4b80a955a\n        link'means posc4b80a955a senseda38a026ab\n        lemmaf9d257fe1b: put'lemma [w: {megvált} l: {hu}]\n        pos8272261f05: put'pos [p: {verb}]\n        link'is lemmaf9d257fe1b pos8272261f05\n        link'means pos8272261f05 senseda38a026ab\n        lemma0628303c25: put'lemma [w: {vált} l: {hu}]\n        pos91a5d1faa1: put'pos [p: {verb}]\n        link'is lemma0628303c25 pos91a5d1faa1\n        link'means pos91a5d1faa1 senseda38a026ab\n        lemmad664047b50: put'lemma [w: {előjegyez} l: {hu}]\n        pos172fda6753: put'pos [p: {verb}]\n        link'is lemmad664047b50 pos172fda6753\n        link'means pos172fda6753 senseda38a026ab\n        lemma0fcd290db9: put'lemma [w: {pesan} l: {id}]\n        pos3fc7440682: put'pos [p: {verb}]\n        link'is lemma0fcd290db9 pos3fc7440682\n        link'means pos3fc7440682 senseda38a026ab\n        lemma285918e9d7: put'lemma [w: {reservar} l: {ia}]\n        pos71e7aa6831: put'pos [p: {verb}]\n        link'is lemma285918e9d7 pos71e7aa6831\n        link'means pos71e7aa6831 senseda38a026ab\n        lemmab388c1d5f4: put'lemma [w: {cuir in áirithe} l: {ga}]\n        posc087fab3ae: put'pos [p: {verb}]\n        link'is lemmab388c1d5f4 posc087fab3ae\n        link'means posc087fab3ae senseda38a026ab\n        lemma50000a8536: put'lemma [w: {prenotare} l: {it}]\n        pos95467c3689: put'pos [p: {verb}]\n        link'is lemma50000a8536 pos95467c3689\n        link'means pos95467c3689 senseda38a026ab\n        lemmae07803f170: put'lemma [w: {riservare} l: {it}]\n        pos6a7ad647ae: put'pos [p: {verb}]\n        link'is lemmae07803f170 pos6a7ad647ae\n        link'means pos6a7ad647ae senseda38a026ab\n        lemma4452d5f6db: put'lemma [w: {予約する} l: {ja}]\n        pos454ca32c7b: put'pos [p: {verb}]\n        link'is lemma4452d5f6db pos454ca32c7b\n        link'means pos454ca32c7b senseda38a026ab\n        lemma8fcd8726fe: put'lemma [w: {예약하다} l: {ko}]\n        pos4a5a86c7bd: put'pos [p: {verb}]\n        link'is lemma8fcd8726fe pos4a5a86c7bd\n        link'means pos4a5a86c7bd senseda38a026ab\n        lemma2433e61607: put'lemma [w: {豫約} l: {ko}]\n        pos6473e71a0d: put'pos [p: {verb}]\n        link'is lemma2433e61607 pos6473e71a0d\n        link'means pos6473e71a0d senseda38a026ab\n        lemma0b78bda757: put'lemma [w: {하다} l: {ko}]\n        pos1a5ff82ae5: put'pos [p: {verb}]\n        link'is lemma0b78bda757 pos1a5ff82ae5\n        link'means pos1a5ff82ae5 senseda38a026ab\n        lemma9c4463e264: put'lemma [w: {резерви́ра} l: {mk}]\n        pos53276c2faa: put'pos [p: {verb}]\n        link'is lemma9c4463e264 pos53276c2faa\n        link'means pos53276c2faa senseda38a026ab\n        lemma00530c554d: put'lemma [w: {закажува} l: {mk}]\n        pos40bedcde3d: put'pos [p: {verb}]\n        link'is lemma00530c554d pos40bedcde3d\n        link'means pos40bedcde3d senseda38a026ab\n        lemma34f6b2ffdd: put'lemma [w: {tempah} l: {ms}]\n        pos2d7cbe1793: put'pos [p: {verb}]\n        link'is lemma34f6b2ffdd pos2d7cbe1793\n        link'means pos2d7cbe1793 senseda38a026ab\n        lemmad6f29905b6: put'lemma [w: {tāpui} l: {mi}]\n        pos23a68a8d2b: put'pos [p: {verb}]\n        link'is lemmad6f29905b6 pos23a68a8d2b\n        link'means pos23a68a8d2b senseda38a026ab\n        lemmaf698af452b: put'lemma [w: {ukaɗimia} l: {zdj}]\n        pos6e1ac881a5: put'pos [p: {verb}]\n        link'is lemmaf698af452b pos6e1ac881a5\n        link'means pos6e1ac881a5 senseda38a026ab\n        lemmac034b1f0e8: put'lemma [w: {boutchi} l: {nrf}]\n        pos712ca843ca: put'pos [p: {verb}]\n        link'is lemmac034b1f0e8 pos712ca843ca\n        link'means pos712ca843ca senseda38a026ab\n        lemma77255589bd: put'lemma [w: {bestille} l: {no}]\n        posd2ec255c53: put'pos [p: {verb}]\n        link'is lemma77255589bd posd2ec255c53\n        link'means posd2ec255c53 senseda38a026ab\n        lemma0536ef5117: put'lemma [w: {reservere} l: {no}]\n        pos93c775435f: put'pos [p: {verb}]\n        link'is lemma0536ef5117 pos93c775435f\n        link'means pos93c775435f senseda38a026ab\n        lemmafc32ea3c6b: put'lemma [w: {رزرو کردن} l: {fa}]\n        pos75d89b17a4: put'pos [p: {verb}]\n        link'is lemmafc32ea3c6b pos75d89b17a4\n        link'means pos75d89b17a4 senseda38a026ab\n        lemma0d1a467c92: put'lemma [w: {rezerwować} l: {pl}]\n        pos6b76db03c3: put'pos [p: {verb}]\n        link'is lemma0d1a467c92 pos6b76db03c3\n        link'means pos6b76db03c3 senseda38a026ab\n        lemma30625f22fd: put'lemma [w: {zarezerwować} l: {pl}]\n        pos283289ef18: put'pos [p: {verb}]\n        link'is lemma30625f22fd pos283289ef18\n        link'means pos283289ef18 senseda38a026ab\n        lemma7bd6f153d5: put'lemma [w: {bukować} l: {pl}]\n        pos6e5c9329a8: put'pos [p: {verb}]\n        link'is lemma7bd6f153d5 pos6e5c9329a8\n        link'means pos6e5c9329a8 senseda38a026ab\n        lemma5e6b1a766b: put'lemma [w: {zabukować} l: {pl}]\n        pos002a1fcd8e: put'pos [p: {verb}]\n        link'is lemma5e6b1a766b pos002a1fcd8e\n        link'means pos002a1fcd8e senseda38a026ab\n        lemma26b0f4e842: put'lemma [w: {reservar} l: {pt}]\n        pos12c0f1ee7a: put'pos [p: {verb}]\n        link'is lemma26b0f4e842 pos12c0f1ee7a\n        link'means pos12c0f1ee7a senseda38a026ab\n        lemma879ebd4b4c: put'lemma [w: {rezerva} l: {ro}]\n        pos926bdd0d33: put'pos [p: {verb}]\n        link'is lemma879ebd4b4c pos926bdd0d33\n        link'means pos926bdd0d33 senseda38a026ab\n        lemmace2406de31: put'lemma [w: {брони́ровать} l: {ru}]\n        posb84f90110d: put'pos [p: {verb}]\n        link'is lemmace2406de31 posb84f90110d\n        link'means posb84f90110d senseda38a026ab\n        lemmae4ed260f84: put'lemma [w: {заброни́ровать} l: {ru}]\n        pose74deb4481: put'pos [p: {verb}]\n        link'is lemmae4ed260f84 pose74deb4481\n        link'means pose74deb4481 senseda38a026ab\n        lemma8f820f7a26: put'lemma [w: {резерви́ровать} l: {ru}]\n        pos0347e3dc8e: put'pos [p: {verb}]\n        link'is lemma8f820f7a26 pos0347e3dc8e\n        link'means pos0347e3dc8e senseda38a026ab\n        lemma708016700d: put'lemma [w: {зарезерви́ровать} l: {ru}]\n        pos1390c3be31: put'pos [p: {verb}]\n        link'is lemma708016700d pos1390c3be31\n        link'means pos1390c3be31 senseda38a026ab\n        lemma530ab298bb: put'lemma [w: {зака́зывать} l: {ru}]\n        pos7067c6efa1: put'pos [p: {verb}]\n        link'is lemma530ab298bb pos7067c6efa1\n        link'means pos7067c6efa1 senseda38a026ab\n        lemma2b81adebcc: put'lemma [w: {заказа́ть} l: {ru}]\n        poseafb3e54d8: put'pos [p: {verb}]\n        link'is lemma2b81adebcc poseafb3e54d8\n        link'means poseafb3e54d8 senseda38a026ab\n        lemma27f3081168: put'lemma [w: {predbilježiti} l: {sh}]\n        pos2e39921f77: put'pos [p: {verb}]\n        link'is lemma27f3081168 pos2e39921f77\n        link'means pos2e39921f77 senseda38a026ab\n        lemmac390608b64: put'lemma [w: {rezervirati} l: {sh}]\n        pos7ca2e7b7a1: put'pos [p: {verb}]\n        link'is lemmac390608b64 pos7ca2e7b7a1\n        link'means pos7ca2e7b7a1 senseda38a026ab\n        lemma0fa6291cae: put'lemma [w: {rezervovať} l: {sk}]\n        pos27093a6607: put'pos [p: {verb}]\n        link'is lemma0fa6291cae pos27093a6607\n        link'means pos27093a6607 senseda38a026ab\n        lemma9b51132bd5: put'lemma [w: {zarezervovať} l: {sk}]\n        pos3afcdc8775: put'pos [p: {verb}]\n        link'is lemma9b51132bd5 pos3afcdc8775\n        link'means pos3afcdc8775 senseda38a026ab\n        lemmadade0190a1: put'lemma [w: {reservar} l: {es}]\n        pos1a3816d253: put'pos [p: {verb}]\n        link'is lemmadade0190a1 pos1a3816d253\n        link'means pos1a3816d253 senseda38a026ab\n        lemmabe96b9eda9: put'lemma [w: {boka} l: {sv}]\n        pos8abf78a031: put'pos [p: {verb}]\n        link'is lemmabe96b9eda9 pos8abf78a031\n        link'means pos8abf78a031 senseda38a026ab\n        lemma66f4963c8f: put'lemma [w: {yer ayırma} l: {tr}]\n        pos3b7b578927: put'pos [p: {verb}]\n        link'is lemma66f4963c8f pos3b7b578927\n        link'means pos3b7b578927 senseda38a026ab\n        lemma1befa0db9f: put'lemma [w: {kitap} l: {tr}]\n        pos5945f4a88c: put'pos [p: {verb}]\n        link'is lemma1befa0db9f pos5945f4a88c\n        link'means pos5945f4a88c senseda38a026ab\n        lemmab0303cee06: put'lemma [w: {cadw} l: {cy}]\n        pos36d8a0e63e: put'pos [p: {verb}]\n        link'is lemmab0303cee06 pos36d8a0e63e\n        link'means pos36d8a0e63e senseda38a026ab\n        sense8095a9e6b4: put'sense [s:{to write down, register, record}]\n        link'means pos7f8fc0a70a sense8095a9e6b4\n        lemmad852354987: put'lemma [w: {записвам} l: {bg}]\n        pos8819b3eae4: put'pos [p: {verb}]\n        link'is lemmad852354987 pos8819b3eae4\n        link'means pos8819b3eae4 sense8095a9e6b4\n        lemmab005141cd0: put'lemma [w: {anotar} l: {ca}]\n        pos97495274a8: put'pos [p: {verb}]\n        link'is lemmab005141cd0 pos97495274a8\n        link'means pos97495274a8 sense8095a9e6b4\n        lemma0e15b367cc: put'lemma [w: {nedskrive} l: {da}]\n        pos97d056b11a: put'pos [p: {verb}]\n        link'is lemma0e15b367cc pos97d056b11a\n        link'means pos97d056b11a sense8095a9e6b4\n        lemmacdefb85839: put'lemma [w: {notere} l: {da}]\n        posfdd3b63753: put'pos [p: {verb}]\n        link'is lemmacdefb85839 posfdd3b63753\n        link'means posfdd3b63753 sense8095a9e6b4\n        lemmaa25f253805: put'lemma [w: {bogføre} l: {da}]\n        posade3600c74: put'pos [p: {verb}]\n        link'is lemmaa25f253805 posade3600c74\n        link'means posade3600c74 sense8095a9e6b4\n        lemma304f17307c: put'lemma [w: {te boek stellen} l: {nl}]\n        posd31eb16f3f: put'pos [p: {verb}]\n        link'is lemma304f17307c posd31eb16f3f\n        link'means posd31eb16f3f sense8095a9e6b4\n        lemma755a870552: put'lemma [w: {noteren} l: {nl}]\n        pos6fc05d6155: put'pos [p: {verb}]\n        link'is lemma755a870552 pos6fc05d6155\n        link'means pos6fc05d6155 sense8095a9e6b4\n        lemma8b3d7ecf85: put'lemma [w: {kirjoittaa ylös} l: {fi}]\n        pos3c91c6d9bc: put'pos [p: {verb}]\n        link'is lemma8b3d7ecf85 pos3c91c6d9bc\n        link'means pos3c91c6d9bc sense8095a9e6b4\n        lemma2c97454540: put'lemma [w: {kirjata} l: {fi}]\n        posc1827b1993: put'pos [p: {verb}]\n        link'is lemma2c97454540 posc1827b1993\n        link'means posc1827b1993 sense8095a9e6b4\n        lemma7e3ca6f4f8: put'lemma [w: {kirjoittaa muistiin} l: {fi}]\n        pos9e0e710234: put'pos [p: {verb}]\n        link'is lemma7e3ca6f4f8 pos9e0e710234\n        link'means pos9e0e710234 sense8095a9e6b4\n        lemma26cbdd3150: put'lemma [w: {rekisteröidä} l: {fi}]\n        posf3119d023c: put'pos [p: {verb}]\n        link'is lemma26cbdd3150 posf3119d023c\n        link'means posf3119d023c sense8095a9e6b4\n        lemmaf68d609965: put'lemma [w: {anotar} l: {gl}]\n        pos84cd315e51: put'pos [p: {verb}]\n        link'is lemmaf68d609965 pos84cd315e51\n        link'means pos84cd315e51 sense8095a9e6b4\n        lemma0de80bc46e: put'lemma [w: {notieren} l: {de}]\n        pos84a5f64c2e: put'pos [p: {verb}]\n        link'is lemma0de80bc46e pos84a5f64c2e\n        link'means pos84a5f64c2e sense8095a9e6b4\n        lemmaa10d262aaa: put'lemma [w: {schreiben} l: {de}]\n        pos5b1b03041e: put'pos [p: {verb}]\n        link'is lemmaa10d262aaa pos5b1b03041e\n        link'means pos5b1b03041e sense8095a9e6b4\n        lemma540a841c3d: put'lemma [w: {γράφω} l: {el}]\n        pos48be3a8c62: put'pos [p: {verb}]\n        link'is lemma540a841c3d pos48be3a8c62\n        link'means pos48be3a8c62 sense8095a9e6b4\n        lemma7fd4b6db6a: put'lemma [w: {καταχωρώ} l: {el}]\n        posdc3280615b: put'pos [p: {verb}]\n        link'is lemma7fd4b6db6a posdc3280615b\n        link'means posdc3280615b sense8095a9e6b4\n        lemmab7b990a4b0: put'lemma [w: {σημειώνω} l: {el}]\n        pos70c93fbb47: put'pos [p: {verb}]\n        link'is lemmab7b990a4b0 pos70c93fbb47\n        link'means pos70c93fbb47 sense8095a9e6b4\n        lemmaa6b4c7bca1: put'lemma [w: {könyvel} l: {hu}]\n        posb4d1705702: put'pos [p: {verb}]\n        link'is lemmaa6b4c7bca1 posb4d1705702\n        link'means posb4d1705702 sense8095a9e6b4\n        lemmab43710f26b: put'lemma [w: {elkönyvel} l: {hu}]\n        pos0ae342613c: put'pos [p: {verb}]\n        link'is lemmab43710f26b pos0ae342613c\n        link'means pos0ae342613c sense8095a9e6b4\n        lemma0511896480: put'lemma [w: {lekönyvel} l: {hu}]\n        pos3b3b44fb1a: put'pos [p: {verb}]\n        link'is lemma0511896480 pos3b3b44fb1a\n        link'means pos3b3b44fb1a sense8095a9e6b4\n        lemmabce991bde2: put'lemma [w: {annotare} l: {it}]\n        pos5ef4098e1e: put'pos [p: {verb}]\n        link'is lemmabce991bde2 pos5ef4098e1e\n        link'means pos5ef4098e1e sense8095a9e6b4\n        lemma2d43e6f98b: put'lemma [w: {trascrivere} l: {it}]\n        pos939a70c95b: put'pos [p: {verb}]\n        link'is lemma2d43e6f98b pos939a70c95b\n        link'means pos939a70c95b sense8095a9e6b4\n        lemmaa37bb862d6: put'lemma [w: {記入する} l: {ja}]\n        posbac3839f97: put'pos [p: {verb}]\n        link'is lemmaa37bb862d6 posbac3839f97\n        link'means posbac3839f97 sense8095a9e6b4\n        lemma8544784707: put'lemma [w: {внесува} l: {mk}]\n        pos70ca5d74c6: put'pos [p: {verb}]\n        link'is lemma8544784707 pos70ca5d74c6\n        link'means pos70ca5d74c6 sense8095a9e6b4\n        lemma875e7a5bda: put'lemma [w: {запишува} l: {mk}]\n        pose2a009c635: put'pos [p: {verb}]\n        link'is lemma875e7a5bda pose2a009c635\n        link'means pose2a009c635 sense8095a9e6b4\n        lemmaee5012657d: put'lemma [w: {заведува} l: {mk}]\n        posa54755bcaa: put'pos [p: {verb}]\n        link'is lemmaee5012657d posa54755bcaa\n        link'means posa54755bcaa sense8095a9e6b4\n        lemmad70262d4ea: put'lemma [w: {notere} l: {no}]\n        pos358f613c8a: put'pos [p: {verb}]\n        link'is lemmad70262d4ea pos358f613c8a\n        link'means pos358f613c8a sense8095a9e6b4\n        lemma02aa35731c: put'lemma [w: {nedskrive} l: {no}]\n        posa8ec1ffe68: put'pos [p: {verb}]\n        link'is lemma02aa35731c posa8ec1ffe68\n        link'means posa8ec1ffe68 sense8095a9e6b4\n        lemma01516d0d30: put'lemma [w: {spisać} l: {pl}]\n        pos12ec563702: put'pos [p: {verb}]\n        link'is lemma01516d0d30 pos12ec563702\n        link'means pos12ec563702 sense8095a9e6b4\n        lemma2611d0acb7: put'lemma [w: {anotar} l: {pt}]\n        pos869ad4d4c8: put'pos [p: {verb}]\n        link'is lemma2611d0acb7 pos869ad4d4c8\n        link'means pos869ad4d4c8 sense8095a9e6b4\n        lemma115333dd6b: put'lemma [w: {zaznačiť} l: {sk}]\n        pos78a01b223a: put'pos [p: {verb}]\n        link'is lemma115333dd6b pos78a01b223a\n        link'means pos78a01b223a sense8095a9e6b4\n        lemma096b64d995: put'lemma [w: {zaknihovať} l: {sk}]\n        posfe3151ea95: put'pos [p: {verb}]\n        link'is lemma096b64d995 posfe3151ea95\n        link'means posfe3151ea95 sense8095a9e6b4\n        lemma55e473797a: put'lemma [w: {anotar} l: {es}]\n        pos6734388ceb: put'pos [p: {verb}]\n        link'is lemma55e473797a pos6734388ceb\n        link'means pos6734388ceb sense8095a9e6b4\n        lemmaa06d6a035f: put'lemma [w: {bokföra} l: {sv}]\n        pos82f6ae7130: put'pos [p: {verb}]\n        link'is lemmaa06d6a035f pos82f6ae7130\n        link'means pos82f6ae7130 sense8095a9e6b4\n        lemmaef47e75a55: put'lemma [w: {skriva in} l: {sv}]\n        pos9e5da87289: put'pos [p: {verb}]\n        link'is lemmaef47e75a55 pos9e5da87289\n        link'means pos9e5da87289 sense8095a9e6b4\n        sensee218329346: put'sense [s:{to record the details of an offender}]\n        link'means pos7f8fc0a70a sensee218329346\n        lemmad643753534: put'lemma [w: {rekisteröidä} l: {fi}]\n        pos5b8591e2bc: put'pos [p: {verb}]\n        link'is lemmad643753534 pos5b8591e2bc\n        link'means pos5b8591e2bc sensee218329346\n        lemmab34798aa49: put'lemma [w: {felír} l: {hu}]\n        pos76ca843a7f: put'pos [p: {verb}]\n        link'is lemmab34798aa49 pos76ca843a7f\n        link'means pos76ca843a7f sensee218329346\n        lemma2384d799e8: put'lemma [w: {調書を取る} l: {ja}]\n        pos76f69059ac: put'pos [p: {verb}]\n        link'is lemma2384d799e8 pos76f69059ac\n        link'means pos76f69059ac sensee218329346\n        lemma74800b8ba1: put'lemma [w: {multar} l: {pt}]\n        posd2e6f18ffd: put'pos [p: {verb}]\n        link'is lemma74800b8ba1 posd2e6f18ffd\n        link'means posd2e6f18ffd sensee218329346\n        sense5524244560: put'sense [s:{sports: to issue with a caution}]\n        link'means pos7f8fc0a70a sense5524244560\n        lemmac7b383a3e1: put'lemma [w: {varoittaa} l: {fi}]\n        pos0b9995cd5d: put'pos [p: {verb}]\n        link'is lemmac7b383a3e1 pos0b9995cd5d\n        link'means pos0b9995cd5d sense5524244560\n        lemmaa86e7b94de: put'lemma [w: {antaa varoitus} l: {fi}]\n        pos236b000aa1: put'pos [p: {verb}]\n        link'is lemmaa86e7b94de pos236b000aa1\n        link'means pos236b000aa1 sense5524244560\n        lemmaeca039bc89: put'lemma [w: {sárga lapot ad} l: {hu}]\n        pos583dbbd7c1: put'pos [p: {verb}]\n        link'is lemmaeca039bc89 pos583dbbd7c1\n        link'means pos583dbbd7c1 sense5524244560\n        lemmae0276b43f4: put'lemma [w: {ammonire} l: {it}]\n        pos8cff370755: put'pos [p: {verb}]\n        link'is lemmae0276b43f4 pos8cff370755\n        link'means pos8cff370755 sense5524244560\n        sense90edbe61b4: put'sense [s:{slang: to travel very fast}]\n        link'means pos7f8fc0a70a sense90edbe61b4\n        lemma126c5a7bbb: put'lemma [w: {boeken} l: {nl}]\n        posbb935ff58b: put'pos [p: {verb}]\n        link'is lemma126c5a7bbb posbb935ff58b\n        link'means posbb935ff58b sense90edbe61b4\n        lemmab64af5f571: put'lemma [w: {vlammen} l: {nl}]\n        pos8ef07ad582: put'pos [p: {verb}]\n        link'is lemmab64af5f571 pos8ef07ad582\n        link'means pos8ef07ad582 sense90edbe61b4\n        lemmadc7c5c24bd: put'lemma [w: {luukuttaa} l: {fi}]\n        posc384af9d73: put'pos [p: {verb}]\n        link'is lemmadc7c5c24bd posc384af9d73\n        link'means posc384af9d73 sense90edbe61b4\n        lemmaf7717609a3: put'lemma [w: {rasen} l: {de}]\n        pos7b4bf047a5: put'pos [p: {verb}]\n        link'is lemmaf7717609a3 pos7b4bf047a5\n        link'means pos7b4bf047a5 sense90edbe61b4\n        lemma8df31a6b61: put'lemma [w: {száguld} l: {hu}]\n        posdf53c51b96: put'pos [p: {verb}]\n        link'is lemma8df31a6b61 posdf53c51b96\n        link'means posdf53c51b96 sense90edbe61b4\n        lemmac38cd89073: put'lemma [w: {スピードを出す} l: {ja}]\n        pos52af984c8e: put'pos [p: {verb}]\n        link'is lemmac38cd89073 pos52af984c8e\n        link'means pos52af984c8e sense90edbe61b4\n        lemma43a341aeb4: put'lemma [w: {飛ばす} l: {ja}]\n        pos4a27143545: put'pos [p: {verb}]\n        link'is lemma43a341aeb4 pos4a27143545\n        link'means pos4a27143545 sense90edbe61b4\n        sense4ece92bfd9: put'sense [s:{to record bets as bookmaker}]\n        link'means pos7f8fc0a70a sense4ece92bfd9\n        lemmafaa9c8acee: put'lemma [w: {pitää kirjaa} l: {fi}]\n        pos00f8e8942b: put'pos [p: {verb}]\n        link'is lemmafaa9c8acee pos00f8e8942b\n        link'means pos00f8e8942b sense4ece92bfd9\n        sense6ea9e80c3d: put'sense [s:{to receive the highest grade in a class}]\n        link'means pos7f8fc0a70a sense6ea9e80c3d\n        lemmabb32c98866: put'lemma [w: {legjobbként végez} l: {hu}]\n        posb87fd52a1b: put'pos [p: {verb}]\n        link'is lemmabb32c98866 posb87fd52a1b\n        link'means posb87fd52a1b sense6ea9e80c3d\n        sense7b57751785: put'sense [s:{slang: to leave}]\n        link'means pos7f8fc0a70a sense7b57751785\n        lemma37504a71c2: put'lemma [w: {nostaa kytkintä} l: {fi}]\n        pos79f54bd342: put'pos [p: {verb}]\n        link'is lemma37504a71c2 pos79f54bd342\n        link'means pos79f54bd342 sense7b57751785\n        lemma1e895e7987: put'lemma [w: {lelép} l: {hu}]\n        posdf6ca3c753: put'pos [p: {verb}]\n        link'is lemma1e895e7987 posdf6ca3c753\n        link'means posdf6ca3c753 sense7b57751785\n        pos7f8fc0a70a: put'pos [p: {verb}]\n        link'is lemma8b257cd027 pos7f8fc0a70a\n        lemmaceac518675: put 'lemma #[w: {book} l: {li}]\n        posf68c8817db: put'pos [p: {noun}]\n        link'is lemmaceac518675 posf68c8817db\n        lemmac1a1a27858: put 'lemma #[w: {book} l: {enm}]\n        pos0ff9e0a13a: put'pos [p: {noun}]\n        link'is lemmac1a1a27858 pos0ff9e0a13a\n        pos0ff9e0a13a: put'pos [p: {noun}]\n        link'is lemmac1a1a27858 pos0ff9e0a13a\n        lemma3af60c7721: put 'lemma #[w: {book} l: {nb}]\n        pos35c7f973f2: put'pos [p: {verb}]\n        link'is lemma3af60c7721 pos35c7f973f2\n\n        preview fetch'pos ø\n    ]\n]"
  },
  {
    "path": "examples/sample6.art",
    "content": "do.import {grafito.art}\n\ndo [\n    graph \"sample6\" [\n        put'person [name: \"John\" surname: \"Doe\" age: 34]\n        put'person [name: \"Jane\" surname: \"doe\" age: 24]\n        put'person [name: \"Bill\" surname: \"Jones\" age: 44]\n\n        ; let's find all the people who are \n        ; more than 30 years old\n        inspect fetch'person [\n            age: -> greater: 30\n        ]\n    ]\n]"
  },
  {
    "path": "examples/sample7.art",
    "content": "do.import {grafito.art}\n\ndo [\n    graph.create \"sample7\" [\n        put'country [name: \"United States\"]\n        put'country [name: \"Australia\"]\n\n        john: put'person [name: \"John\" surname: \"Doe\" age: 34 country: \"United States\"]\n        jane: put'person [name: \"Jane\" surname: \"doe\" age: 24 country: \"United States\"]\n        put'person [name: \"Bill\" surname: \"Jones\" age: 44 country: \"Australia\"]\n\n        link'marriedTo john jane\n\n        ; let's find all the people who are \n        ; more than 30 years old\n        inspect fetch'person [\n            age: -> greater: 30\n            surname: \"Doe\"\n        ]\n    ]\n]"
  },
  {
    "path": "examples/sample8.art",
    "content": "do.import {grafito.art}\n\ndo [\n    graph.create \"sample8\" [\n        ;---------------------------------------------\n        ; Populate the database\n        ;---------------------------------------------\n\n        us: put'country [name: \"United States\"]\n        au: put'country [name: \"Australia\"]\n\n        john: put'person [name: \"John\" surname: \"Doe\" age: 34]\n        jane: put'person [name: \"Jane\" surname: \"doe\" age: 24]\n        \n        bill: put'person [name: \"Bill\" surname: \"Jones\" age: 44]\n        mary: put'person [name: \"Mary\" age: 54]\n\n        link'marriedTo john jane\n        link'marriedTo bill mary\n\n        link'isFrom @[john mary] us\n        link'isFrom @[jane bill] au\n\n        ;---------------------------------------------\n        ; Let's perform some interesting queries!\n        ;---------------------------------------------\n\n        ; fetch all people\n        inspect fetch'person ø\n\n        ; fetch all people that have a surname\n        inspect fetch'person [surname: true]\n\n        ; fetch all people that have the name John\n        inspect fetch'person [name: \"John\"]\n\n        ; fetch all people that are over 40 years old\n        inspect fetch'person [age: -> greater: 40]\n\n        ; fetch all people that are over 40 years old \n        ; and have the surname \"Jones\"\n        inspect fetch'person [\n            age: -> greater: 40\n            surname: \"Jones\"\n        ]\n\n        ; fetch all people that have the name John\n        ; and are married to someone/anyone\n        inspect fetch'person [\n            name:\"John\" \n            marriedTo: ø \n        ]\n\n        ; fetch all people that have the name John\n        ; and are married to someone with the name Joan\n        inspect fetch'person [\n            name:\"John\" marriedTo: what'person [name:\"Joan\"]\n        ]\n\n        ; fetch all people that have either the name \"John\"\n        ; or the surname \"Jones\"\n        inspect fetch'person .any [\n            name:\"John\" \n            surname:\"Jones\"\n        ]\n    ]\n]"
  },
  {
    "path": "examples/sample9.art",
    "content": ";---------------------------------------------\n; Import Grafito\n; and ... let's rock'n'roll! :)\n;---------------------------------------------\ndo.import {grafito.art}\n\ndo [\n    ;---------------------------------------------\n    ; Set up a new graph environment\n    ; with a local database named \"sample4\"\n    ;---------------------------------------------\n    graph.create \"sample9\" [\n\n        ArithmeticObj: put'modl [name: \"Arithmetic\"]\n        arraysObj: put'modl [name: \"arrays\"]\n        arturoObj: put'modl [name: \"arturo\"]\n        benchmarkObj: put'modl [name: \"benchmark\"]\n        bignumObj: put'modl [name: \"bignum\"]\n        BinaryObj: put'modl [name: \"Binary\"]\n        bytecodeObj: put'modl [name: \"bytecode\"]\n        CollectionsObj: put'modl [name: \"Collections\"]\n        ComparisonObj: put'modl [name: \"Comparison\"]\n        ConvertersObj: put'modl [name: \"Converters\"]\n        CoreObj: put'modl [name: \"Core\"]\n        CryptoObj: put'modl [name: \"Crypto\"]\n        csvObj: put'modl [name: \"csv\"]\n        databaseObj: put'modl [name: \"database\"]\n        DatabasesObj: put'modl [name: \"Databases\"]\n        datasourceObj: put'modl [name: \"datasource\"]\n        DatesObj: put'modl [name: \"Dates\"]\n        debugObj: put'modl [name: \"debug\"]\n        envObj: put'modl [name: \"env\"]\n        errorsObj: put'modl [name: \"errors\"]\n        evalObj: put'modl [name: \"eval\"]\n        execObj: put'modl [name: \"exec\"]\n        ffiObj: put'modl [name: \"ffi\"]\n        FilesObj: put'modl [name: \"Files\"]\n        globalsObj: put'modl [name: \"globals\"]\n        helperObj: put'modl [name: \"helper\"]\n        htmlObj: put'modl [name: \"html\"]\n        IoObj: put'modl [name: \"Io\"]\n        IteratorsObj: put'modl [name: \"Iterators\"]\n        jsonobjectObj: put'modl [name: \"jsonobject\"]\n        libObj: put'modl [name: \"lib\"]\n        LogicObj: put'modl [name: \"Logic\"]\n        markdownObj: put'modl [name: \"markdown\"]\n        mathsObj: put'modl [name: \"maths\"]\n        md4cObj: put'modl [name: \"md4c\"]\n        minizObj: put'modl [name: \"miniz\"]\n        NetObj: put'modl [name: \"Net\"]\n        NumbersObj: put'modl [name: \"Numbers\"]\n        parseObj: put'modl [name: \"parse\"]\n        pathObj: put'modl [name: \"path\"]\n        PathsObj: put'modl [name: \"Paths\"]\n        ReflectionObj: put'modl [name: \"Reflection\"]\n        replObj: put'modl [name: \"repl\"]\n        SetsObj: put'modl [name: \"Sets\"]\n        stackObj: put'modl [name: \"stack\"]\n        stringsObj: put'modl [name: \"strings\"]\n        StringsObj: put'modl [name: \"Strings\"]\n        SystemObj: put'modl [name: \"System\"]\n        templatesObj: put'modl [name: \"templates\"]\n        tomlObj: put'modl [name: \"toml\"]\n        UiObj: put'modl [name: \"Ui\"]\n        unisortObj: put'modl [name: \"unisort\"]\n        urlObj: put'modl [name: \"url\"]\n        valueObj: put'modl [name: \"value\"]\n        versionObj: put'modl [name: \"version\"]\n        vmObj: put'modl [name: \"vm\"]\n        webviewObj: put'modl [name: \"webview\"]\n        link'rel valueObj bignumObj\n        link'rel errorsObj stringsObj\n        link'rel valueObj errorsObj\n        link'rel envObj valueObj\n        link'rel evalObj debugObj\n        link'rel globalsObj errorsObj\n        link'rel globalsObj valueObj\n        link'rel bytecodeObj globalsObj\n        link'rel bytecodeObj valueObj\n        link'rel evalObj bytecodeObj\n        link'rel evalObj globalsObj\n        link'rel evalObj valueObj\n        link'rel parseObj errorsObj\n        link'rel parseObj valueObj\n        link'rel stackObj valueObj\n        link'rel execObj bytecodeObj\n        link'rel execObj errorsObj\n        link'rel execObj evalObj\n        link'rel execObj globalsObj\n        link'rel execObj parseObj\n        link'rel execObj stackObj\n        link'rel execObj valueObj\n        link'rel vmObj envObj\n        link'rel vmObj errorsObj\n        link'rel vmObj evalObj\n        link'rel vmObj execObj\n        link'rel vmObj globalsObj\n        link'rel vmObj parseObj\n        link'rel vmObj stackObj\n        link'rel vmObj valueObj\n        link'rel vmObj versionObj\n        link'rel libObj globalsObj\n        link'rel libObj errorsObj\n        link'rel libObj stackObj\n        link'rel libObj valueObj\n        link'rel ArithmeticObj libObj\n        link'rel vmObj ArithmeticObj\n        link'rel BinaryObj libObj\n        link'rel vmObj BinaryObj\n        link'rel arraysObj valueObj\n        link'rel CollectionsObj arraysObj\n        link'rel unisortObj valueObj\n        link'rel CollectionsObj unisortObj\n        link'rel CollectionsObj libObj\n        link'rel vmObj CollectionsObj\n        link'rel ComparisonObj libObj\n        link'rel vmObj ComparisonObj\n        link'rel ConvertersObj bignumObj\n        link'rel urlObj valueObj\n        link'rel datasourceObj urlObj\n        link'rel ConvertersObj datasourceObj\n        link'rel ConvertersObj stringsObj\n        link'rel ConvertersObj libObj\n        link'rel ConvertersObj errorsObj\n        link'rel ConvertersObj execObj\n        link'rel ConvertersObj parseObj\n        link'rel vmObj ConvertersObj\n        link'rel CoreObj datasourceObj\n        link'rel ffiObj errorsObj\n        link'rel ffiObj valueObj\n        link'rel CoreObj ffiObj\n        link'rel CoreObj libObj\n        link'rel CoreObj envObj\n        link'rel CoreObj errorsObj\n        link'rel CoreObj evalObj\n        link'rel CoreObj execObj\n        link'rel CoreObj parseObj\n        link'rel vmObj CoreObj\n        link'rel CryptoObj libObj\n        link'rel vmObj CryptoObj\n        link'rel databaseObj valueObj\n        link'rel DatabasesObj databaseObj\n        link'rel DatabasesObj libObj\n        link'rel vmObj DatabasesObj\n        link'rel DatesObj libObj\n        link'rel vmObj DatesObj\n        link'rel htmlObj valueObj\n        ; link'rel markdownObj md4cObj\n        ; link'rel markdownObj valueObj\n        ; link'rel tomlObj valueObj\n        ; link'rel FilesObj minizObj\n        ; link'rel FilesObj htmlObj\n        ; link'rel FilesObj markdownObj\n        ; link'rel FilesObj tomlObj\n        ; link'rel csvObj valueObj\n        ; link'rel FilesObj csvObj\n        ; link'rel FilesObj datasourceObj\n        ; link'rel jsonobjectObj valueObj\n        ; link'rel FilesObj jsonobjectObj\n        ; link'rel FilesObj libObj\n        ; link'rel vmObj FilesObj\n        ; link'rel replObj valueObj\n        ; link'rel IoObj replObj\n        ; link'rel IoObj libObj\n        ; link'rel IoObj evalObj\n        ; link'rel IoObj execObj\n        ; link'rel vmObj IoObj\n        ; link'rel IteratorsObj libObj\n        ; link'rel IteratorsObj errorsObj\n        ; link'rel IteratorsObj evalObj\n        ; link'rel IteratorsObj execObj\n        ; link'rel vmObj IteratorsObj\n        ; link'rel LogicObj libObj\n        ; link'rel LogicObj execObj\n        ; link'rel vmObj LogicObj\n        ; link'rel NetObj webviewObj\n        ; link'rel NetObj libObj\n        ; link'rel NetObj envObj\n        ; link'rel NetObj execObj\n        ; link'rel vmObj NetObj\n        ; link'rel NumbersObj bignumObj\n        ; link'rel mathsObj bignumObj\n        ; link'rel mathsObj valueObj\n        ; link'rel NumbersObj mathsObj\n        ; link'rel NumbersObj libObj\n        ; link'rel vmObj NumbersObj\n        ; link'rel pathObj valueObj\n        ; link'rel PathsObj pathObj\n        ; link'rel PathsObj urlObj\n        ; link'rel PathsObj libObj\n        ; link'rel PathsObj envObj\n        ; link'rel vmObj PathsObj\n        ; link'rel ReflectionObj benchmarkObj\n        ; link'rel helperObj globalsObj\n        ; link'rel helperObj valueObj\n        ; link'rel ReflectionObj helperObj\n        ; link'rel ReflectionObj libObj\n        ; link'rel ReflectionObj envObj\n        ; link'rel ReflectionObj execObj\n        ; link'rel vmObj ReflectionObj\n        ; link'rel SetsObj libObj\n        ; link'rel vmObj SetsObj\n        ; link'rel StringsObj stringsObj\n        ; link'rel templatesObj execObj\n        ; link'rel templatesObj parseObj\n        ; link'rel templatesObj stackObj\n        ; link'rel templatesObj valueObj\n        ; link'rel StringsObj templatesObj\n        ; link'rel StringsObj libObj\n        ; link'rel vmObj StringsObj\n        ; link'rel SystemObj libObj\n        ; link'rel SystemObj errorsObj\n        ; link'rel SystemObj execObj\n        ; link'rel vmObj SystemObj\n        ; link'rel UiObj libObj\n        ; link'rel UiObj jsonobjectObj\n        ; link'rel UiObj urlObj\n        ; link'rel UiObj webviewObj\n        ; link'rel UiObj envObj\n        ; link'rel UiObj execObj\n        ;link'rel vmObj UiObj\n        ;link'rel arturoObj versionObj\n        link'rel arturoObj valueObj\n        link'rel arturoObj vmObj\n                \n        preview fetch 'modl ø\n    ]\n]"
  },
  {
    "path": "grafito.art",
    "content": "#!/usr/bin/env arturo\n;========================================================\n; Grafito\n;\n; SQLite-based Graph Database\n; in Arturo\n;--------------------------------------------------------\n;; name: grafito\n;; version: 0.2.12\n;; author: drkameleon\n;; website: « https://github.com/arturo-lang/grafito\n;; category: database\n;; embed: [\n;;      \"ui\" \"sql\"\n;;      \".art\" \".sql\" \".html\" \".less\" \".js\"\n;; ]\n;========================================================\n\n;--------------------------\n; The main library\n;--------------------------\n\nGrafito: #[\n    ; version\n    Version: 0.2.12\n \n    ; configuration\n    Debug?: false\n    verbose?: true\n    caseSensitive?: true\n\n    ; colors\n    Palette: \"\"\n]\n\n;\n; Define custom objects\n;--------------------------\ndefine :edgeFilter [direction, content, properties]\n\n;----------------------------------------------\n\ngraph: function [\n    dbpath :string :null\n    body :block\n][\n    ;; description: « initiate a new graph environment with given name and body\n    ;; options: [\n    ;;      create: « recreate database from scratch, even if it exists\n    ;;      case: « queries should be case-sensitive\n    ;;      verbose: « show messages regarding database operations\n    ;;      palette: :string :literal « select color palette (current: default)\n    ;; ]\n    ;; returns: :any\n    ;; example: {\n    ;;      graph \"mydb\" [\n    ;;          ; do sth with this graph database\n    ;;      ]\n    ;;      ..........\n    ;;      ; in memory database\n    ;;      graph ø [\n    ;;          ; do sth with this graph database\n    ;;      ]\n    ;; }\n\n    ;==========================================\n    ; CONSTANTS\n    ;==========================================\n\n    ; Global SQL scripts\n\n    schemaSQL:                      split.by:\";\" read.file ./\"sql/schema.sql\"\n\n    createNodeSQL:                  read.file ./\"sql/procs/createNode.sql\"\n    updateNodeSQL:                  read.file ./\"sql/procs/updateNode.sql\"\n    updateNodePropertySQL:          read.file ./\"sql/procs/updateNodeProperty.sql\"\n    updateNodePropertiesSQL:        read.file ./\"sql/procs/updateNodeProperties.sql\"\n    deleteNodeSQL:                  read.file ./\"sql/procs/deleteNode.sql\"\n    deleteNodeEdgesSQL:             read.file ./\"sql/procs/deleteNodeEdges.sql\"\n    getNodeSQL:                     read.file ./\"sql/procs/getNode.sql\"\n    getRelatedNodesSQL:             read.file ./\"sql/procs/getRelatedNodes.sql\"\n    getMaxNodeIdSQL:                read.file ./\"sql/procs/getMaxNodeId.sql\"\n\n    createEdgeSQL:                  read.file ./\"sql/procs/createEdge.sql\"\n    updateEdgeSQL:                  read.file ./\"sql/procs/updateEdge.sql\"\n    deleteEdgeSQL:                  read.file ./\"sql/procs/deleteEdge.sql\"\n    deleteEdgeByIdSQL:              read.file ./\"sql/procs/deleteEdgeById.sql\"\n\n    fetchNodesSQL:                  read.file ./\"sql/procs/fetchNodes.sql\"\n    fetchNodesWithEdgesSQL:         read.file ./\"sql/procs/fetchNodes.withEdges.sql\"\n\n    countNodesSQL:                  read.file ./\"sql/procs/countNodes.sql\"\n    countEdgesSQL:                  read.file ./\"sql/procs/countEdges.sql\"\n\n    ; Global SQL filters\n\n    hasEdgeFilter:                  read.file ./\"sql/filters/hasEdge.sql\"\n    hasPropertyFilter:              read.file ./\"sql/filters/hasProperty.sql\"\n    edgeWithTargetFilter:           read.file ./\"sql/filters/edgeWithTarget.sql\"\n    edgeWithSourceFilter:           read.file ./\"sql/filters/edgeWithSource.sql\"\n    edgeWithAnyFilter:              read.file ./\"sql/filters/edgeWithAny.sql\"\n    edgeWithPropertiesFilter:       read.file ./\"sql/filters/edgeWithProperties.sql\"\n    nodePropertyWithValueFilter:    read.file ./\"sql/filters/nodePropertyWithValue.sql\"\n    edgePropertyWithValueFilter:    read.file ./\"sql/filters/edgePropertyWithValue.sql\"\n\n    ; Global SQL pragmas\n\n    caseInsensitiveLikePragma:      read.file ./\"sql/pragmas/caseInsensitiveLike.sql\"\n    caseSensitiveLikePragma:        read.file ./\"sql/pragmas/caseSensitiveLike.sql\"\n\n    ; Global UI template\n\n    app: read.file ./\"ui/index.html\"\n\n    ; Color palettes\n    ; for graph nodes\n\n    colorPalettes: #.raw flatten.once map list ./\"ui/palettes\" 'pal [\n        @[extract.filename pal, to :block read.file pal]\n    ]\n\n    ;==========================================\n    ; HELPERS\n    ;==========================================\n\n    ;\n    ; Perform query\n    ;--------------------------\n\n    performQuery: function [ctx, qu, params][\n        if and? [Grafito\\Debug?][null? attr 'noDebug] [\n            context: to :string ctx\n            prepend: \" | \"\n            print color.bold #gray \">: \" ++ context\n            \n            queryString: qu\n            if block? qu [\n                queryString: join.with:\"\\n\" qu\n            ]\n\n            print color #gray prepend ++ join.with:\"\\n\"++prepend split.lines queryString\n            inspect params\n            print \"\"\n        ]\n        (not? null? params)? [\n            query db .with: params qu\n        ][\n            query db qu\n        ]\n    ]\n\n    ;\n    ; Print message\n    ;--------------------------\n\n    printDebug: function [msg][\n        print color #cyan \":: \" ++ msg\n    ]\n\n    ;\n    ; Format size\n    ;--------------------------\n\n    formatSize: function [sz][\n        if sz < 1024 -> return sz\n        if sz < 1024*1024 -> return sz --> 'kB\n        if sz < 1024*1024*1024 -> return sz --> 'MB\n        if sz < 1024*1024*1024*1024 -> return sz --> 'GB\n        return @[]\n    ]\n\n    ;\n    ; Get db analytics\n    ;--------------------------\n\n    analytics: function [][\n        nodeCount: to :integer first first performQuery 'analytics countNodesSQL ø\n        edgeCount: to :integer first first performQuery 'analytics countEdgesSQL ø\n        avgDegree: edgeCount // nodeCount\n\n        filename: dbPath\n        filesize: 0\n\n        if not? empty? filename [\n            prefilesize: formatSize volume filename\n            filesize: #[\n                number: to :string scalar prefilesize\n                units: to :string units prefilesize\n            ]\n        ]\n\n        prememory: formatSize process\\memory\\occupied\n        mem: #[\n            number: to :string scalar prememory\n            units: to :string units prememory\n        ]\n\n        return #[\n            database: #[\n                nodes: nodeCount\n                edges: edgeCount\n                degree: to :floating to :string .format: \".2f\" avgDegree\n            ]\n            memory: mem\n            disk: #[\n                path: filename\n                size: filesize\n            ]\n        ]\n    ]\n\n    ;\n    ; Get suitable fg color\n    ; depending on node bg\n    ; for better contrast\n    ;--------------------------\n\n    idealForeground: function [back][\n        rgbs: values extract back\n\n        lrgbs: map rgbs 'rgb [\n            C: rgb // 255\n            (C =< 0.03928)? -> C: C // 12.92\n                            -> C: ((C+0.055)//1.055) ^ 2.4\n            C\n        ]\n\n        L: (lrgbs\\0*0.2126) + (lrgbs\\1*0.7152) + (lrgbs\\2*0.0722)\n\n        if L > 0.189 [ return #black ]\n        return #white\n    ]\n\n    ;\n    ; Safe SQLite-compatible\n    ; value codification\n    ; including Unicode strings\n    ;--------------------------\n    codifySafe: function [val][\n        (string? val)? [\n            return {\"} ++ (escape.json val) ++ {\"}\n        ][\n            return express val\n        ]\n    ]\n\n    ;\n    ; Get styled node\n    ; ready for use in the\n    ; graph view\n    ;--------------------------\n\n    styleNode: function [nodeId, nodeTag, nodeProps][\n        if not? key? Grafito\\nodeColors nodeTag [\n            cpal: Grafito\\Palette\n            cpal: colorPalettes\\[cpal]\n\n            nodeColor: sample cpal\n            existingColors: map values Grafito\\nodeColors => first\n            \n            while [contains? existingColors nodeColor] ->\n                nodeColor: sample cpal\n\n            Grafito\\nodeColors\\[nodeTag]: @[\n                nodeColor\n                idealForeground nodeColor\n            ]\n\n            updateMeta 'colors Grafito\\nodeColors\n        ]\n\n        bg: to :string Grafito\\nodeColors\\[nodeTag]\\0\n        fg: to :string Grafito\\nodeColors\\[nodeTag]\\1\n\n        nodeLabel: first values nodeProps\n\n        highlightField: #[\n            border: express darken to :color bg 0.2\n            background: bg\n        ]\n\n        return #[\n            id: to :integer nodeId\n            tag: nodeTag\n            properties: nodeProps\n            label: truncate nodeLabel 10\n            fullLabel: nodeLabel\n            color: #[\n                border: bg\n                background: bg\n                hover: bg\n                highlight: highlightField\n            ]\n            font: #[\n                color: fg\n            ]\n        ]\n    ]\n\n    ;\n    ; Create new edge\n    ;--------------------------\n\n    edge: function [\n        src :integer :dictionary \n        name :literal :string\n        tgt :integer :dictionary\n    ][\n        ;; description: « create edge from source to target node with given name\n        ;; returns: :dictionary\n        srcId: src\n        tgtId: tgt\n\n        props: (attr \"\") ?? #[]\n        unless dictionary? props -> props: # props\n\n        if dictionary? srcId -> srcId: src\\id\n        if dictionary? tgtId -> tgtId: tgt\\id\n\n        edgeId: performQuery.id 'edge createEdgeSQL @[name, write.compact.json props ø, srcId, tgtId]\n\n        #[\n            id: edgeId\n            tag: name\n            properties: props\n            source: src\n            target: tgt\n        ]\n    ]\n\n    ;\n    ; Delete existing edge\n    ;--------------------------\n\n    unedge: function [\n        src :integer\n        name :literal :string\n        tgt :integer\n    ][\n        ;; description: « delete edge from source to target node with given name\n\n        performQuery 'unedge deleteEdgeSQL @[name, src, tgt]\n    ]\n\n    ;\n    ; Delete existing edge \n    ; by id\n    ;--------------------------\n\n    unedgeById: function [\n        eid :integer\n    ][\n        ;; description: « delete edge with given id\n\n        performQuery 'unedgeById deleteEdgeByIdSQL @[eid]\n    ]\n\n    ;\n    ; Update single property\n    ; by id\n    ;--------------------------\n\n    editProperty: function [\n        nid :integer\n        prop :literal :string\n        val :any\n    ][\n        ;; description: « set or update single node property\n\n        performQuery 'editProperty updateNodePropertySQL @[~\"$.|prop|\", write.compact.json val ø, nid]\n    ]\n\n    ;\n    ; Update meta value\n    ;--------------------------\n\n    updateMeta: function [\n        prop :literal :string\n        val :any\n    ][\n        ;; description: « update a single meta value\n\n        editProperty 1 prop val\n    ]\n\n    ;\n    ; Re-tag existing edge \n    ; by id\n    ;--------------------------\n\n    retagEdge: function [\n        eid :integer\n        tag :literal :string\n    ][\n        ;; description: « update edge with given tag\n\n        performQuery 'retag updateEdgeSQL @[tag, eid]\n    ]\n\n    ;\n    ; Get node with properties\n    ; from ID\n    ;--------------------------\n\n    nodeFromId: function [nid][\n        results: performQuery 'nodeFromId getNodeSQL @[nid]\n        \n        if empty? results ->\n            return ø \n\n        return #[\n            id: nid\n            tag: first first results\n            properties: read.json last first results\n        ]\n    ]\n\n    ;\n    ; Get nodeset \n    ; for graph visualization\n    ;--------------------------\n\n    nodeFromIds: function [nodes][\n        nodeset: nodes\n        if not? block? nodeset ->\n            nodeset: @[nodeset]\n\n        nodeElements: map nodeset 'nd -> styleNode nd\\id nd\\tag nd\\properties\n        edgeElements: new []\n\n        loop nodeset [nd][\n            rezu: performQuery 'nodeFromIds getRelatedNodesSQL @[nd\\id, nd\\id, nd\\id]\n\n            loop rezu [rez][\n                'nodeElements ++ styleNode rez\\0 rez\\1 read.json rez\\2\n                'edgeElements ++ #[\n                    id: ~\"|rez\\3|+|rez\\4|+|rez\\5|\"\n                    dbId: rez\\6\n                    label: rez\\5\n                    properties: read.json rez\\7\n                    from: to :integer rez\\3\n                    to: to :integer rez\\4\n                ]\n            ]\n        ]\n\n        unique 'nodeElements\n        unique 'edgeElements\n\n        return #[\n            nodes: nodeElements\n            edges: edgeElements\n        ]\n    ]\n\n    ;\n    ; Generate access helper\n    ;--------------------------\n    generateHelper: function [id,block][\n        (not? null? attr 'new)? [\n            put id block\n        ][\n            fetch id block\n        ]\n    ]\n\n    ;==========================================\n    ; REPL\n    ;==========================================\n\n    ;\n    ; Switch verbosity on/off\n    ;--------------------------\n\n    verbose: function [] [\n        Grafito\\verbose?: not? Grafito\\verbose?\n    ]\n\n    ;==========================================\n    ; METHODS\n    ;==========================================\n\n    ;\n    ; Create new node\n    ;--------------------------\n    \n    put: function [\n        name :literal :string\n        attributes :string :block :dictionary\n    ][\n        ;; description: « insert new node(s) to graph with given name and attributes\n        ;; options: [\n        ;;      unique: « add only if node doesn't already exist\n        ;;      many: « add multiple nodes at once\n        ;; ]\n        ;; returns: :dictionary :block\n\n        if attr \"unique\" [\n            found: fetch name attributes\n            if not? empty? found -> return found\n        ]\n\n        result: new []\n\n        (not? null? attr 'many)? [\n            lastId: to :integer first first performQuery 'put getMaxNodeIdSQL ø\n            queries: new []\n            vals: new []\n            loop attributes 'nd [\n                lastId: lastId + 1\n                att: nd\n                (block? att)? -> att: # att [\n                    (string? att)? -> att: #[\n                        name: att\n                    ] []\n                ]\n                'queries ++ createNodeSQL\n                'vals ++ @[name, write.compact.json att ø]\n                'result ++ #[\n                    id: lastId\n                    tag: name\n                    properties: att\n                ]\n            ]\n            performQuery 'put queries vals\n\n            if Grafito\\verbose? ->\n                 printDebug ~{created |size attributes| nodes}\n        ] [\n            att: attributes\n            (block? att)? -> att: # att [\n                (string? att)? -> att: #[\n                    name: att\n                ] []\n            ]\n            nodeId: performQuery.id 'put createNodeSQL @[name, write.compact.json att ø]\n            result: #[\n                id: nodeId\n                tag: name\n                properties: att\n            ]\n\n            if Grafito\\verbose? ->\n                printDebug ~{created 1 node (@|nodeId|) with |size att| propert|(1 = size att)? -> \"y\" -> \"ies\"|}\n        ]\n    \n        return result\n    ]\n\n    ;\n    ; Update existing node\n    ;--------------------------\n\n    edit: function [\n        nd :dictionary :block\n        attributes :block :dictionary\n    ][\n        ;; description: « update given node(s) with attributes\n        ;; options: [\n        ;;      tag: :literal :string « also set new tag\n        ;;      replace: « replace entire object properties with given ones\n        ;; ]\n        ;; returns: :nothing\n\n        toUpdate: ø\n\n        (dictionary? nd)? ->\n            toUpdate: @[nd]\n        ->\n            toUpdate: new nd\n\n        doReplace?: not? null? attr 'replace\n        withTag: attr 'tag\n\n        additional: attributes\n        if block? additional ->\n            additional: # additional\n\n        loop toUpdate 'updateable [\n            newAttributes: ø\n\n            (doReplace?)? ->\n                newAttributes: additional\n            ->\n                newAttributes: extend updateable\\properties additional\n\n            updateable\\properties: newAttributes\n            (null? withTag)? ->\n                performQuery 'edit updateNodePropertiesSQL @[write.compact.json newAttributes ø, updateable\\id]\n            ->\n                performQuery 'edit updateNodeSQL @[withTag, write.compact.json newAttributes ø, updateable\\id]\n        ]\n    ]\n\n    ;\n    ; Delete existing node\n    ;--------------------------\n\n    unput: function [\n        nd :integer :dictionary :block\n    ][\n        ;; description: « remove given node(s) from graph\n        ;; returns: :nothing\n\n        toDelete: ø\n\n        (block? nd)? ->\n            toDelete: new nd\n        ->\n            toDelete: @[nd]\n\n        loop toDelete 'deletable [\n            nodeId: (dictionary? deletable) ? -> deletable\\id -> deletable\n\n            performQuery 'unput @[\n                deleteNodeSQL, deleteNodeEdgesSQL\n            ] @[\n                nodeId, nodeId, nodeId\n            ]\n        ]\n    ]\n\n    ;\n    ; Link nodes with edges\n    ;--------------------------\n\n    link: function [\n        src :block :dictionary\n        name :literal :string\n        tgt :block :dictionary\n    ]\n    [\n        ;; description: « create a connection from source to target node with given name\n        ;; returns: :block :dictionary\n\n        edgeId: 0\n\n        (:dictionary = type tgt)? [\n            edges: new []\n            if :dictionary = type src [\n                ret: edge src name tgt\n                return ret\n            ]\n\n            sr: @ src\n            loop sr [s]->\n                'edges ++ edge s name tgt\n        \n            if Grafito\\verbose? -> printDebug ~\"created |size edges| edges\"\n\n            return edges\n        ][\n            edges: new []\n            tg: @ tgt\n            (:dictionary = type src)? [\n                loop tg [t][\n                    'edges ++ edge src name t\n                ]\n            ][\n                sr: @ src\n                loop sr [s] [\n                    loop tg [t]->\n                        'edges ++ edge s name t\n                ]\n            ]\n\n            if Grafito\\verbose? -> printDebug ~\"created |size edges| edges\"\n\n            return edges\n        ]\n    ]\n\n    reverseLink: function [\n        tgt :block :dictionary\n        name :literal :string\n        src :block :dictionary\n    ][\n        link src name tgt\n    ]\n\n    reciprocalLink: function [\n        src :block :dictionary\n        name :literal :string\n        tgt :block :dictionary\n    ][\n        link src name tgt\n        link tgt name src\n    ]\n\n    ;\n    ; Delete node edges\n    ;--------------------------\n\n    unlink: function [\n        src :integer :dictionary :block\n        name :literal :string\n        tgt :integer :dictionary :block\n    ][\n        ;; description: « remove connection from source to target node with given name\n\n        nodesFrom: new []\n        nodesTo: new []\n\n        ;case [(type src)=]\n        (dictionary? src)? -> nodesFrom: @[src\\id]\n        [\n            (integer? src)? -> nodesFrom: @[src]\n            [\n                nodesFrom: new map src 'n [\n                    (dictionary? n)? -> n\\id\n                    -> n\n                ]\n            ]\n        ]\n\n            ; when? -> :dictionary -> nodesFrom: @[src\\id]\n            ; when? -> :integer -> nodesFrom: @[src]\n            ; else  -> nodesFrom: new map src 'n [\n            ;     if? dictionary? n -> n\\id\n            ;     else -> n\n            ; ]\n\n        (dictionary? tgt)? -> nodesFrom: @[tgt\\id]\n        [\n            (integer? tgt)? -> nodesFrom: @[tgt]\n            [\n                nodesFrom: new map tgt 'n [\n                    (dictionary? n)? -> n\\id\n                    -> n\n                ]\n            ]\n        ]\n\n        ; if?case [(type tgt)=]\n        ;     when? -> :dictionary -> nodesTo: @[tgt\\id]\n        ;     when? -> :integer -> nodesTo: @[tgt]\n        ;     else  -> nodesTo: new map tgt 'n [\n        ;         if? dictionary? n -> n\\id\n        ;         else -> n\n        ;     ]\n\n        loop nodesFrom 'nf [\n            loop nodesTo 'nt [\n                unedge nf name nt\n            ]\n        ]\n\n        if Grafito\\verbose? [\n            totalEdges: mul size nodesFrom size nodesTo\n            edgeLabel: (totalEdges = 1) ? -> \"edge\" -> \"edges\"\n            printDebug ~\"removed |totalEdges| |edgeLabel|\"\n        ]\n    ]\n\n    ;\n    ; Check node type\n    ;--------------------------\n    \n    isA?: function [ls,nd][\n        nd\\tag = to :string ls\n    ]\n\n    ;\n    ; Helpers\n    ; for edge filters\n    ;--------------------------\n    edgeFilterRight: function [cnt, props][\n        pp: props\n        if block? pp -> pp: # pp\n        to :edgeFilter @[1, cnt, pp]\n    ]\n\n    edgeFilterLeft: function [cnt, props][\n        pp: props\n        if block? pp -> pp: # pp\n        to :edgeFilter @[2, cnt, pp]\n    ]\n\n    edgeFilterAny: function [cnt, props][\n        pp: props\n        if block? pp -> pp: # pp\n        to :edgeFilter @[3, cnt, pp]\n    ]\n\n    ;\n    ; Fetch all results for tag\n    ; with given properties\n    ; and edges\n    ;--------------------------\n\n    fetch: function [\n        name :literal :string\n        attributes :null :string :block :dictionary\n    ][\n        ;; description: « retrieves nodes with name that match all given attributes\n        ;; options: [\n        ;;      .any « try matching any of the attributes\n        ;; ]\n        ;; returns: :block\n        \n        ;; setup main variables\n\n        catchAny?: false\n        if not? null? attr \"any\" ->\n            catchAny?: true\n\n        collator: \"\"\n        if not? Grafito\\caseSensitive? ->\n            collator: \" COLLATE NOCASE\"\n\n        propertyFilters: new []\n        edgeFilters: new []\n        qvals: new @[name]\n        qpropvals: new []\n        qedgevals: new []\n\n        att: new attributes\n\n        (string? att)? [\n            [collate,symb,val]: @[collator, \"=\", codifySafe att]\n            \n            ; add it once (to check for `name`)\n            'propertyFilters ++ ~nodePropertyWithValueFilter\n            'qpropvals ++ @[~\"$.name\"]\n\n            ; add it once more (to check for `title`)\n            'propertyFilters ++ ~nodePropertyWithValueFilter\n            'qpropvals ++ @[~\"$.title\"]\n\n            ; we won't it to be valid when any of the two criteria above is true\n            ; so we'll have to forcefully set `catchAny?` to true\n            catchAny?: true\n        ]\n        [\n            if and? not? dictionary? att \n                    not? null? att ->\n                att: # att\n\n            ; ; HACK - to solve\n            ; remove.key 'att 'n\n            ; remove.key 'att 'a\n\n            if not? empty? att [\n                loop att [k,v][\n                    if null? v [\n                        ; it's an edge filter without criteria\n                        'edgeFilters ++ hasEdgeFilter\n                        'qedgevals ++ @[k]\n                        continue\n                    ]\n                    if dictionary? v [\n                        ; it's an edge filter\n                        searchForProperties: \"\"\n                        'edgeFilters ++ ~edgeWithTargetFilter\n                        'qedgevals ++ @[k, v\\id]\n                        continue\n                    ]\n                    if is? :edgeFilter v [\n                        ; it's a directed edge filter\n                        if dictionary? v\\content [\n                            searchForProperties: \"\"\n                            subfilters: []\n                            subvals: []\n                            if not? empty? v\\properties [\n                                collator: \"\"\n                                if not? Grafito\\caseSensitive? ->\n                                    collator: \" COLLATE NOCASE\"\n\n                                subfilters: new []\n                                loop v\\properties [kk,vv][\n                                    [collate,symb,val]: @[collator, \"=\", codifySafe vv]\n                                    subvals: subvals ++ ~\"$.|kk|\"\n                                    subfilters: subfilters ++ ~edgePropertyWithValueFilter\n                                ]\n                                subfilters: join.with:\" AND \" subfilters\n                                searchForProperties: ~\"AND (|subfilters|)\"\n                            ]\n                                    \n                            (v\\direction = 1)? [\n                                'edgeFilters ++ ~edgeWithTargetFilter\n                                'qedgevals ++ @[k, v\\content\\id] ++ subvals\n                            ][\n                                (v\\direction = 2)? [\n                                    'edgeFilters ++ ~edgeWithSourceFilter\n                                    'qedgevals ++ @[k, v\\content\\id] ++ subvals\n                                ][\n                                    (v\\direction = 3)? [\n                                        'edgeFilters ++ ~edgeWithAnyFilter \n                                        'qedgevals ++ @[k, v\\content\\id, v\\content\\id] ++ subvals\n                                    ][\n                                        print \"Shouldn't have reached here!\"\n                                    ]\n                                ]\n                            ]\n                        ]\n                        if all? @[\n                            block? v\\content\n                            or? \n                                and? [0 < size v\\content]\n                                     [:dictionary = type first v\\content]\n                                not? empty? v\\properties\n                        ][\n                            searchForProperties: \"\"\n                            subfilters: []\n                            subvals: []\n                            if not? empty? v\\properties [\n                                collator: \"\"\n                                if not? Grafito\\caseSensitive? ->\n                                    collator: \" COLLATE NOCASE\"\n\n                                subfilters: new []\n                                loop v\\properties [kk,vv][\n                                    [collate,symb,val]: @[collator, \"=\", codifySafe vv]\n                                    subvals: subvals ++ ~\"$.|kk|\"\n                                    subfilters: subfilters ++ ~edgePropertyWithValueFilter\n                                ]\n                                subfilters: join.with:\" AND \" subfilters\n                                searchForProperties: ~\"AND (|subfilters|)\"\n                            ]\n\n                            orCriteria: new []\n                            (0 < size v\\content)? [\n                                loop v\\content [edgef][\n                                    (v\\direction = 1)? [\n                                        'orCriteria ++ ~edgeWithTargetFilter\n                                        'qedgevals ++ @[k, edgef\\id] ++ subvals\n                                    ][\n                                        (v\\direction = 2)? [\n                                            'orCriteria ++ ~edgeWithSourceFilter\n                                            'qedgevals ++ @[k, edgef\\id] ++ subvals\n                                        ][\n                                            (v\\direction = 3)? [\n                                                'orCriteria ++ ~edgeWithAnyFilter \n                                                'qedgevals ++ @[k, edgef\\id, edgef\\id] ++ subvals\n                                            ][\n                                                print \"Shouldn't have reached here!\"\n                                            ]\n                                        ]\n                                    ]\n                                ]\n                            ][\n                                'orCriteria ++ ~edgeWithPropertiesFilter\n                                'qedgevals ++ @[k] ++ subvals\n                            ]\n                            'edgeFilters ++ \"(\" ++ (join.with:\" OR \" orCriteria) ++ \")\"\n                        ]\n                        continue\n                    ]\n                    if block? v [\n                        (and? 0 < size v \n                                :dictionary = type first v)? [\n                            ; it's an array of edge filters\n                            orCriteria: new []\n                            loop v [edgef][\n                                searchForProperties: \"\"\n                                'orCriteria ++ ~edgeWithTargetFilter\n                                'qedgevals ++ @[k, edgef\\id]\n                            ]\n                            'edgeFilters ++ \"(\" ++ (join.with:\" OR \" orCriteria) ++ \")\"\n                        ]\n                        [\n                            ; it's a complex property filter\n                            loop # v [filt,rg][\n\n                                [collate,symb,val]: @[collator, \"=\", v]\n                                requiresCodification: true\n\n                                (filt = \"contains\")? -> [collate,symb,val]: @[\"\", \"LIKE\", ~\"%|rg|%\"]\n                                [\n                                    (filt = \"prefix\")? -> [collate,symb,val]: @[\"\", \"LIKE\", ~\"|rg|%\"]\n                                    [\n                                        (filt = \"suffix\")? -> [collate,symb,val]: @[\"\", \"LIKE\", ~\"%|rg|\"]\n                                        [\n                                            (filt = \"under\")? -> [collate,symb,val]: @[\"\", \"<\", rg]\n                                            [\n                                                (filt = \"over\")? -> [collate,symb,val]: @[\"\", \">\", rg]\n                                                [\n                                                    (filt = \"underOrEqual\")? -> [collate,symb,val]: @[\"\", \"<=\", rg]\n                                                    [\n                                                        (filt = \"overOrEqual\")? -> [collate,symb,val]: @[\"\", \">=\", rg]\n                                                        [\n                                                            (filt = \"in\")? [\n                                                                [collate,symb,val]: @[collator, \"IN\", \"(\" ++ (join.with:\", \" map rg [x][codifySafe x]) ++ \")\"]\n                                                                requiresCodification: false\n                                                            ][\n                                                                (filt = \"not\")? [ \n                                                                    (block? rg)?       [\n                                                                                          [collate,symb,val]: @[collator, \"NOT IN\", \"(\" ++ (join.with:\", \" map rg [x][codifySafe x]) ++ \")\"]\n                                                                                          requiresCodification: false\n                                                                                       ]\n                                                                                       -> [collate,symb,val]: @[collator, \"!=\", rg]\n                                                                ]\n                                                                [\n                                                                    panic.code: 1 ~\"filter: |filt| not recognized\"\n                                                                ]\n                                                            ]\n                                                        ]\n                                                    ]\n                                                ]\n                                            ]\n                                        ]\n                                    ]\n                                ]\n                                ; case [equal? filt]\n        \n                                ;     when? [\"contains\"]      -> [collate,symb,val]: @[\"\", \"LIKE\", ~\"%|rg|%\"]\n                                ;     when? [\"prefix\"]        -> [collate,symb,val]: @[\"\", \"LIKE\", ~\"|rg|%\"]\n                                ;     when? [\"suffix\"]        -> [collate,symb,val]: @[\"\", \"LIKE\", ~\"%|rg|\"]\n                                ;     when? [\"under\"]         -> [collate,symb,val]: @[\"\", \"<\", rg]\n                                ;     when? [\"over\"]          -> [collate,symb,val]: @[\"\", \">\", rg]\n                                ;     when? [\"underOrEqual\"]  -> [collate,symb,val]: @[\"\", \"<=\", rg]\n                                ;     when? [\"overOrEqual\"]   -> [collate,symb,val]: @[\"\", \">=\", rg]\n                                ;     when? [\"in\"]            -> [collate,symb,val]: @[collator, \"IN\", ~{(|join.with:\", \" map rg [x][\"'\" ++ (to :string x) ++ \"'\"]|)}]\n                                ;     when? [\"not\"][     \n                                ;         if? block? rg       -> [collate,symb,val]: @[collator, \"NOT IN\", ~{(|join.with:\", \" map rg [x][\"'\" ++ (to :string x) ++ \"'\"]|)}]\n                                ;         else                -> [collate,symb,val]: @[collator, \"!=\", rg]\n                                ;     ]\n                                ;     else [\n                                ;         panic.code: 1 ~\"filter: |filt| not recognized\"\n                                ;     ]\n                                \n                                if requiresCodification ->\n                                    val: codifySafe val\n                                'propertyFilters ++ ~nodePropertyWithValueFilter\n                                'qpropvals ++ @[~\"$.|k|\"]\n                            ]\n                        ]\n                        continue\n                    ]\n                    if logical? v [\n                        ; it's a simple property filter without criteria\n                        'propertyFilters ++ hasPropertyFilter\n                        'qpropvals ++ @[~\"$.|k|\"]\n                        continue\n                    ]\n                        \n                    ; it's a simple property filter\n                    [collate,symb,val]: @[collator, \"=\", codifySafe v]\n    \n                    'propertyFilters ++ ~nodePropertyWithValueFilter\n                    'qpropvals ++ @[~\"$.|k|\"]\n                ]\n            ]\n        ]\n\n        qr: \"\"\n\n        propies: \"\"\n        linker: \" AND \"\n        edgeLimit: ~\" = |size edgeFilters|\"\n\n        if catchAny? [\n            linker: \" OR \"\n            edgeLimit: \" >= 1\"\n        ]\n\n        if not? empty? propertyFilters [\n            propies: ~{!sql AND (|join.with: linker propertyFilters|)}\n            'qvals ++ qpropvals\n        ]\n\n        (not? empty? edgeFilters)? [\n            edgies: join.with: \" OR \" edgeFilters\n            'qvals ++ qedgevals\n\n            qr: ~fetchNodesWithEdgesSQL\n        ]\n        [\n            qr: ~fetchNodesSQL\n        ]\n\n        return map performQuery 'fetch qr qvals 'x [\n            #[\n                id: x\\0\n                tag: x\\1\n                properties: read.json x\\2\n            ]\n        ]\n    ]\n\n    ;\n    ; Visualize given nodeset\n    ;--------------------------\n\n    preview: function [\n        nodeset :block\n    ][\n        ;; description: « preview given set of nodes in Grafito's UI\n        ;; options: [\n        ;;      server: « start Grafito as a server\n        ;; ]\n\n        currentNodes: new nodeset\n        currentDataset: new nodeFromIds currentNodes\n\n        Versions: #[\n            engine: to :version first split.by:\" \" execute \"sqlite3 --version\"\n            system: Grafito\\Version\n            arturo: strip replace execute \"arturo -v\" [\"arturo\" \"v/\"] \"\"\n        ]\n\n        routes: [\n            GET \"/\" [\n                render.template app\n            ]\n\n            POST \"/startup\" [\n                write.json #[\n                    title: cleanpath\n                    data: currentDataset\n                    rows: currentNodes\n                    versions: Versions\n                    caseSensitive: Grafito\\caseSensitive?\n                    palettes: colorPalettes\n                    activePalette: Grafito\\Palette\n                ] ø\n            ]\n\n            POST \"/exec\" $[command][\n                err: try [\n                    if Grafito\\verbose? ->\n                        printDebug \"<== \" ++ command\n                    currentNodes: \"\"\n                    bench: benchmark.get [\n                        currentNodes: new do command\n                    ]\n                    if Grafito\\verbose? -> \n                        printDebug ~\"==> OK (|bench|)\"\n                    (or? [not? block? currentNodes]\n                            [and? [0 < size currentNodes][not? dictionary? first currentNodes]])?[\n                        \"empty\"\n                    ]\n                    [\n                        currentDataset: new nodeFromIds currentNodes\n                        write.json #[\n                            data: currentDataset\n                            rows: currentNodes\n                            timeTaken: scalar bench\n                        ] ø\n                    ]\n                ]\n            ]\n\n            POST \"/nodeFromId\" $[ndid][\n                newNodes: new nodeFromIds @[nodeFromId ndid]\n                write.json newNodes ø\n            ]\n\n            POST \"/changePalette\" $[newpalette, ndids][\n                Grafito\\Palette: newpalette\n                Grafito\\nodeColors: #[]\n                newNodes: new nodeFromIds map split.by:\",\" ndids => nodeFromId\n                updateMeta 'palette Grafito\\Palette\n                updateMeta 'colors Grafito\\nodeColors\n                write.json newNodes ø\n            ]\n\n            POST \"/deleteNode\" $[ndid][\n                unput to :integer ndid\n                \"\"\n            ]\n\n            POST \"/updateNode\" $[ndid,newtag,props][\n                nd: nodeFromId ndid\n                edit.replace.tag:newtag nd read.json props\n                \"\"\n            ]\n\n            POST \"/createNode\" $[newtag,props][\n                created: put newtag read.json props\n                write.json new nodeFromIds created ø\n            ]\n\n            POST \"/linkNodes\" $[newtag,src,tgt][\n                srcid: to :integer src\n                tgtid: to :integer tgt\n                edge srcid newtag tgtid\n                \"\"\n            ]\n\n            POST \"/updateEdge\" $[egid,newtag][\n                eid: to :integer egid\n                retagEdge eid newtag\n                \"\"\n            ]\n\n            POST \"/deleteEdge\" $[egid][\n                edgeParts: split.by:\"+\" egid\n                unlink to :integer edgeParts\\0 \n                       edgeParts\\2 \n                       to :integer edgeParts\\1\n                \"\"\n            ]\n\n            POST \"/updateEngine\" $[caseSensitive][\n                (to :logical caseSensitive)? [\n                    Grafito\\caseSensitive?: true\n                    performQuery 'main caseSensitiveLikePragma ø\n                ]\n                [\n                    Grafito\\caseSensitive?: false\n                    performQuery 'main caseInsensitiveLikePragma ø\n                ]\n                \"\"\n            ]\n\n            POST \"/analytics\" [\n                write.json analytics ø\n            ]\n\n            GET \"/styles/(?<file>.+)\" $[file][\n                read.file ./ ~\"ui/styles/|file|\"\n            ]\n\n            GET \"/scripts/(?<file>.+)\" $[file][\n                (file = \"ace/modes/grafito.js\")? \n                    -> replace read.file ./\"ui/scripts/ace/modes/grafito.js\" \n                            \"CUSTOM_HELPERS\" join.with:\"|\" entities\n                    -> read.file ./ ~\"ui/scripts/|file|\"\n            ]\n\n            GET \"/exit\" [\n                printDebug \"Shutting down\"\n                close db\n                exit\n            ]\n        ]\n\n        (null? attr 'server)? [\n            serve.chrome routes\n        ]\n        [\n            serve.verbose routes\n        ]\n    ]\n\n    ;==========================================\n    ; INITIALIZATION\n    ;==========================================\n\n    ; basic setup\n    Grafito\\verbose?: not? null? attr 'verbose\n    Grafito\\caseSensitive?: null? attr 'nocase\n\n    dbPath: \"\"\n    cleanpath: \"in-memory\"\n    dbExisted: false\n\n    if not? null? dbpath [\n        cleanpath: extract.filename dbpath\n        dbPath: ~\"|cleanpath|.graf\"\n        dbExisted: exists? ~\"|cleanpath|.graf\"\n    ]\n\n    ; setup color palettes\n\n    Grafito\\Palette: attr 'palette\n    if null? Grafito\\Palette ->\n        Grafito\\Palette: \"default\"\n\n    Grafito\\nodeColors: #[]\n\n    ; define aliases\n    alias.infix {~>} 'link\n    alias.infix {<~} 'reverseLink\n    alias.infix {<~>} 'reciprocalLink\n\n    alias {|>} 'edgeFilterRight\n    alias {<|} 'edgeFilterLeft\n    alias {<|>} 'edgeFilterAny\n\n    ; open the database\n    printDebug ~\"DB = |cleanpath|\"\n    db: open dbPath\n\n    dbExists?: true\n\n    ; get helpers\n    entities: attr \"helpers\"\n    if null? entities -> entities: []\n\n    ; and initialize it\n    ; with the given schema (if necessary)\n    (or? not? null? attr \"create\"\n            not? dbExisted)? [\n        dbExists?: false \n        printDebug \"creating database from scratch\"\n        performQuery.noDebug 'main schemaSQL ø\n        \n        metas: #[]\n\n        set metas 'version \"undefined\"\n        set metas 'mode \"json\"\n        set metas 'version Grafito\\Version\n        set metas 'palette Grafito\\Palette\n        set metas 'entities write.json entities ø\n\n        put'meta metas\n        discard unstack 1\n    ][\n        printDebug \"using existing database\"\n        meta: first fetch'meta []\n        \n        Grafito\\nodeColors: read.json meta\\properties\\colors\n        Grafito\\Palette: meta\\properties\\palette\n        entities: read.json meta\\properties\\entities\n    ]\n\n    ; setup pragmas\n    if Grafito\\caseSensitive? ->\n        performQuery 'main caseSensitiveLikePragma ø\n\n    ; create helpers, if any\n    ei: new 0\n    while [ei < size entities] [\n        entity: to :literal entities\\[ei]\n        let entity function [block] with 'entity -> generateHelper entity block\n        inc 'ei\n    ]\n\n    ; process body\n    result: do body\n\n    ; close the database\n    close db\n\n    ; and that was it :)\n    return result\n]\n\n;--------------------------\n; The main entry point\n;--------------------------\n\nif standalone? [\n    ; helpers & templates\n\n    Versions: #[\n        engine: to :version first split.by:\" \" execute \"sqlite3 --version\"\n        system: script\\version\n    ]\n\n    BR: \"\\n\"\n\n    logoTxt: read.file ./\"logo.txt\"\n\n    GrafitoHeader: join @[\n        print color #magenta replace logoTxt {/#(.+)/} (color #white \"$1\") ++ color.keep #magenta \"\"\n        print \"  \"\n        color #gray \"-------------------------------------\" BR\n        color #gray ~\"  system: v/|Versions\\system|, engine: v/|Versions\\engine|\" BR\n        color #gray \"-------------------------------------\" BR\n    ]\n\n    ; methods\n\n    launchTerminal: function [][\n        completions: [\"fetch\" \"put\" \"unput\" \"link\" \"unlink\" \"edge\" \"unedge\"]\n        historyPath: join.path @[path\\home \".arturo\" \"grafito-history.lst\"]\n\n        print \"\"\n        print color #orange \"## Tip: Type `verbose` to switch info messages on/off\"\n        print color #orange \"## Launching Grafito console - rock on! 🤘\"\n        print \"\"\n\n        while ø [\n            Got: null\n\n            indentation: \"\"\n            \n            inp: input .repl\n                    .history: historyPath \n                    .complete: completions\n                    \"$> \" \n\n            while [suffix? inp \" \"][\n                if suffix? strip inp \"[\" [\n                    indentation: indentation ++ \"\\t\"\n                ]\n                inp: inp ++ input \".. \" ++ indentation\n            ]\n\n            err: try.verbose [\n                try.verbose to :block inp\n\n                StackSize: size stack\n                \n                if StackSize > 0 \t\t-> Got: unstack 1\n                if Got <> null \t\t\t-> print color #gray ~\"=> |Got|\"\n\n                print \"\"\n            ]\n        ]\n    ]\n\n    ; startup\n\n    print GrafitoHeader\n\n    if 1 < size arg ->\n        panic \"Too many arguments given!\"\n\n    dbInput: ø\n    if 1 = size arg -> \n        dbInput: arg\\0\n\n    graph dbInput [\n        launchTerminal\n    ]\n]\n\n;==========================================\n; This is the end,\n; my only friend, the end...\n;=========================================="
  },
  {
    "path": "info.art",
    "content": "entry: {grafito}\nexecutable: {grafito}\ndepends: []\nrequires: [> 0.9.83]"
  },
  {
    "path": "logo.txt",
    "content": "                    __ _ _        \n                   / _(_) |       \n    __ _ _ __ __ _| |_ _| |_ ___  \n   / _` | '__/ _` |  _| | __/ _ \\ \n  | (_| | | | (_| | | | | || (_) |\n   \\__, |_|  \\__,_|_| |_|\\__\\___/ \n    __/ |                #(c) 2024\n   |___/        #Yanis Zafirópulos"
  },
  {
    "path": "sql/filters/edgePropertyWithValue.sql",
    "content": "(json_extract(edges.properties, ?)|collate| |symb| |val|)"
  },
  {
    "path": "sql/filters/edgeWithAny.sql",
    "content": "(edges.tag=? AND (edges.target=? OR edges.source=?) |searchForProperties|)"
  },
  {
    "path": "sql/filters/edgeWithProperties.sql",
    "content": "(edges.tag=? AND |searchForProperties|)"
  },
  {
    "path": "sql/filters/edgeWithSource.sql",
    "content": "(edges.tag=? AND edges.source=? |searchForProperties|)"
  },
  {
    "path": "sql/filters/edgeWithTarget.sql",
    "content": "(edges.tag=? AND edges.target=? |searchForProperties|)"
  },
  {
    "path": "sql/filters/hasEdge.sql",
    "content": "(edges.tag=?)"
  },
  {
    "path": "sql/filters/hasProperty.sql",
    "content": "(json_extract(nodes.properties, ?)!='')"
  },
  {
    "path": "sql/filters/nodePropertyWithValue.sql",
    "content": "(json_extract(nodes.properties, ?)|collate| |symb| |val|)"
  },
  {
    "path": "sql/pragmas/caseInsensitiveLike.sql",
    "content": "PRAGMA case_sensitive_like = 0"
  },
  {
    "path": "sql/pragmas/caseSensitiveLike.sql",
    "content": "PRAGMA case_sensitive_like = 1"
  },
  {
    "path": "sql/procs/countEdges.sql",
    "content": "SELECT COUNT(id)\nFROM edges"
  },
  {
    "path": "sql/procs/countNodes.sql",
    "content": "SELECT COUNT(id)\nFROM nodes"
  },
  {
    "path": "sql/procs/createEdge.sql",
    "content": "INSERT INTO edges (tag, properties, source, target) \nVALUES (?, ?, ?, ?)"
  },
  {
    "path": "sql/procs/createNode.sql",
    "content": "INSERT INTO nodes (tag, properties) \nVALUES (?, ?)"
  },
  {
    "path": "sql/procs/deleteEdge.sql",
    "content": "DELETE \nFROM edges \nWHERE tag=? AND source=? AND target=?"
  },
  {
    "path": "sql/procs/deleteEdgeById.sql",
    "content": "DELETE \nFROM edges \nWHERE id=?"
  },
  {
    "path": "sql/procs/deleteNode.sql",
    "content": "DELETE \nFROM nodes \nWHERE id=?"
  },
  {
    "path": "sql/procs/deleteNodeEdges.sql",
    "content": "DELETE \nFROM edges \nWHERE source=? OR target=?"
  },
  {
    "path": "sql/procs/fetchNodes.sql",
    "content": "SELECT nodes.id, nodes.tag, nodes.properties\nFROM nodes\nWHERE nodes.tag=? |propies|"
  },
  {
    "path": "sql/procs/fetchNodes.withEdges.sql",
    "content": "SELECT nodes.id, nodes.tag, nodes.properties\nFROM nodes\nINNER JOIN edges\nON edges.source=nodes.id OR edges.target=nodes.id\nWHERE nodes.tag=? |propies|\nGROUP BY nodes.id \nHAVING COUNT( \n    CASE \n        WHEN |edgies|\n        THEN 1 \n    END \n) |edgeLimit|"
  },
  {
    "path": "sql/procs/getAllNodeTags.sql",
    "content": "SELECT DISTINCT tag \nFROM nodes"
  },
  {
    "path": "sql/procs/getMaxNodeId.sql",
    "content": "SELECT MAX(id) \nFROM nodes"
  },
  {
    "path": "sql/procs/getNode.sql",
    "content": "SELECT nodes.tag, nodes.properties \nFROM nodes \nWHERE nodes.id=?"
  },
  {
    "path": "sql/procs/getRelatedNodes.sql",
    "content": "SELECT nodes.id, nodes.tag, nodes.properties, source, target, edges.tag, edges.id AS label, edges.properties\nFROM edges \nINNER JOIN nodes\nON nodes.id=edges.source OR nodes.id=edges.target\nWHERE (source=? OR target=?) AND (nodes.id<>?)"
  },
  {
    "path": "sql/procs/updateEdge.sql",
    "content": "UPDATE edges \nSET tag=?\nWHERE id=?"
  },
  {
    "path": "sql/procs/updateNode.sql",
    "content": "UPDATE nodes \nSET tag=?, properties=?\nWHERE id=?"
  },
  {
    "path": "sql/procs/updateNodeProperties.sql",
    "content": "UPDATE nodes \nSET properties=?\nWHERE id=?"
  },
  {
    "path": "sql/procs/updateNodeProperty.sql",
    "content": "UPDATE nodes \nSET properties = json_set(properties, ?, ?) \nWHERE id=?"
  },
  {
    "path": "sql/schema.sql",
    "content": "PRAGMA encoding=\"UTF-8\";\n\nDROP TABLE IF EXISTS nodes;\nCREATE TABLE nodes (\n    id          INTEGER PRIMARY KEY,\n    tag         TEXT,\n    properties  JSON NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS node_index ON nodes(id);\nCREATE INDEX IF NOT EXISTS node_tag_index ON nodes(tag);\n\nDROP TABLE IF EXISTS edges;\nCREATE TABLE edges (\n    id          INTEGER PRIMARY KEY,\n    tag         TEXT,\n    properties  JSON NOT NULL,\n    source      INTEGER,\n    target      INTEGER,\n    FOREIGN KEY (source) REFERENCES nodes(id),\n    FOREIGN KEY (target) REFERENCES nodes(id)\n);\n\nCREATE INDEX IF NOT EXISTS edges_index ON edges(id);\nCREATE INDEX IF NOT EXISTS edges_source_index ON edges(source);\nCREATE INDEX IF NOT EXISTS edges_target_index ON edges(target);"
  },
  {
    "path": "ui/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1 maximum-scale=1.0, user-scalable=no\">\n        <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n\n        <title>Grafito</title>\n\n        <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n\n        <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Fira+Code&display=swap\">\n        <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900&display=swap\">\n        <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@200;300;400;600;700;900&display=swap\">\n        <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/gh/Wikiki/bulma-switch@1.0.2/dist/bulma-switch.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/izitoast/1.4.0/css/iziToast.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdn.datatables.net/1.11.3/css/dataTables.bulma.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdn.datatables.net/searchbuilder/1.3.0/css/searchBuilder.bulma.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdn.datatables.net/datetime/1.1.1/css/dataTables.dateTime.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdn.datatables.net/buttons/2.1.0/css/buttons.bulma.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://unpkg.com/tippy.js@6.3.7/animations/perspective-extreme.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://unpkg.com/tippy.js@6.3.7/themes/light.css\" type=\"text/css\">\n        <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css\" type=\"text/css\">\n        <link rel=\"stylesheet/less\" href=\"/styles/app.less\" type=\"text/css\">\n        <script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/less@4.1.1\" ></script>\n    </head>\n    <body>\n        <div id=\"app\">\n            <div :class=\"config.general.darkTheme.value ? 'dark animate__animated animate__fadeIn animate__faster' : ''\">\n                <header>\n                    <div class=\"command\"\n                        :class=\"command.focused ? 'focused' : ''\">\n                        <div @click=\"processCommand()\" \n                             class=\"prompt\">\n                            <i :class=\"working ? ['ph-spinner-gap-fill', 'rotating'] : (command.focused ? 'ph-arrow-circle-right-fill' : 'ph-arrow-circle-right')\"></i>\n                        </div>\n                        <input @focus=\"command.focused=true\"\n                               @focusout=\"command.focused=false\"\n                               @keyup.native.enter=\"processCommand()\"\n                               type=\"text\" spellcheck=\"false\" placeholder=\"Enter a command\">\n                        <div @click=\"toggleMultilineMode()\" \n                             data-tippy-placement=\"bottom\"\n                             data-tippy-content=\"Enter multi-line input\"\n                             data-tippy-theme=\"light\"\n                             class=\"multiline\">\n                              <i :class=\"multilineMode ? 'ph-caret-double-up-thin' : 'ph-caret-double-down-thin'\"></i>\n                        </div>\n                    </div>\n                </header>\n                <main>\n                    <aside>\n                        <ul class=\"sidebar\">\n                            <li v-for=\"(sidebarContent, sidebarItem) in sidebar.items\" \n                                :class=\"sidebar.active==sidebarItem && 'active'\" \n                                @click=\"if (sidebarContent.action!=null) {sidebarContent.action();}; sidebar.active=sidebarItem\"\n                                @mouseenter=\"sidebar.hovered=sidebarItem\"\n                                @mouseleave=\"sidebar.hovered=''\"\n                                data-tippy-placement=\"right\"\n                                data-tippy-animation=\"perspective-extreme\"\n                                :data-tippy-content=\"sidebarContent.tip\">\n                                <i :class=\"(sidebar.active==sidebarItem || sidebar.hovered==sidebarItem) ? `ph-${sidebarItem}-fill` : `ph-${sidebarItem}`\"></i>\n                            </li>\n                        </ul>\n                    </aside>\n                    <section id=\"content\">\n                        <transition v-for=\"(editOptions,optionGroup) in graph.editOptions\"\n                                    name=\"slide-left\">\n                            <div class=\"editOptions\" \n                                :id=\"`${optionGroup}EditOptions`\" \n                                v-show=\"\n                                (sidebar.active=='graph') && (\n                                    ((optionGroup=='main') && (graph.selected.node.length == 0) && (graph.selected.edge.length == 0)) ||\n                                    ((optionGroup=='node') && (graph.selected.node.length == 1) && (graph.selected.edge.length == 0)) ||\n                                    ((optionGroup=='nodes') && (graph.selected.node.length > 1) && (graph.selected.edge.length == 0)) ||\n                                    ((optionGroup=='edge') && (graph.selected.edge.length == 1) && (graph.selected.node.length == 0)) ||\n                                    ((optionGroup=='edges') && (graph.selected.edge.length > 1) && (graph.selected.node.length == 0)) ||\n                                    ((optionGroup=='all') && (graph.selected.edge.length >= 1) && (graph.selected.node.length >= 1))\n                                )\">\n                                <div v-for=\"editOption in editOptions.visualization\"\n                                     @click=\"editOption.action()\"\n                                     :data-tippy-content=\"editOption.tip\"\n                                     class=\"editOption\"\n                                     data-tippy-placement=\"left\"\n                                     data-tippy-theme=\"light\">\n                                    <i :class=\"`ph-${editOption.icon}`\"></i>\n                                </div>\n                                <div class=\"editOption-separator\"></div>\n                                <div v-for=\"editOption in editOptions.database\"\n                                     @click=\"editOption.action()\"\n                                     :data-tippy-content=\"editOption.tip\"\n                                     class=\"editOption\"\n                                     :class=\"editOption.effect\"\n                                     data-tippy-placement=\"left\"\n                                     data-tippy-theme=\"light\">\n                                    <i :class=\"`ph-${editOption.icon}`\"></i>\n                                </div>\n                            </div>\n                        </transition>\n                        <div id=\"graph\" v-show=\"sidebar.active=='graph'\"></div>\n                        <div id=\"table\" v-show=\"sidebar.active=='table'\">\n                            <table class=\"table is-fullwidth is-striped is-hoverable display\">\n                                <thead>\n                                    <tr>\n                                        <th v-for=\"tableKey in table.keys\">{{tableKey}}</th>\n                                    </tr>\n                                </thead>\n                                <tbody>\n                                    <tr v-for=\"tableRow in table.rows\">\n                                        <td v-for=\"tableKey in table.keys\">{{tableRow[tableKey]}}</td>\n                                    </tr>\n                                </tbody>\n                            </table>\n                        </div>\n                        <div id=\"query-history\" v-show=\"sidebar.active=='clock-counter-clockwise'\">\n                            <template v-if=\"history.queries.length > 0\">\n                                <table class=\"table is-fullwidth is-striped\">\n                                    <thead>\n                                        <tr>\n                                            <th width=\"60%\">Query</th>\n                                            <th>Last run</th>\n                                            <th width=\"13%\">Result</th>\n                                            <th width=\"13%\">Actions</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr v-for=\"(historyRow,historyIndex) in history.queries\">\n                                            <td class=\"query-cell\">{{historyRow.query}}</td>\n                                            <td>{{historyRow.last}}</td>\n                                            <td>\n                                                <template v-if=\"historyRow.worked\">\n                                                    <i class=\"ph-check-circle-fill query-ok\"></i>&nbsp;{{historyRow.time}}ms\n                                                </template>\n                                                <template v-else>\n                                                    <i class=\"ph-x-circle-fill query-wrong\"></i>\n                                                </template>\n                                            </td>\n                                            <td>\n                                                <a class=\"button is-small row-button\"\n                                                   @click=\"copyQueryToClipboard(historyIndex)\">\n                                                    <i class=\"ph-copy-fill\"></i>\n                                                </a>&nbsp;\n                                                <a class=\"button is-small row-button\"\n                                                   @click=\"rerunQuery(historyIndex)\">\n                                                    <i class=\"ph-play-fill\"></i>\n                                                </a>\n                                            </td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </template>\n                            <template v-else>\n                                <div class=\"no-queries\">\n                                    <i class=\"ph-bug error-icon\" style=\"font-size: 3rem;\"></i>\n                                    <p class=\"error-message\">No queries have been found.</p>\n                                </div>\n                            </template>\n                        </div>\n                        <div id=\"database\" v-show=\"sidebar.active=='database'\">\n                            <section class=\"hero is-small\">\n                                <div class=\"hero-body\">\n                                    <div class=\"container\">\n                                        <div class=\"columns\">\n                                            <div class=\"column is-6 left-column\">\n                                                <p class=\"title\">Grafito <span class=\"tag vernum is-light is-rounded\">{{config.versions.system}}</span></p>\n                                                <p class=\"subtitle\"><i class=\"ph-radio-button-fill\"></i>&nbsp;running at /localhost:18966</p>\n                                            </div>\n                                            <div class=\"column is-6 right-column\">\n                                                <ul>\n                                                    <li><b>backend:</b> Arturo v/{{config.versions.arturo}}</li>\n                                                    <li><b>engine:</b> SQLite v/{{config.versions.engine}}</li>\n                                                </ul>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </section>\n\n                            <div class=\"container\">\n                                <div class=\"card\">\n                                    <header class=\"card-header\">\n                                        <p class=\"card-header-title\">Database</p>\n                                        <div class=\"sideinfo\">{{analytics.disk.path}}</div>\n                                    </header>\n                                    <div class=\"card-content\">\n                                        <div class=\"columns counters\">\n                                            <div class=\"column is-4 has-text-centered counter-column\">\n                                                <p class=\"counter\">\n                                                    <span class=\"counter-number\">{{analytics.database.nodes}}</span>\n                                                </p>\n                                                <span class=\"counter-label\"><i class=\"ph-leaf-fill\"></i>Nodes</span>\n                                            </div>\n                                            <div class=\"column is-4 has-text-centered counter-column\">\n                                                <p class=\"counter\">\n                                                    <span class=\"counter-number\">{{analytics.database.edges}}</span>\n                                                </p>\n                                                <span class=\"counter-label\"><i class=\"ph-arrow-bend-right-up-fill\"></i>Edges</span>\n                                            </div>\n                                            <div class=\"column is-4 has-text-centered counter-column\">\n                                                <p class=\"counter\">\n                                                    <span class=\"counter-number\">{{analytics.database.degree}}</span>\n                                                </p>\n                                                <span class=\"counter-label\"><i class=\"ph-percent-fill\"></i>Avg. Degree</span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                \n                                <div class=\"card\">\n                                    <header class=\"card-header\">\n                                        <p class=\"card-header-title\">Performance</p>\n                                    </header>\n                                    <div class=\"card-content\">\n                                        <div class=\"columns counters\">\n                                            <div class=\"column is-6 has-text-centered counter-column\">\n                                                <p class=\"counter\">\n                                                    <span class=\"counter-number\">{{analytics.memory.number}}</span> <span class=\"counter-units\">{{analytics.memory.units}}</span>\n                                                </p>\n                                                <span class=\"counter-label\"><i class=\"ph-cpu-fill\"></i>Memory</span>\n                                            </div>\n                                            <div class=\"column is-6 has-text-centered counter-column\">\n                                                <p class=\"counter\">\n                                                    <template v-if=\"analytics.disk.size.number==0\">\n                                                        <span class=\"counter-number\">&mdash;</span>\n                                                    </template>\n                                                    <template v-else>\n                                                        <span class=\"counter-number\">{{analytics.disk.size.number}}</span> <span class=\"counter-units\">{{analytics.disk.size.units}}</span>\n                                                    </template>                                                    \n                                                </p>\n                                                <span class=\"counter-label\"><i class=\"ph-hard-drives-fill\"></i>Size</span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div id=\"settings\" v-show=\"sidebar.active=='sliders'\">\n                            <div class=\"container\">\n                                <div class=\"columns\">\n                                    <div class=\"column is-6\">\n                                        <article class=\"panel\">\n                                            <p class=\"panel-heading\">\n                                                General\n                                            </p>\n                                            <div v-for=\"(setting,key) in config.general\"\n                                                class=\"panel-block\">\n                                                <input v-model=\"config.general[key].value\"\n                                                    @change=\"updateGraphView()\"\n                                                    :id=\"key\"\n                                                    type=\"checkbox\"\n                                                    class=\"switchable\" >\n                                                <label :for=\"key\"\n                                                    :class=\"(config.general[key].value) ? '' : 'inactive'\">\n                                                    {{setting.description}}\n                                                </label>\n                                            </div>\n                                        </article>\n                                        <article class=\"panel\">\n                                            <p class=\"panel-heading\">\n                                                Engine\n                                            </p>\n                                            <div v-for=\"(setting,key) in config.engine\"\n                                                class=\"panel-block\">\n                                                <input v-model=\"config.engine[key].value\"\n                                                    @change=\"updateEngineSettings()\"\n                                                    :id=\"key\"\n                                                    type=\"checkbox\"\n                                                    class=\"switchable\" >\n                                                <label :for=\"key\"\n                                                    :class=\"(config.engine[key].value) ? '' : 'inactive'\">\n                                                    {{setting.description}}\n                                                </label>\n                                            </div>\n                                        </article>\n                                    </div>\n                                    <div class=\"column is-6\">\n                                        <article class=\"panel\">\n                                            <p class=\"panel-heading\">\n                                                Graph View\n                                            </p>\n                                            <div v-for=\"(setting,key) in config.graphView\"\n                                                class=\"panel-block\">\n                                                <input v-model=\"config.graphView[key].value\"\n                                                    @change=\"updateGraphView()\"\n                                                    :id=\"key\"\n                                                    type=\"checkbox\"\n                                                    class=\"switchable\" >\n                                                <label :for=\"key\"\n                                                    :class=\"(config.graphView[key].value) ? '' : 'inactive'\">\n                                                    {{setting.description}}\n                                                </label>\n                                            </div>\n                                        </article>\n                                        <article class=\"panel\">\n                                            <p class=\"panel-heading\">\n                                                Table View\n                                            </p>\n                                            <div v-for=\"(setting,key) in config.tableView\"\n                                                class=\"panel-block\">\n                                                <input v-model=\"config.tableView[key].value\"\n                                                    :id=\"key\"\n                                                    type=\"checkbox\"\n                                                    class=\"switchable\" >\n                                                <label :for=\"key\"\n                                                    :class=\"(config.tableView[key].value) ? '' : 'inactive'\">\n                                                    {{setting.description}}\n                                                </label>\n                                            </div>\n                                        </article>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </section>\n                    <div class=\"modal\"\n                        :class=\"(modal.active) ? ((modal.dropdownShowing) ? 'is-active with-dropdown' : 'is-active') : ''\">\n                        <div class=\"modal-background animate__animated animate__fadeIn animate__faster\"></div>\n                        <div class=\"modal-card animate__animated animate__slideInDown animate__faster\">\n                        <header class=\"modal-card-head\">\n                            <p class=\"modal-card-title\">\n                                <i :class=\"(modal.icon=='') ? '' : `ph-${modal.icon}`\"></i>\n                                {{modal.title}}\n                            </p>\n                            <button @click=\"modal.active=false; multilineMode=false;\"\n                                    class=\"delete\" \n                                    aria-label=\"close\" >\n                            </button>\n                        </header>\n                        <section class=\"modal-card-body\"\n                                 :class=\"(modal.mode=='query') ? 'query-mode' : ''\">\n                            <template v-if=\"modal.mode=='confirmation'\">\n                                <p>This action is going to delete the selected elements from the graph database and is not reversible. Are you sure you want to proceed?</p>\n                            </template>\n                            <template v-if=\"modal.mode=='query'\">\n                                <div id=\"editor\"></div>\n                            </template>\n                            <template v-if=\"modal.mode=='palette'\">\n                                <div class=\"columns\">\n                                    <div class=\"column is-9 is-offset-1 has-text-centered\">\n                                        <div class=\"field is-horizontal\">\n                                            <div class=\"field-label\"\n                                                 style=\"flex-grow: 0\">\n                                                <label class=\"label\">Theme</label>\n                                            </div>\n                                            <div class=\"field-body\">\n                                                <div class=\"control\">\n                                                    <select class=\"select\" v-model=\"modal.selectedPalette\">\n                                                        <option v-for=\"palette in Object.keys(graph.palettes.list).sort()\">\n                                                            {{palette}}\n                                                        </option>\n                                                    </select>\n                                                </div>\n                                            </div>\n                                        </div>\n                                        <div class=\"palette-container\">\n                                            <template v-for=\"color in graph.palettes.list[modal.selectedPalette]\">\n                                                <div style=\"width: 20px; height: 20px;\" \n                                                     :style=\"`background: ${color}`\"></div>\n                                            </template>\n                                        </div>\n                                    </div>\n                                </div>\n                            </template>\n                            <template v-if=\"modal.mode=='filter'\">\n                                <div class=\"columns\">\n                                    <div class=\"column is-6\">\n                                        <div class=\"switchable-wrapper\"\n                                            v-for=\"(value,key) in graph.filter.nodes\">\n                                            <input v-model=\"graph.filter.nodes[key]\"\n                                                    @change=\"graph.dataview.nodes.refresh(); showDefaultInfo()\"\n                                                    :id=\"key\"\n                                                    type=\"checkbox\"\n                                                    class=\"switchable\" >\n                                            <label :for=\"key\"\n                                                :class=\"(graph.filter.nodes[key]) ? '' : 'inactive'\">\n                                                {{key}}\n                                            </label>\n                                        </div>\n                                    </div>\n                                    <div class=\"column is-6\">\n                                        <div class=\"switchable-wrapper\"\n                                            v-for=\"(value,key) in graph.filter.edges\">\n                                            <input v-model=\"graph.filter.edges[key]\"\n                                                    @change=\"graph.dataview.edges.refresh(); showDefaultInfo()\"\n                                                    :id=\"key\"\n                                                    type=\"checkbox\"\n                                                    class=\"switchable\" >\n                                            <label :for=\"key\"\n                                                :class=\"(graph.filter.edges[key]) ? '' : 'inactive'\">\n                                                {{key}}\n                                            </label>\n                                        </div>\n                                    </div>\n                                </div>\n                            </template>\n                            <template v-if=\"modal.mode=='edit'\">\n                                <div v-for=\"(value,key) in modal.fields\"\n                                        class=\"field is-horizontal\">\n                                    <div class=\"field-label\">\n                                        <label class=\"label\">{{key}}</label>\n                                    </div>\n                                    <div class=\"field-body\">\n                                        <div class=\"field has-addons\">\n                                            <div class=\"control has-icons-left is-expanded\"\n                                                 :class=\"(typeof value == 'boolean') ? 'has-icons-right' : ''\">\n                                                <input v-model=\"modal.fields[key]\" \n                                                    :type=\"getInputTypeForValue(value)\"\n                                                    :readonly=\"typeof value == 'boolean'\"\n                                                    class=\"input\"\n                                                    spellcheck=\"false\">\n                                                \n                                                <span class=\"icon is-small is-left\">\n                                                    <i :class=\"`ph-${getInputIconForValue(key,value)}`\"></i>\n                                                </span>\n                                                <span v-if=\"typeof value == 'boolean'\"\n                                                      class=\"icon is-small is-right inline-switchable-container\">\n                                                     <input v-model=\"modal.fields[key]\"\n                                                           :id=\"key\"\n                                                           type=\"checkbox\"\n                                                           class=\"switchable\">\n                                                </span>\n                                            </div>\n                                            <template v-if=\"key!='tag'\">\n                                                <div class=\"control\">\n                                                    <button class=\"button\"\n                                                            @click=\"delete modal.fields[key]\">\n                                                        <span class=\"icon is-small\">\n                                                            <i class=\"ph-backspace-bold\"></i>\n                                                        </span>\n                                                    </button>\n                                                </div>\n                                            </template>\n                                            <template v-else>\n                                                <div class=\"control\">\n                                                    <div class=\"dropdown is-right\"\n                                                         :class=\"(modal.dropdownShowing) ? 'is-active' : ''\">\n                                                        <div class=\"dropdown-trigger\">\n                                                          <button @click=\"modal.dropdownShowing=!modal.dropdownShowing\"\n                                                                  class=\"button simple-dropdown\" aria-haspopup=\"true\" aria-controls=\"dropdown-menu6\">\n                                                            <span class=\"icon is-small\">\n                                                                <i class=\"ph-caret-down-bold\"></i>\n                                                            </span>\n                                                          </button>\n                                                        </div>\n                                                        <div class=\"dropdown-menu\" id=\"dropdown-menu6\" role=\"menu\">\n                                                            <div class=\"dropdown-content\">\n                                                                <template v-for=\"tagOption in modal.tagOptions\">\n                                                                    <a @click=\"modal.fields.tag=tagOption; modal.dropdownShowing=false\"\n                                                                         class=\"dropdown-item\">\n                                                                        {{tagOption}}\n                                                                    </a>\n                                                                </template> \n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                            </template>\n                                        </div>\n                                    </div>\n                                </div>\n                            </template>\n                        </section>\n                        <footer class=\"modal-card-foot\">\n                            <div v-if=\"modal.showAdd\"\n                                 class=\"leftmost\">\n                                <button class=\"button is-light\"\n                                        @click=\"modal.showAddActive = !modal.showAddActive\"\n                                        :class=\"modal.showAddActive ? 'is-hovered' : ''\">\n                                    <i class=\"ph-list-plus-bold\"></i>\n                                </button>\n                                <div v-if=\"modal.showAddActive\"\n                                     class=\"field has-addons\">\n                                     <div class=\"control\">\n                                        <span class=\"select\">\n                                            <select v-model=\"modal.addFieldType\">\n                                                <option>String</option>\n                                                <option>Number</option>\n                                                <option>Boolean</option>\n                                            </select>\n                                        </span>\n                                    </div>\n                                    <div class=\"control is-expanded\">\n                                        <input\n                                        v-model=\"modal.addField\"\n                                        type=\"text\"\n                                        class=\"input\"\n                                        spellcheck=\"false\">\n                                    </div>\n                                    <div class=\"control\">\n                                        <button class=\"button\"\n                                                @click=\"addNewNodeField()\">\n                                            Add\n                                        </button>\n                                    </div>\n                                </div>\n                            </div>\n                            <button class=\"button is-outlined\"\n                                    :class=\"modal.accept.style\"\n                                    @click=\"modal.accept.action(); modal.active=false\">\n                                {{modal.accept.button}}\n                            </button>\n                            <button @click=\"modal.active=false; multilineMode=false;\"\n                                    v-if=\"modal.showCancel\"\n                                    class=\"button is-light\">\n                                Cancel\n                            </button>\n                        </footer>\n                        </div>\n                    </div>\n                </main>\n                <footer>\n                    <div class=\"infobar\">\n                        <div class=\"graph-info\"\n                            v-show=\"sidebar.active=='graph'\">\n                            <template v-if=\"graph.selected.node.length==0 && graph.selected.edge.length==0\">\n                                <span v-if=\"graph.hovered.node != null\"\n                                      class=\"tag\" :style=\"`background-color: ${graph.hovered.node.color.background}; color: white`\">{{graph.hovered.node.tag}}</span>\n                                <span v-else-if=\"graph.hovered.edge != null\"\n                                      class=\"tag\" style=\"background-color: black; color: white\">{{graph.hovered.edge.label}}</span>\n                                <span v-else \n                                      class=\"tag\" style=\"background-color: #CCC; color: black\">info</span>\n                            </template>\n                            <span v-else-if=\"graph.selected.node.length==1 && graph.selected.edge.length==0\"\n                                  class=\"tag\" :style=\"`background-color: ${graph.selected.node[0].color.background}; color: white`\">{{graph.selected.node[0].tag}}</span>\n                            <span v-else-if=\"graph.selected.node.length==0 && graph.selected.edge.length==1\"\n                                  class=\"tag\" style=\"background-color: black; color: white\">{{graph.selected.edge[0].label}}</span>\n                            <span v-else\n                                  class=\"tag\" style=\"background-color: #CCC; color: black\">info</span>\n\n                            <nav class=\"breadcrumb\">\n                                <ul>\n                                    <template v-if=\"graph.selected.node.length==0 && graph.selected.edge.length==0\">\n                                        <template v-if=\"graph.hovered.node != null\">\n                                            <li class=\"is-active\" v-for=\"(value, key) in graph.hovered.node.properties\">\n                                                <a>\n                                                    <b>{{key}}:</b>{{value}}\n                                                </a>\n                                            </li>\n                                        </template>\n                                        <template v-else-if=\"graph.hovered.edge != null\">\n                                            <li class=\"is-active\" v-for=\"(value, key) in graph.hovered.edge.properties\">\n                                                <a>\n                                                    <b>{{key}}:</b>{{value}}\n                                                </a>\n                                            </li>\n                                            <!-- <li class=\"is-active edged\">\n                                                <a><b>{{graph.data.nodes.get(graph.hovered.edge.from).tag}}:</b>{{graph.data.nodes.get(graph.hovered.edge.from).fullLabel}}</a>\n                                            </li>\n                                            <li class=\"is-active edged\">\n                                                <a><b>{{graph.data.nodes.get(graph.hovered.edge.to).tag}}:</b>{{graph.data.nodes.get(graph.hovered.edge.to).fullLabel}}</a>\n                                            </li> -->\n                                        </template>\n                                        <template v-else>\n                                            <li class=\"is-active\">\n                                                <a>Showing {{graph.dataview.nodes.length}} node<template v-if=\"(graph.dataview.nodes.length > 1) || (graph.dataview.nodes.length == 0)\">s</template> and {{graph.dataview.edges.length}} edge<template v-if=\"(graph.dataview.edges.length > 1) || (graph.dataview.edges.length == 0)\">s</template></a>\n                                            </li>\n                                        </template>\n                                    </template>\n                                    <template v-else-if=\"graph.selected.node.length==1 && graph.selected.edge.length==0\">\n                                        <li class=\"is-active\" v-for=\"(value, key) in graph.selected.node[0].properties\">\n                                            <a>\n                                                <b>{{key}}:</b>{{value}}\n                                            </a>\n                                        </li>\n                                    </template>\n                                    <template v-else-if=\"graph.selected.node.length==0 && graph.selected.edge.length==1\">\n                                        <li class=\"is-active\" v-for=\"(value, key) in graph.selected.edge[0].properties\">\n                                            <a>\n                                                <b>{{key}}:</b>{{value}}\n                                            </a>\n                                        </li>\n                                        <!-- <li class=\"is-active edged\">\n                                            <a><b>{{graph.data.nodes.get(graph.selected.edge[0].from).tag}}:</b>{{graph.data.nodes.get(graph.selected.edge[0].from).fullLabel}}</a>\n                                        </li>\n                                        <li class=\"is-active edged\">\n                                            <a><b>{{graph.data.nodes.get(graph.selected.edge[0].to).tag}}:</b>{{graph.data.nodes.get(graph.selected.edge[0].to).fullLabel}}</a>\n                                        </li> -->\n                                    </template>\n                                    <template v-else>\n                                        <li class=\"is-active\">\n                                            <a>Selected\n                                                <template v-if=\"graph.selected.node.length > 0\">\n                                                    {{graph.selected.node.length}} node<template v-if=\"graph.selected.node.length > 1\">s</template>\n                                                </template>\n                                                <template v-if=\"graph.selected.node.length > 0 && graph.selected.edge.length > 0\">\n                                                    and\n                                                </template>\n                                                <template v-if=\"graph.selected.edge.length > 0\">\n                                                    {{graph.selected.edge.length}} edge<template v-if=\"graph.selected.edge.length > 1\">s</template>\n                                                </template>\n                                            </a>\n                                        </li>\n                                    </template>\n                                </ul>\n                            </nav>\n                        </div>\n                        <div class=\"table-info\"\n                            v-show=\"sidebar.active=='table'\">\n\n                        </div>\n                    </div>\n                </footer>\n            </div>\n        </div>\n        <script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js\"></script>\n        <!--<script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js\"></script>-->\n        <script type=\"text/javascript\" src=\"https://unpkg.com/vis-network/standalone/umd/vis-network.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/izitoast/1.4.0/js/iziToast.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://unpkg.com/phosphor-icons\"></script>\n        <script type=\"text/javascript\" src=\"https://code.jquery.com/jquery-3.5.1.min.js\" integrity=\"sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=\" crossorigin=\"anonymous\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/searchbuilder/1.3.0/js/dataTables.searchBuilder.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/searchbuilder/1.3.0/js/searchBuilder.bulma.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/datetime/1.1.1/js/dataTables.dateTime.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/buttons/2.1.0/js/dataTables.buttons.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.1/jquery.waypoints.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/gh/bfintal/Counter-Up@1.0.0/jquery.counterup.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/buttons/2.1.0/js/buttons.html5.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://cdn.datatables.net/buttons/2.1.0/js/buttons.print.min.js\"></script>\n        <script type=\"text/javascript\" src=\"https://unpkg.com/@popperjs/core@2\"></script>\n        <script type=\"text/javascript\" src=\"https://unpkg.com/tippy.js@6\"></script>\n        <script type=\"text/javascript\" src=\"/scripts/ace/ace.js\"></script>\n        <script type=\"text/javascript\" src=\"/scripts/ace/themes/monokai.js\"></script>\n        <script type=\"text/javascript\" src=\"/scripts/ace/modes/grafito.js\"></script>\n        <script type=\"text/javascript\" src=\"/scripts/app.js\"></script>\n    </body>\n</html>"
  },
  {
    "path": "ui/palettes/default.art",
    "content": "#130075\n#3d0075\n#bd8ed1\n#75250e\n#756c10\n#567513\n#A5D180\n#00752B\n#005f73\n#0a9396\n#94d2bd\n#e9d8a6\n#d1ad94\n#ee9b00\n#ca6702\n#bb3e03\n#ae2012\n#9b2226\n#750041"
  },
  {
    "path": "ui/palettes/earthy.art",
    "content": "#c27e88\n#a9505c\n#c3887d \n#aa5d4e\n#7a4238\n#b2c77a\n#94b049 \n#6a7d34 \n#90b1b1 \n#679292 \n#496868 \n#ae9d92\n#8f786a \n#66564b \n#3d332d"
  },
  {
    "path": "ui/palettes/inferno.art",
    "content": "#fcffa4\n#f2ea69\n#f8cd37\n#fcb014\n#fa9407\n#f47918\n#e9612b\n#d94d3d\n#c63d4d\n#b0315b\n#982766\n#801f6c\n#69166e\n#510e6c\n#380962"
  },
  {
    "path": "ui/palettes/light.art",
    "content": "#a0bfe8\n#6698da\n#3072c9\n#22518f\n#143156\n#eabd9e\n#de9563\n#ce6d2b\n#934e1f\n#582e12\n#edac9b\n#e27a5e\n#d44a25\n#97351a\n#5a1f10\n#cfc0b8\n#b3998d\n#957364\n#6a5247\n#40312a\n#b7d0ca\n#8cb4ab\n#62978a\n#466c63\n#2a403b"
  },
  {
    "path": "ui/palettes/magma.art",
    "content": "#f0f921\n#fada24\n#febd2a\n#fba238\n#f48849\n#e97158\n#db5c68\n#cc4778\n#b83289\n#a31e9a\n#8b0aa5\n#6f00a8\n#5302a3\n#350498\n#0d0887"
  },
  {
    "path": "ui/palettes/pastel.art",
    "content": "#3bb2d0\n#3887be\n#8a8acb\n#56b881\n#50667f\n#41afa5\n#f9886c\n#e55e5e\n#ed6498\n#fbb03b"
  },
  {
    "path": "ui/palettes/playful.art",
    "content": "#7ac70c\n#8ee000\n#faa918\n#ffc715\n#d33131\n#e53838\n#1cb0f6\n#14d4f4\n#8549ba\n#a560e8\n#4c4c4c\n#6f6f6f"
  },
  {
    "path": "ui/palettes/rainbow.art",
    "content": "#4aae20\n#6cc751\n#225f1e\n#f8cc07\n#ff9300\n#e44436\n#cd3292\n#37aef3\n#0076ba\n#005888\n#8732cd"
  },
  {
    "path": "ui/palettes/vibrant.art",
    "content": "#ff6050\n#ff0e83\n#d54262\n#813867\n#66336e\n#5677fc\n#341539\n#9013fe\n#ffc208\n#00cc99"
  },
  {
    "path": "ui/palettes/viridis.art",
    "content": "#fde725\n#d0e11c\n#a0da39\n#73d056\n#4ac16d\n#2db27d\n#1fa187\n#21918c\n#277f8e\n#2e6e8e\n#365c8d\n#3f4788\n#46327e\n#481b6d\n#440154"
  },
  {
    "path": "ui/scripts/ace/ace.js",
    "content": "(function(){var t=function(){return this}();var n=function(e,t,r){\"string\"==typeof e?(2==arguments.length&&(r=t),n.modules||(n.modules={},n.payloads={}),n.payloads[e]=r,n.modules[e]=null):n.original?n.original.apply(window,arguments):(console.error(\"dropping module because define wasn't a string.\"),console.trace())},r=function(e,t,n){if(\"[object Array]\"===Object.prototype.toString.call(t)){for(var i=[],o=0,u=t.length;o<u;++o){var a=s(e,t[o]);if(!a&&r.original)return r.original.apply(window,arguments);i.push(a)}n&&n.apply(null,i)}else{if(\"string\"==typeof t){var f=s(e,t);return!f&&r.original?r.original.apply(window,arguments):(n&&n(),f)}if(r.original)return r.original.apply(window,arguments)}},i=function(e,t){if(-1!==t.indexOf(\"!\")){var n=t.split(\"!\");return i(e,n[0])+\"!\"+i(e,n[1])}if(\".\"==t.charAt(0))for(t=e.split(\"/\").slice(0,-1).join(\"/\")+\"/\"+t;-1!==t.indexOf(\".\")&&s!=t;){var s=t;t=t.replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}return t},s=function(f,t){t=i(f,t);var u,o,s=n.modules[t];return s||(\"function\"==typeof(s=n.payloads[t])&&(f=s(function(e,n){return r(t,e,n)},o={},u={id:t,uri:\"\",exports:o,packaged:!0}),n.modules[t]=o=f||u.exports,delete n.payloads[t]),s=n.modules[t]=o||s),s};!function(e){var s=t;e&&(t[e]||(t[e]={}),s=t[e]),s.define&&s.define.packaged||(n.original=s.define,s.define=n,s.define.packaged=!0),s.require&&s.require.packaged||(r.original=s.require,s.require=function(e,t){return r(\"\",e,t)},s.require.packaged=!0)}(\"ace\")})(),ace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/multi_select\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"],function(e,t,n){e(\"./lib/fixoldbrowsers\");var r=e(\"./lib/dom\"),i=e(\"./lib/event\"),s=e(\"./editor\").Editor,o=e(\"./edit_session\").EditSession,u=e(\"./undomanager\").UndoManager,a=e(\"./virtual_renderer\").VirtualRenderer,f=e(\"./multi_select\").MultiSelect;e(\"./worker/worker_client\"),e(\"./keyboard/hash_handler\"),e(\"./placeholder\"),e(\"./mode/folding/fold_mode\"),e(\"./theme/textmate\"),e(\"./ext/error_marker\"),t.config=e(\"./config\"),t.require=e,t.edit=function(e){if(\"string\"==typeof e){var u=e;if(!(e=document.getElementById(u)))throw new Error(\"ace.edit can't find div #\"+u)}if(e.env&&e.env.editor instanceof s)return e.env.editor;var o=t.createEditSession(r.getInnerText(e));e.innerHTML=\"\";u=new s(new a(e));new f(u),u.setSession(o);var l={document:o,editor:u,onResize:u.resize.bind(u,null)};return i.addListener(window,\"resize\",l.onResize),u.on(\"destroy\",function(){i.removeListener(window,\"resize\",l.onResize)}),e.env=u.env=l,u},t.createEditSession=function(e,n){n=new o(e,n);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u}),ace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"],function(e,t,n){e(\"./regexp\"),e(\"./es5-shim\")}),ace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"],function(e,t,n){var r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},i=void 0===r.exec.call(/()??/,\"\")[1],s=function(){var e=/^/g;return r.test.call(e,\"\"),!e.lastIndex}();s&&i||(RegExp.prototype.exec=function(e){var n,a,t=r.exec.apply(this,arguments);if(\"string\"==typeof e&&t){if(!i&&1<t.length&&-1<function(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}(t,\"\")&&(a=RegExp(this.source,r.replace.call(function(e){return(e.global?\"g\":\"\")+(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.extended?\"x\":\"\")+(e.sticky?\"y\":\"\")}(this),\"g\",\"\")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;e<arguments.length-2;e++)void 0===arguments[e]&&(t[e]=void 0)})),this._xregexp&&this._xregexp.captureNames)for(var f=1;f<t.length;f++)(n=this._xregexp.captureNames[f-1])&&(t[n]=t[f]);!s&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(t){t=r.exec.call(this,t);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t}))}),ace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,\"sentinel\",{}),\"sentinel\"in e}catch(t){}}function H(e){return(e=+e)!=e?e=0:0!==e&&e!==1/0&&e!==-1/0&&(e=(0<e||-1)*Math.floor(Math.abs(e))),e}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(\"function\"!=typeof n)throw new TypeError(\"Function.prototype.bind called on incompatible \"+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var l,c,h,p,d,v,E=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=E.bind(o.toString),f=E.bind(o.hasOwnProperty);(d=f(o,\"__defineGetter__\"))&&(l=E.bind(o.__defineGetter__),c=E.bind(o.__defineSetter__),h=E.bind(o.__lookupGetter__),p=E.bind(o.__lookupSetter__)),2!=[1,2].splice(0).length&&(!function(){function e(t){t=new Array(t+2);return t[0]=t[1]=0,t}var n,t=[];return t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,\"XXX\"),t.length,n+1==t.length}()?Array.prototype.splice=function(e,t){var n=this.length;0<e?n<e&&(e=n):null==e?e=0:e<0&&(e=Math.max(n+e,0));var r=this.slice(e,e+(t=!(e+t<n)?n-e:t)),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var c=Math.min(t,n-e),a=e+c,f=a+s-c,l=n-a,c=n-c;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(a<f)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else for(this.length=c+s,h=0;h<s;++h)this[e+h]=i[h]}return r}:(v=Array.prototype.splice,Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[void 0===e?0:e,void 0===t?this.length-e:t].concat(u.call(arguments,2))):[]})),Array.isArray||(Array.isArray=function(t){return\"[object Array]\"==a(t)});var b,x,E=Object(\"a\"),g=\"a\"!=E[0]||!(0 in E);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=arguments[1],s=-1,o=r.length>>>0;if(\"[object Function]\"!=a(t))throw new TypeError;for(;++s<o;)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(\"[object Function]\"!=a(t))throw new TypeError(t+\" is not a function\");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var o,n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=r.length>>>0,s=[],u=arguments[1];if(\"[object Function]\"!=a(t))throw new TypeError(t+\" is not a function\");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(\"[object Function]\"!=a(t))throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=r.length>>>0,s=arguments[1];if(\"[object Function]\"!=a(t))throw new TypeError(t+\" is not a function\");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=r.length>>>0;if(\"[object Function]\"!=a(t))throw new TypeError(t+\" is not a function\");if(!i&&1==arguments.length)throw new TypeError(\"reduce of empty array with no initial value\");var o,s=0;if(2<=arguments.length)o=arguments[1];else for(;;){if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError(\"reduce of empty array with no initial value\")}for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&\"[object String]\"==a(this)?this.split(\"\"):n,i=r.length>>>0;if(\"[object Function]\"!=a(t))throw new TypeError(t+\" is not a function\");if(!i&&1==arguments.length)throw new TypeError(\"reduceRight of empty array with no initial value\");var s,o=i-1;if(2<=arguments.length)s=arguments[1];else for(;;){if(o in r){s=r[o--];break}if(--o<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}for(;o in this&&(s=t.call(void 0,s,r[o],o,n)),o--;);return s}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(t){var n=g&&\"[object String]\"==a(this)?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;for(var i=0,i=0<=(i=1<arguments.length?H(arguments[1]):i)?i:Math.max(0,r+i);i<r;i++)if(i in n&&n[i]===t)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(t){var n=g&&\"[object String]\"==a(this)?this.split(\"\"):F(this),r=n.length>>>0;if(!r)return-1;for(var i=r-1,i=0<=(i=1<arguments.length?Math.min(i,H(arguments[1])):i)?i:r-Math.abs(i);0<=i;i--)if(i in n&&t===n[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)}),Object.getOwnPropertyDescriptor||(Object.getOwnPropertyDescriptor=function(t,n){if(\"object\"!=typeof t&&\"function\"!=typeof t||null===t)throw new TypeError(\"Object.getOwnPropertyDescriptor called on a non-object: \"+t);if(f(t,n)){var r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);if(t.__proto__=u,i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}),Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)}),Object.create||(b=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var t,e={};for(t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(null===t)r=b();else{if(\"object\"!=typeof t)throw new TypeError(\"typeof prototype[\"+typeof t+\"] != 'object'\");function i(){}i.prototype=t,(r=new i).__proto__=t}return void 0!==n&&Object.defineProperties(r,n),r}),Object.defineProperty&&(E=w({}),_=\"undefined\"==typeof document||w(document.createElement(\"div\")),E&&_||(x=Object.defineProperty)),Object.defineProperty&&!x||(Object.defineProperty=function(t,n,r){if(\"object\"!=typeof t&&\"function\"!=typeof t||null===t)throw new TypeError(\"Object.defineProperty called on non-object: \"+t);if(\"object\"!=typeof r&&\"function\"!=typeof r||null===r)throw new TypeError(\"Property description must be an object: \"+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,\"value\")){var s;d&&(h(t,n)||p(t,n))?(s=t.__proto__,t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s):t[n]=r.value}else{if(!d)throw new TypeError(\"getters & setters can not be defined on this javascript engine\");f(r,\"get\")&&l(t,n,r.get),f(r,\"set\")&&c(t,n,r.set)}return t}),Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return\"function\"==typeof n?n:t(n)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;for(var n=\"\";f(t,n);)n+=\"?\";t[n]=!0;var r=f(t,n);return delete t[n],r}),!Object.keys){var M,L=!0,A=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],O=A.length;for(M in{toString:null})L=!1;Object.keys=function(e){if(\"object\"!=typeof e&&\"function\"!=typeof e||null===e)throw new TypeError(\"Object.keys called on a non-object\");var t,I=[];for(t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var D,P,_=\"\\t\\n\\v\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\";String.prototype.trim&&!_.trim()||(_=\"[\"+_+\"]\",D=new RegExp(\"^\"+_+_+\"*\"),P=new RegExp(_+_+\"*$\"),String.prototype.trim=function(){return String(this).replace(D,\"\").replace(P,\"\")});var F=function(e){if(null==e)throw new TypeError(\"can't convert \"+e+\" to object\");return Object(e)}}),ace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"],function(e,t,n){var r;\"undefined\"!=typeof document&&(r=\"http://www.w3.org/1999/xhtml\",t.getDocumentHead=function(e){return(e=e||document).head||e.getElementsByTagName(\"head\")[0]||e.documentElement},t.createElement=function(e,t){return document.createElementNS?document.createElementNS(t||r,e):document.createElement(e)},t.hasCssClass=function(e,t){return-1!==e.className.split(/\\s+/g).indexOf(t)},t.addCssClass=function(e,n){t.hasCssClass(e,n)||(e.className+=\" \"+n)},t.removeCssClass=function(e,t){for(var n=e.className.split(/\\s+/g);;){var r=n.indexOf(t);if(-1==r)break;n.splice(r,1)}e.className=n.join(\" \")},t.toggleCssClass=function(e,t){for(var n=e.className.split(/\\s+/g),r=!0;;){var i=n.indexOf(t);if(-1==i)break;r=!1,n.splice(i,1)}return r&&n.push(t),e.className=n.join(\" \"),r},t.setCssClass=function(e,n,r){r?t.addCssClass(e,n):t.removeCssClass(e,n)},t.hasCssString=function(e,t){var r,n=0;if((t=t||document).createStyleSheet&&(r=t.styleSheets)){for(;n<r.length;)if(r[n++].owningElement.id===e)return!0}else if(r=t.getElementsByTagName(\"style\"))for(;n<r.length;)if(r[n++].id===e)return!0;return!1},t.importCssString=function(n,i,s){if(s=s||document,i&&t.hasCssString(i,s))return null;var o;s.createStyleSheet?((o=s.createStyleSheet()).cssText=n,i&&(o.owningElement.id=i)):((o=s.createElementNS?s.createElementNS(r,\"style\"):s.createElement(\"style\")).appendChild(s.createTextNode(n)),i&&(o.id=i),t.getDocumentHead(s).appendChild(o))},t.importCssStylsheet=function(e,n){var r;n.createStyleSheet?n.createStyleSheet(e):((r=t.createElement(\"link\")).rel=\"stylesheet\",r.href=e,t.getDocumentHead(n).appendChild(r))},t.getInnerWidth=function(e){return parseInt(t.computedStyle(e,\"paddingLeft\"),10)+parseInt(t.computedStyle(e,\"paddingRight\"),10)+e.clientWidth},t.getInnerHeight=function(e){return parseInt(t.computedStyle(e,\"paddingTop\"),10)+parseInt(t.computedStyle(e,\"paddingBottom\"),10)+e.clientHeight},void 0!==window.pageYOffset?(t.getPageScrollTop=function(){return window.pageYOffset},t.getPageScrollLeft=function(){return window.pageXOffset}):(t.getPageScrollTop=function(){return document.body.scrollTop},t.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?t.computedStyle=function(e,t){return t?(window.getComputedStyle(e,\"\")||{})[t]||\"\":window.getComputedStyle(e,\"\")||{}}:t.computedStyle=function(e,t){return t?e.currentStyle[t]:e.currentStyle},t.scrollbarWidth=function(o){var u=t.createElement(\"ace_inner\");u.style.width=\"100%\",u.style.minWidth=\"0px\",u.style.height=\"200px\",u.style.display=\"block\";var r=t.createElement(\"ace_outer\"),i=r.style;i.position=\"absolute\",i.left=\"-10000px\",i.overflow=\"hidden\",i.width=\"200px\",i.minWidth=\"0px\",i.height=\"150px\",i.display=\"block\",r.appendChild(u);var s=o.documentElement;s.appendChild(r);o=u.offsetWidth;i.overflow=\"scroll\";u=u.offsetWidth;return o==u&&(u=r.clientWidth),s.removeChild(r),o-u},t.setInnerHtml=function(e,t){var n=e.cloneNode(!1);return n.innerHTML=t,e.parentNode.replaceChild(n,e),n},\"textContent\"in document.documentElement?(t.setInnerText=function(e,t){e.textContent=t},t.getInnerText=function(e){return e.textContent}):(t.setInnerText=function(e,t){e.innerText=t},t.getInnerText=function(e){return e.innerText}),t.getParentWindow=function(e){return e.defaultView||e.parentWindow})}),ace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"],function(e,t,n){function o(e,t,n){var l,o=s(t);if(!i.isMac&&u){if((u[91]||u[92])&&(o|=8),u.altGr){if(3==(3&o))return;u.altGr=0}18!==n&&17!==n||(l=t.location||t.keyLocation,17===n&&1===l?a=t.timeStamp:18===n&&3===o&&2===l&&(l=-a,(l+=a=t.timeStamp)<3&&(u.altGr=!0)))}if(n in r.MODIFIER_KEYS){switch(r.MODIFIER_KEYS[n]){case\"Alt\":o=2;break;case\"Shift\":o=4;break;case\"Ctrl\":o=1;break;default:o=8}n=-1}if(8&o&&(91===n||93===n)&&(n=-1),o||13!==n||!t.location&&3!==t.keyLocation||(e(t,o,-n),!t.defaultPrevented))return!!(o||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS)&&e(t,o,n)}var r=e(\"./keys\"),i=e(\"./useragent\");t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);var r;e.attachEvent&&(r=function(){n.call(e,window.event)},n._wrapper=r,e.attachEvent(\"on\"+t,r))},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent(\"on\"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return\"dblclick\"==e.type?0:\"contextmenu\"==e.type||e.ctrlKey&&i.isMac?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,\"mousemove\",n,!0),t.removeListener(document,\"mouseup\",i,!0),t.removeListener(document,\"dragstart\",i,!0)}return t.addListener(document,\"mousemove\",n,!0),t.addListener(document,\"mouseup\",i,!0),t.addListener(document,\"dragstart\",i,!0),i},t.addMouseWheelListener=function(e,n){\"onmousewheel\"in e?t.addListener(e,\"mousewheel\",function(e){void 0!==e.wheelDeltaX?(e.wheelX=-e.wheelDeltaX/8,e.wheelY=-e.wheelDeltaY/8):(e.wheelX=0,e.wheelY=-e.wheelDelta/8),n(e)}):\"onwheel\"in e?t.addListener(e,\"wheel\",function(e){switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=.35*e.deltaX||0,e.wheelY=.35*e.deltaY||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=5*(e.deltaX||0),e.wheelY=5*(e.deltaY||0)}n(e)}):t.addListener(e,\"DOMMouseScroll\",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=5*(e.detail||0),e.wheelY=0):(e.wheelX=0,e.wheelY=5*(e.detail||0)),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){var u,a,f,o=0,l={2:\"dblclick\",3:\"tripleclick\",4:\"quadclick\"};t.addListener(e,\"mousedown\",function(e){var c;if(0!==t.getButton(e)?o=0:1<e.detail?4<++o&&(o=1):o=1,i.isIE&&(c=5<Math.abs(e.clientX-u)||5<Math.abs(e.clientY-a),f&&!c||(o=1),f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),1==o&&(u=e.clientX,a=e.clientY)),r[s](\"mousedown\",e),4<o)o=0;else if(1<o)return r[s](l[o],e)}),i.isOldIE&&t.addListener(e,\"dblclick\",function(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s](\"mousedown\",e),r[s](l[o],e)})};var s=!i.isMac||!i.isOpera||\"KeyboardEvent\"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[s(e)]};var u=null,a=0;t.addCommandKeyListener=function(e,n){var s,a,r=t.addListener;i.isOldGecko||i.isOpera&&!(\"KeyboardEvent\"in window)?(s=null,r(e,\"keydown\",function(e){s=e.keyCode}),r(e,\"keypress\",function(e){return o(n,e,s)})):(a=null,r(e,\"keydown\",function(e){u[e.keyCode]=!0;var t=o(n,e,e.keyCode);return a=e.defaultPrevented,t}),r(e,\"keypress\",function(e){a&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),a=null)}),r(e,\"keyup\",function(e){u[e.keyCode]=null}),u||(u=Object.create(null),r(window,\"focus\",function(e){u=Object.create(null)})))},window.postMessage&&!i.isOldIE&&(t.nextTick=function(e,n){n=n||window;var r=\"zero-timeout-message-1\";t.addListener(n,\"message\",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,\"message\",i),e())}),n.postMessage(r,\"*\")}),t.nextFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame,t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\"],function(e,t,n){var r=e(\"./oop\"),i=function(){var t,n,e={MODIFIER_KEYS:{16:\"Shift\",17:\"Ctrl\",18:\"Alt\",224:\"Meta\"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,super:8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:\"Backspace\",9:\"Tab\",13:\"Return\",19:\"Pause\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"Print\",45:\"Insert\",46:\"Delete\",96:\"Numpad0\",97:\"Numpad1\",98:\"Numpad2\",99:\"Numpad3\",100:\"Numpad4\",101:\"Numpad5\",102:\"Numpad6\",103:\"Numpad7\",104:\"Numpad8\",105:\"Numpad9\",\"-13\":\"NumpadEnter\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"Numlock\",145:\"Scrolllock\"},PRINTABLE_KEYS:{32:\" \",48:\"0\",49:\"1\",50:\"2\",51:\"3\",52:\"4\",53:\"5\",54:\"6\",55:\"7\",56:\"8\",57:\"9\",59:\";\",61:\"=\",65:\"a\",66:\"b\",67:\"c\",68:\"d\",69:\"e\",70:\"f\",71:\"g\",72:\"h\",73:\"i\",74:\"j\",75:\"k\",76:\"l\",77:\"m\",78:\"n\",79:\"o\",80:\"p\",81:\"q\",82:\"r\",83:\"s\",84:\"t\",85:\"u\",86:\"v\",87:\"w\",88:\"x\",89:\"y\",90:\"z\",107:\"+\",109:\"-\",110:\".\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"}};for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e.return,e.escape=e.esc,e.del=e.delete,e[173]=\"-\",function(){for(var t=[\"cmd\",\"ctrl\",\"alt\",\"shift\"],n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join(\"-\")+\"-\"}(),e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return(t=\"string\"!=typeof t?String.fromCharCode(e):t).toLowerCase()}}),ace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(e,t,n){t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"],function(e,t,n){var r,i;t.OS={LINUX:\"LINUX\",MAC:\"MAC\",WINDOWS:\"WINDOWS\"},t.getOS=function(){return t.isMac?t.OS.MAC:t.isLinux?t.OS.LINUX:t.OS.WINDOWS},\"object\"==typeof navigator&&(r=(navigator.platform.match(/mac|win|linux/i)||[\"other\"])[0].toLowerCase(),i=navigator.userAgent,t.isWin=\"win\"==r,t.isMac=\"mac\"==r,t.isLinux=\"linux\"==r,t.isIE=\"Microsoft Internet Explorer\"==navigator.appName||0<=navigator.appName.indexOf(\"MSAppHost\")?parseFloat((i.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=window.controllers&&\"Gecko\"===window.navigator.product,t.isOldGecko=t.isGecko&&parseInt((i.match(/rv\\:(\\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&\"[object Opera]\"==Object.prototype.toString.call(window.opera),t.isWebKit=parseFloat(i.split(\"WebKit/\")[1])||void 0,t.isChrome=parseFloat(i.split(\" Chrome/\")[1])||void 0,t.isAIR=0<=i.indexOf(\"AdobeAIR\"),t.isIPad=0<=i.indexOf(\"iPad\"),t.isTouchPad=0<=i.indexOf(\"TouchPad\"))}),ace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\"],function(y,t,n){y(\"./lib/fixoldbrowsers\");var r=y(\"./lib/oop\"),i=y(\"./lib/dom\"),s=y(\"./lib/lang\"),o=y(\"./lib/useragent\"),u=y(\"./keyboard/textinput\").TextInput,a=y(\"./mouse/mouse_handler\").MouseHandler,f=y(\"./mouse/fold_handler\").FoldHandler,l=y(\"./keyboard/keybinding\").KeyBinding,c=y(\"./edit_session\").EditSession,h=y(\"./search\").Search,p=y(\"./range\").Range,d=y(\"./lib/event_emitter\").EventEmitter,v=y(\"./commands/command_manager\").CommandManager,m=y(\"./commands/default_commands\").commands,g=y(\"./config\"),y=function(e,t){var n=e.getContainerElement();this.container=n,this.renderer=e,this.commands=new v(o.isMac?\"mac\":\"win\",m),this.textInput=new u(e.getTextAreaContainer(),this),this.renderer.textarea=this.textInput.getElement(),this.keyBinding=new l(this),this.$mouseHandler=new a(this),new f(this),this.$blockScrolling=0,this.$search=(new h).set({wrap:!0}),this.$historyTracker=this.$historyTracker.bind(this),this.commands.on(\"exec\",this.$historyTracker),this.$initOperationListeners(),this._$emitInputEvent=s.delayedCall(function(){this._signal(\"input\",{}),this.session.bgTokenizer&&this.session.bgTokenizer.scheduleStart()}.bind(this)),this.on(\"change\",function(e,t){t._$emitInputEvent.schedule(31)}),this.setSession(t||new c(\"\")),g.resetOptions(this),g._signal(\"editor\",this)};(function(){r.implement(this,d),this.$initOperationListeners=function(){this.selections=[],this.commands.on(\"exec\",function(r){this.startOperation(r),\"fileJump\"==r.command.aceCommandGroup?(r=this.prevOp)&&\"fileJump\"==r.command.aceCommandGroup||(this.lastFileJumpPos=function(e){return e[e.length-1]}(this.selections)):this.lastFileJumpPos=null}.bind(this),!0),this.commands.on(\"afterExec\",function(e){\"fileJump\"==e.command.aceCommandGroup&&this.lastFileJumpPos&&!this.curOp.selectionChanged&&this.selection.fromJSON(this.lastFileJumpPos),this.endOperation(e)}.bind(this),!0),this.$opResetTimer=s.delayedCall(this.endOperation.bind(this)),this.on(\"change\",function(){this.curOp||this.startOperation(),this.curOp.docChanged=!0}.bind(this),!0),this.on(\"changeSelection\",function(){this.curOp||this.startOperation(),this.curOp.selectionChanged=!0}.bind(this),!0)},this.curOp=null,this.prevOp={},this.startOperation=function(t){if(this.curOp){if(!t||this.curOp.command)return;this.prevOp=this.curOp}t||(this.previousCommand=null,t={}),this.$opResetTimer.schedule(),this.curOp={command:t.command||{},args:t.args,scrollTop:this.renderer.scrollTop};t=this.curOp.command;t&&t.scrollIntoView&&this.$blockScrolling++,this.selections.push(this.selection.toJSON())},this.endOperation=function(){if(this.curOp){var e=this.curOp.command;if(e&&e.scrollIntoView){switch(this.$blockScrolling--,e.scrollIntoView){case\"center\":this.renderer.scrollCursorIntoView(null,.5);break;case\"animate\":case\"cursor\":this.renderer.scrollCursorIntoView();break;case\"selectionPart\":var t=this.selection.getRange(),n=this.renderer.layerConfig;(t.start.row>=n.lastRow||t.end.row<=n.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead)}\"animate\"==e.scrollIntoView&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$historyTracker=function(e){var t,n,r,i;this.$mergeUndoDeltas&&(n=[\"backspace\",\"del\",\"insertstring\"],r=(t=this.prevOp).command&&e.command.name==t.command.name,\"insertstring\"==e.command.name?(i=e.args,void 0===this.mergeNextCommand&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\\s/.test(i)||/\\s/.test(t.args)),this.mergeNextCommand=!0):r=r&&-1!==n.indexOf(e.command.name),(r=\"always\"!=this.$mergeUndoDeltas&&2e3<Date.now()-this.sequenceStartTime?!1:r)?this.session.mergeUndoDeltas=!0:-1!==n.indexOf(e.command.name)&&(this.sequenceStartTime=Date.now()))},this.setKeyboardHandler=function(e){var t;e?\"string\"==typeof e?(this.$keybindingId=e,t=this,g.loadModule([\"keybinding\",e],function(n){t.$keybindingId==e&&t.keyBinding.setKeyboardHandler(n&&n.handler)})):(this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e)):this.keyBinding.setKeyboardHandler(null)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){var t,n;this.session!=e&&((t=this.session)&&(this.session.removeEventListener(\"change\",this.$onDocumentChange),this.session.removeEventListener(\"changeMode\",this.$onChangeMode),this.session.removeEventListener(\"tokenizerUpdate\",this.$onTokenizerUpdate),this.session.removeEventListener(\"changeTabSize\",this.$onChangeTabSize),this.session.removeEventListener(\"changeWrapLimit\",this.$onChangeWrapLimit),this.session.removeEventListener(\"changeWrapMode\",this.$onChangeWrapMode),this.session.removeEventListener(\"onChangeFold\",this.$onChangeFold),this.session.removeEventListener(\"changeFrontMarker\",this.$onChangeFrontMarker),this.session.removeEventListener(\"changeBackMarker\",this.$onChangeBackMarker),this.session.removeEventListener(\"changeBreakpoint\",this.$onChangeBreakpoint),this.session.removeEventListener(\"changeAnnotation\",this.$onChangeAnnotation),this.session.removeEventListener(\"changeOverwrite\",this.$onCursorChange),this.session.removeEventListener(\"changeScrollTop\",this.$onScrollTopChange),this.session.removeEventListener(\"changeScrollLeft\",this.$onScrollLeftChange),(n=this.session.getSelection()).removeEventListener(\"changeCursor\",this.$onCursorChange),n.removeEventListener(\"changeSelection\",this.$onSelectionChange)),(this.session=e)&&(this.$onDocumentChange=this.onDocumentChange.bind(this),e.addEventListener(\"change\",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.addEventListener(\"changeMode\",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.addEventListener(\"tokenizerUpdate\",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.addEventListener(\"changeTabSize\",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.addEventListener(\"changeWrapLimit\",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.addEventListener(\"changeWrapMode\",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.addEventListener(\"changeFold\",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener(\"changeFrontMarker\",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener(\"changeBackMarker\",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener(\"changeBreakpoint\",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener(\"changeAnnotation\",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener(\"changeOverwrite\",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener(\"changeScrollTop\",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener(\"changeScrollLeft\",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.addEventListener(\"changeCursor\",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener(\"changeSelection\",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),--this.$blockScrolling,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()),this._signal(\"changeSession\",{session:e,oldSession:t}),t&&t._signal(\"changeEditor\",{oldEditor:this}),e&&e._signal(\"changeEditor\",{editor:this}))},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?1==t?this.navigateFileEnd():-1==t&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption(\"fontSize\")||i.computedStyle(this.container,\"fontSize\")},this.setFontSize=function(e){this.setOption(\"fontSize\",e)},this.$highlightBrackets=function(){var e;this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null),this.$highlightPending||((e=this).$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var n,t=e.session.findMatchingBracket(e.getCursorPosition());t?n=new p(t.row,t.column,t.row,t.column+1):e.session.$mode.getMatching&&(n=e.session.$mode.getMatching(e.session)),n&&(e.session.$bracketHighlight=e.session.addMarker(n,\"ace_bracket\",\"text\"))},50))},this.focus=function(){var e=this;setTimeout(function(){e.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.$isFocused||(this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit(\"focus\"))},this.onBlur=function(){this.$isFocused&&(this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit(\"blur\"))},this.$cursorChange=function(){this.renderer.updateCursor()},this.onDocumentChange=function(e){var r=e.data,n=r.range,r=n.start.row==n.end.row&&\"insertLines\"!=r.action&&\"removeLines\"!=r.action?n.end.row:1/0;this.renderer.updateLines(n.start.row,r),this._signal(\"change\",e),this.$cursorChange()},this.onTokenizerUpdate=function(t){t=t.data;this.renderer.updateLines(t.first,t.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.$highlightBrackets(),this.$updateHighlightActiveLine(),this._signal(\"changeSelection\")},this.$updateHighlightActiveLine=function(){var t,n,e=this.getSession();this.$highlightActiveLine&&(\"line\"==this.$selectionStyle&&this.selection.isMultiLine()||(t=this.getCursorPosition()),!this.renderer.$maxLines||1!==this.session.getLength()||1<this.renderer.$minLines||(t=!1)),e.$highlightLineMarker&&!t?(e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null):!e.$highlightLineMarker&&t?((n=new p(t.row,t.column,t.row,1/0)).id=e.addMarker(n,\"ace_active-line\",\"screenLine\"),e.$highlightLineMarker=n):t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal(\"changeBackMarker\"))},this.onSelectionChange=function(e){var n,t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null,this.selection.isEmpty()?this.$updateHighlightActiveLine():(n=this.selection.getRange(),i=this.getSelectionStyle(),t.$selectionMarker=t.addMarker(n,\"ace_selection\",i));var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal(\"changeSelection\")},this.$getSelectionHighLightRegexp=function(){var o=this.session,t=this.getSelectionRange();if(!t.isEmpty()&&!t.isMultiLine()){var n=t.start.column-1,r=t.end.column+1,i=o.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(!(0<=n&&/^[\\w\\d]/.test(o)||r<=s&&/[\\w\\d]$/.test(o))){o=i.substring(t.start.column,t.end.column);if(/^[\\w\\d]+$/.test(o))return this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o})}}},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit(\"changeMode\",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal(\"copy\",e),e},this.onCopy=function(){this.commands.exec(\"copy\",this)},this.onCut=function(){this.commands.exec(\"cut\",this)},this.onPaste=function(t){this.$readOnly||(this._signal(\"paste\",t={text:t}),this.insert(t.text,!0))},this.execCommand=function(e,t){this.commands.exec(e,this,t)},this.insert=function(e,f){var s,n=this.session,r=n.getMode(),i=this.getCursorPosition();!this.getBehavioursEnabled()||f||(s=r.transformAction(n.getState(i.row),\"insertion\",this,n,e))&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text),\"\\t\"==e&&(e=this.session.getTabString()),this.selection.isEmpty()?this.session.getOverwrite()&&((l=new p.fromPoints(i,i)).end.column+=e.length,this.session.remove(l)):(l=this.getSelectionRange(),i=this.session.remove(l),this.clearSelection()),\"\\n\"!=e&&\"\\r\\n\"!=e||(d=n.getLine(i.row),i.column>d.search(/\\S|$/)&&(c=d.substr(i.column).search(/\\S|$/),n.doc.removeInLine(i.row,i.column,i.column+c))),this.clearSelection();var f=i.column,l=n.getState(i.row),d=n.getLine(i.row),c=r.checkOutdent(l,d,e);n.insert(i,e);s&&s.selection&&(2==s.selection.length?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3]))),n.getDocument().isNewLine(e)&&(d=r.getNextLineIndent(l,d.slice(0,i.column),n.getTabString()),n.insert({row:i.row+1,column:0},d)),c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption(\"scrollSpeed\",e)},this.getScrollSpeed=function(){return this.getOption(\"scrollSpeed\")},this.setDragDelay=function(e){this.setOption(\"dragDelay\",e)},this.getDragDelay=function(){return this.getOption(\"dragDelay\")},this.setSelectionStyle=function(e){this.setOption(\"selectionStyle\",e)},this.getSelectionStyle=function(){return this.getOption(\"selectionStyle\")},this.setHighlightActiveLine=function(e){this.setOption(\"highlightActiveLine\",e)},this.getHighlightActiveLine=function(){return this.getOption(\"highlightActiveLine\")},this.setHighlightGutterLine=function(e){this.setOption(\"highlightGutterLine\",e)},this.getHighlightGutterLine=function(){return this.getOption(\"highlightGutterLine\")},this.setHighlightSelectedWord=function(e){this.setOption(\"highlightSelectedWord\",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption(\"readOnly\",e)},this.getReadOnly=function(){return this.getOption(\"readOnly\")},this.setBehavioursEnabled=function(e){this.setOption(\"behavioursEnabled\",e)},this.getBehavioursEnabled=function(){return this.getOption(\"behavioursEnabled\")},this.setWrapBehavioursEnabled=function(e){this.setOption(\"wrapBehavioursEnabled\",e)},this.getWrapBehavioursEnabled=function(){return this.getOption(\"wrapBehavioursEnabled\")},this.setShowFoldWidgets=function(e){this.setOption(\"showFoldWidgets\",e)},this.getShowFoldWidgets=function(){return this.getOption(\"showFoldWidgets\")},this.setFadeFoldWidgets=function(e){this.setOption(\"fadeFoldWidgets\",e)},this.getFadeFoldWidgets=function(){return this.getOption(\"fadeFoldWidgets\")},this.remove=function(i){this.selection.isEmpty()&&(\"left\"==i?this.selection.selectLeft():this.selection.selectRight());var s,o,t=this.getSelectionRange();this.getBehavioursEnabled()&&(s=(o=this.session).getState(t.start.row),i=o.getMode().transformAction(s,\"deletion\",this,o,t),0!==t.end.column||\"\\n\"==(s=o.getTextRange(t))[s.length-1]&&(o=o.getLine(t.end.row),/^\\s+$/.test(o)&&(t.end.column=o.length)),i&&(t=i)),this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert(\"\\n\"),this.moveCursorToPosition(e)},this.transposeLetters=function(){var e,n,r,i;!this.selection.isEmpty()||0!==(i=(e=this.getCursorPosition()).column)&&(i=i<(n=this.session.getLine(e.row)).length?(r=n.charAt(i)+n.charAt(i-1),new p(e.row,i-1,e.row,i+1)):(r=n.charAt(i-1)+n.charAt(i-2),new p(e.row,i-2,e.row,i)),this.session.replace(i,r))},this.toLowerCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toLowerCase()),this.selection.setSelectionRange(e)},this.toUpperCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toUpperCase()),this.selection.setSelectionRange(e)},this.indent=function(){var e=this.session,t=this.getSelectionRange();if(!(t.start.row<t.end.row)){if(t.start.column<t.end.column){var u=e.getTextRange(t);if(!/^\\s+$/.test(u)){n=this.$getSelectedRows();return void e.indentRows(n.first,n.last,\"\\t\")}}var i=e.getLine(t.start.row),a=t.start,u=e.getTabSize(),a=e.documentToScreenColumn(a.row,a.column);if(this.session.getUseSoftTabs())var l=s.stringRepeat(\" \",f=u-a%u);else{for(var f=a%u;\" \"==i[t.start.column]&&f;)t.start.column--,f--;this.selection.setSelectionRange(t),l=\"\\t\"}return this.insert(l)}var n=this.$getSelectedRows();e.indentRows(n.first,n.last,\"\\t\")},this.blockIndent=function(){var e=this.$getSelectedRows();this.session.indentRows(e.first,e.last,\"\\t\")},this.blockOutdent=function(){var e=this.session.getSelection();this.session.outdentRows(e.getRange())},this.sortLines=function(){for(var e=this.$getSelectedRows(),t=this.session,n=[],i=e.first;i<=e.last;i++)n.push(t.getLine(i));n.sort(function(e,t){return e.toLowerCase()<t.toLowerCase()?-1:e.toLowerCase()>t.toLowerCase()?1:0});for(var r=new p(0,0,0,0),i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\\-]?[0-9]+(?:\\.[0-9]+)?/g;n.lastIndex=0;for(var r=this.session.getLine(e);n.lastIndex<t;){var i=n.exec(r);if(i.index<=t&&i.index+i[0].length>=t)return{value:i[0],start:i.index,end:i.index+i[0].length}}return null},this.modifyNumber=function(e){var s,o,t=this.selection.getCursor().row,n=this.selection.getCursor().column,l=new p(t,n-1,t,n),f=this.session.getTextRange(l);isNaN(parseFloat(f))||!isFinite(f)||(s=this.getNumberAt(t,n))&&(o=0<=s.value.indexOf(\".\")?s.start+s.value.indexOf(\".\")+1:s.end,l=s.start+s.value.length-o,f=parseFloat(s.value),f*=Math.pow(10,l),o!==s.end&&n<o?e*=Math.pow(10,s.end-n-1):e*=Math.pow(10,s.end-n),f+=e,f=(f/=Math.pow(10,l)).toFixed(l),l=new p(t,s.start,t,s.end),this.session.replace(l,f),this.moveCursorTo(t,Math.max(s.start+1,n+f.length-s.value.length)))},this.removeLines=function(){var t=this.$getSelectedRows(),t=0===t.first||t.last+1<this.session.getLength()?new p(t.first,0,t.last+1,0):new p(t.first-1,this.session.getLine(t.first-1).length,t.last,this.session.getLine(t.last).length);this.session.remove(t),this.clearSelection()},this.duplicateSelection=function(){var s,e=this.selection,o=this.session,n=e.getRange(),r=e.isBackwards();n.isEmpty()?(s=n.start.row,o.duplicateLines(s,s)):(s=r?n.start:n.end,o=o.insert(s,o.getTextRange(n),!1),n.start=s,n.end=o,e.setSelectionRange(n,r))},this.moveLinesDown=function(){this.$moveLines(function(e,t){return this.session.moveLinesDown(e,t)})},this.moveLinesUp=function(){this.$moveLines(function(e,t){return this.session.moveLinesUp(e,t)})},this.moveText=function(e,t,n){return this.session.moveText(e,t,n)},this.copyLinesUp=function(){this.$moveLines(function(e,t){return this.session.duplicateLines(e,t),0})},this.copyLinesDown=function(){this.$moveLines(function(e,t){return this.session.duplicateLines(e,t)})},this.$moveLines=function(e){var t=this.selection;if(!t.inMultiSelectMode||this.inVirtualSelectionMode){var n=t.toOrientedRange(),r=this.$getSelectedRows(n),i=e.call(this,r.first,r.last);n.moveBy(i,0),t.fromOrientedRange(n)}else{var s=t.rangeList.ranges;t.rangeList.detach(this.session);for(var o=s.length;o--;){for(var u=o,a=(r=s[o].collapseRows()).end.row,f=r.start.row;o--&&f-(r=s[o].collapseRows()).end.row<=1;)f=r.end.row;o++;for(i=e.call(this,f,a);o<=u;)s[u].moveBy(i,0),u--}t.fromOrientedRange(t.ranges[0]),t.rangeList.attach(this.session)}},this.$getSelectedRows=function(){var e=this.getSelectionRange().collapseRows();return{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(s,t){var n=this.renderer,r=this.renderer.layerConfig,i=s*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,!0===t?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):!1===t&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),null!=t&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var t=this.getSelectionRange(),t={row:Math.floor(t.start.row+(t.end.row-t.start.row)/2),column:Math.floor(t.start.column+(t.end.column-t.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),--this.$blockScrolling},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e){var t=this.getCursorPosition(),n=this.session.getBracketRange(t);if(!n){if(!(n=this.find({needle:/[{}()\\[\\]]/g,preventScroll:!0,start:{row:t.row,column:t.column-1}})))return;var r=n.start;r.row==t.row&&Math.abs(r.column-t.column)<2&&(n=this.session.getBracketRange(r))}(r=n&&n.cursor||r)&&(e?n&&n.isEqual(this.getSelectionRange())?this.clearSelection():this.selection.selectTo(r.row,r.column):this.selection.moveTo(r.row,r.column))},this.gotoLine=function(e,t,n){this.selection.clearSelection(),this.session.unfold({row:e-1,column:t||0}),this.$blockScrolling+=1,this.exitMultiSelectMode&&this.exitMultiSelectMode(),this.moveCursorTo(e-1,t||0),--this.$blockScrolling,this.isRowFullyVisible(e-1)||this.scrollToLine(e-1,!0,n)},this.navigateTo=function(e,t){this.selection.moveTo(e,t)},this.navigateUp=function(e){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),this.selection.moveCursorBy(-e||-1,0)},this.navigateDown=function(e){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),this.selection.moveCursorBy(e||1,0)},this.navigateLeft=function(e){if(this.selection.isEmpty())for(e=e||1;e--;)this.selection.moveCursorLeft();else{var t=this.getSelectionRange().start;this.moveCursorToPosition(t)}this.clearSelection()},this.navigateRight=function(e){if(this.selection.isEmpty())for(e=e||1;e--;)this.selection.moveCursorRight();else{var t=this.getSelectionRange().end;this.moveCursorToPosition(t)}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(e,r){r&&this.$search.set(r);var n=this.$search.find(this.session),r=0;return n&&(this.$tryReplace(n,e)&&(r=1),null!==n&&(this.selection.setSelectionRange(n),this.renderer.scrollSelectionIntoView(n.start,n.end))),r},this.replaceAll=function(e,i){i&&this.$search.set(i);var n=this.$search.findAll(this.session),r=0;if(!n.length)return r;this.$blockScrolling+=1;i=this.getSelectionRange();this.selection.moveTo(0,0);for(var s=n.length-1;0<=s;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),--this.$blockScrolling,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return null!==(t=this.$search.replace(n,t))?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(s,t,n){t=t||{},\"string\"==typeof s||s instanceof RegExp?t.needle=s:\"object\"==typeof s&&r.mixin(t,s);var i=this.selection.getRange();null==t.needle&&((s=this.session.getTextRange(i)||this.$search.$options.needle)||(i=this.session.getWordRange(i.start.row,i.start.column),s=this.session.getTextRange(i)),this.$search.set({needle:s})),this.$search.set(t),t.start||this.$search.set({start:i});s=this.$search.find(this.session);return t.preventScroll?s:s?(this.revealRange(s,n),s):(t.backwards?i.start=i.end:i.end=i.start,void this.selection.setRange(i))},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),--this.$blockScrolling;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),!1!==t&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal(\"destroy\",this)},this.setAutoScrollEditorIntoView=function(e){var t,n,r,i,s,o,u;e&&(r=!1,(n=this).$scrollAnchor||(this.$scrollAnchor=document.createElement(\"div\")),(i=this.$scrollAnchor).style.cssText=\"position:absolute\",this.container.insertBefore(i,this.container.firstChild),s=this.on(\"changeSelection\",function(){r=!0}),o=this.renderer.on(\"beforeRender\",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on(\"afterRender\",function(){var s,o,u;r&&t&&n.isFocused()&&(s=(u=n.renderer).$cursorLayer.$pixelPos,o=u.layerConfig,u=s.top-o.offset,null!=(r=0<=s.top&&u+t.top<0||!(s.top<o.height&&s.top+t.top+o.lineHeight>window.innerHeight)&&null)&&(i.style.top=u+\"px\",i.style.left=s.left+\"px\",i.style.height=o.lineHeight+\"px\",i.scrollIntoView(r)),r=t=null)}),this.setAutoScrollEditorIntoView=function(e){e||(delete this.setAutoScrollEditorIntoView,this.removeEventListener(\"changeSelection\",s),this.renderer.removeEventListener(\"afterRender\",u),this.renderer.removeEventListener(\"beforeRender\",o))})},this.$resetCursorStyle=function(){var e=this.$cursorStyle||\"ace\",t=this.renderer.$cursorLayer;t&&(t.setSmoothBlinking(\"smooth\"==e),t.isBlinking=!this.$readOnly&&\"wide\"!=e)}}).call(y.prototype),g.defineOptions(y.prototype,\"editor\",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal(\"changeSelectionStyle\",{data:e})},initialValue:\"line\"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:[\"ace\",\"slim\",\"smooth\",\"wide\"],initialValue:\"ace\"},mergeUndoDeltas:{values:[!1,!0,\"always\"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},hScrollBarAlwaysVisible:\"renderer\",vScrollBarAlwaysVisible:\"renderer\",highlightGutterLine:\"renderer\",animatedScroll:\"renderer\",showInvisibles:\"renderer\",showPrintMargin:\"renderer\",printMarginColumn:\"renderer\",printMargin:\"renderer\",fadeFoldWidgets:\"renderer\",showFoldWidgets:\"renderer\",showLineNumbers:\"renderer\",showGutter:\"renderer\",displayIndentGuides:\"renderer\",fontSize:\"renderer\",fontFamily:\"renderer\",maxLines:\"renderer\",minLines:\"renderer\",scrollPastEnd:\"renderer\",fixedWidthGutter:\"renderer\",theme:\"renderer\",scrollSpeed:\"$mouseHandler\",dragDelay:\"$mouseHandler\",dragEnabled:\"$mouseHandler\",focusTimout:\"$mouseHandler\",tooltipFollowsMouse:\"$mouseHandler\",firstLineNumber:\"session\",overwrite:\"session\",newLineMode:\"session\",useWorker:\"session\",useSoftTabs:\"session\",tabSize:\"session\",wrap:\"session\",foldStyle:\"session\",mode:\"session\"}),t.Editor=y}),ace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(e,t,n){t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split(\"\").reverse().join(\"\")},t.stringRepeat=function(e,t){for(var n=\"\";0<t;)1&t&&(n+=e),(t>>=1)&&(e+=e);return n};var r=/^\\s\\s*/,i=/\\s\\s*$/;t.stringTrimLeft=function(e){return e.replace(r,\"\")},t.stringTrimRight=function(e){return e.replace(i,\"\")},t.copyObject=function(e){var n,t={};for(n in e)t[n]=e[n];return t},t.copyArray=function(e){for(var t=[],n=0,r=e.length;n<r;n++)e[n]&&\"object\"==typeof e[n]?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function(e){if(\"object\"!=typeof e||!e)return e;var n=e.constructor;if(n===RegExp)return e;var i,r=n();for(i in e)\"object\"==typeof e[i]?r[i]=t.deepCopy(e[i]):r[i]=e[i];return r},t.arrayToMap=function(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var n,t=Object.create(null);for(n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},t.escapeHTML=function(e){return e.replace(/&/g,\"&#38;\").replace(/\"/g,\"&#34;\").replace(/'/g,\"&#39;\").replace(/</g,\"&#60;\")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){function n(){t=null,e()}var t=null,r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return(r.schedule=r).call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r.isPending=function(){return t},r},t.delayedCall=function(e,t){function r(){n=null,e()}function i(e){null==n&&(n=setTimeout(r,e||t))}var n=null;return i.delay=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)},(i.schedule=i).call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),ace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\"],function(e,t,n){var r=e(\"../lib/event\"),i=e(\"../lib/useragent\"),s=e(\"../lib/dom\"),o=e(\"../lib/lang\"),u=i.isChrome<18,a=i.isIE;t.TextInput=function(R,t){function b(r){if(!h){var t,r=k?(t=0,r?0:n.value.length-1):(t=r?2:1,2);try{n.setSelectionRange(t,r)}catch(i){}}}function w(){h||(n.value=f,i.isWebKit&&y.schedule())}function q(){setTimeout(function(){p&&(n.style.cssText=p,p=\"\"),null==t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())},0)}var n=s.createElement(\"textarea\");n.className=\"ace_text-input\",i.isTouchPad&&n.setAttribute(\"x-palm-disable-auto-cap\",!0),n.wrap=\"off\",n.autocorrect=\"off\",n.autocapitalize=\"off\",n.spellcheck=!1,n.style.opacity=\"0\",R.insertBefore(n,R.firstChild);var f=\"\u0001\u0001\",l=!1,c=!1,h=!1,p=\"\",d=!0;try{var v=document.activeElement===n}catch(m){}r.addListener(n,\"blur\",function(){t.onBlur(),v=!1}),r.addListener(n,\"focus\",function(){v=!0,t.onFocus(),b()}),this.focus=function(){n.focus()},this.blur=function(){n.blur()},this.isFocused=function(){return v};var g=o.delayedCall(function(){v&&b(d)}),y=o.delayedCall(function(){h||(n.value=f,v&&b())});i.isWebKit||t.addEventListener(\"changeSelection\",function(){t.selection.isEmpty()!=d&&(d=!d,g.schedule())}),w(),v&&t.onFocus();var S,x,T,N,E=function(e){return 0===e.selectionStart&&e.selectionEnd===e.value.length};!n.setSelectionRange&&n.createTextRange&&(n.setSelectionRange=function(e,t){var n=this.createTextRange();n.collapse(!0),n.moveStart(\"character\",e),n.moveEnd(\"character\",t),n.select()},E=function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return!(!t||t.parentElement()!=e)&&t.text==e.value}),i.isOldIE&&(S=!1,T=o.delayedCall(x=function(e){if(!S){var t=n.value;if(!h&&t&&t!=f)return e&&t==f[0]?T.schedule():(A(t),S=!0,w(),void(S=!1))}}),r.addListener(n,\"propertychange\",x),N={13:1,27:1},r.addListener(n,\"keyup\",function(e){return!h||n.value&&!N[e.keyCode]||setTimeout(F,0),(n.value.charCodeAt(0)||0)<129?T.call():void(h?j:B)()}),r.addListener(n,\"keydown\",function(e){T.schedule(50)}));var k=null;this.setInputHandler=function(e){k=e};function M(r,t){var n=r.clipboardData||window.clipboardData;if(n&&!u){r=a?\"Text\":\"text/plain\";return t?!1!==n.setData(r,t):n.getData(r)}}function _(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);M(e,s)?(i?t.onCut():t.onCopy(),r.preventDefault(e)):(l=!0,n.value=s,n.select(),setTimeout(function(){l=!1,w(),b(),i?t.onCut():t.onCopy()}))}function D(e){_(e,!0)}function P(e){_(e,!1)}function H(e){var s=M(e);\"string\"==typeof s?(s&&t.onPaste(s),i.isIE&&setTimeout(b),r.preventDefault(e)):(n.value=\"\",c=!0)}var L=!(this.getInputHandler=function(){return k}),A=function(e){k&&(e=k(e),k=null),c?(b(),e&&t.onPaste(e),c=!1):e==f.charAt(0)?L?t.execCommand(\"del\",{source:\"ace\"}):t.execCommand(\"backspace\",{source:\"ace\"}):(e.substring(0,2)==f?e=e.substr(2):e.charAt(0)==f.charAt(0)?e=e.substr(1):e.charAt(e.length-1)==f.charAt(0)&&(e=e.slice(0,-1)),(e=e.charAt(e.length-1)==f.charAt(0)?e.slice(0,-1):e)&&t.onTextInput(e)),L=L&&!1};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,\"select\",function(e){l?l=!1:E(n)?(t.selectAll(),b()):k&&b(t.selection.isEmpty())}),r.addListener(n,\"input\",function(e){var t;h||(t=n.value,A(t),w())}),r.addListener(n,\"cut\",D),r.addListener(n,\"copy\",P),r.addListener(n,\"paste\",H),\"oncut\"in n&&\"oncopy\"in n&&\"onpaste\"in n||r.addListener(R,\"keydown\",function(e){if((!i.isMac||e.metaKey)&&e.ctrlKey)switch(e.keyCode){case 67:P(e);break;case 86:H(e);break;case 88:D(e)}});var B=function(e){!h&&t.onCompositionStart&&(h={},t.onCompositionStart(),setTimeout(j,0),t.on(\"mousedown\",F),t.selection.isEmpty()||(t.insert(\"\"),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup())},j=function(){var r;h&&t.onCompositionUpdate&&(r=n.value.replace(/\\x01/g,\"\"),h.lastValue!==r&&(t.onCompositionUpdate(r),h.lastValue&&t.undo(),h.lastValue=r,h.lastValue&&(r=t.selection.getRange(),t.insert(h.lastValue),t.session.markUndoGroup(),h.range=t.selection.getRange(),t.selection.setRange(r),t.selection.clearSelection())))},F=function(e){var r,i;t.onCompositionEnd&&(r=h,h=!1,i=setTimeout(function(){i=null;var e=n.value.replace(/\\x01/g,\"\");h||(e==r.lastValue?w():!r.lastValue&&e&&(w(),A(e)))}),k=function(n){return i&&clearTimeout(i),(n=n.replace(/\\x01/g,\"\"))==r.lastValue?\"\":(r.lastValue&&i&&t.undo(),n)},t.onCompositionEnd(),t.removeListener(\"mousedown\",F),\"compositionend\"==e.type&&r.range&&t.selection.setRange(r.range))},I=o.delayedCall(j,50);r.addListener(n,\"compositionstart\",B),i.isGecko?r.addListener(n,\"text\",function(){I.schedule()}):(r.addListener(n,\"keyup\",function(){I.schedule()}),r.addListener(n,\"keydown\",function(){I.schedule()})),r.addListener(n,\"compositionend\",F),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){L=!0,p=p||n.style.cssText,n.style.cssText=\"z-index:100000;\"+(i.isIE?\"opacity:0.1;\":\"\"),b(t.selection.isEmpty()),t._emit(\"nativecontextmenu\",{target:t,domEvent:e});var c=t.container.getBoundingClientRect(),u=s.computedStyle(t.container),a=c.top+(parseInt(u.borderTopWidth)||0),f=c.left+(parseInt(c.borderLeftWidth)||0),l=c.bottom-a-n.clientHeight,c=function(e){n.style.left=e.clientX-f-2+\"px\",n.style.top=Math.min(e.clientY-a-2,l)+\"px\"};c(e),\"mousedown\"==e.type&&(t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),i.isWin&&r.capture(t.container,c,q))},this.onContextMenuClose=q,i.isGecko&&!i.isMac||(R=function(e){t.textInput.onContextMenu(e),q()},r.addListener(t.renderer.scroller,\"contextmenu\",R),r.addListener(n,\"contextmenu\",R))}}),ace.define(\"ace/mouse/mouse_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/mouse/default_handlers\",\"ace/mouse/default_gutter_handler\",\"ace/mouse/mouse_event\",\"ace/mouse/dragdrop_handler\",\"ace/config\"],function(l,t,n){var r=l(\"../lib/event\"),i=l(\"../lib/useragent\"),s=l(\"./default_handlers\").DefaultHandlers,o=l(\"./default_gutter_handler\").GutterHandler,u=l(\"./mouse_event\").MouseEvent,a=l(\"./dragdrop_handler\").DragdropHandler,f=l(\"../config\"),l=function(e){this.editor=e,new s(this),new o(this),new a(this);function t(t){e.focus()}var n=e.renderer.getMouseEventTarget();r.addListener(n,\"click\",this.onMouseEvent.bind(this,\"click\")),r.addListener(n,\"mousemove\",this.onMouseMove.bind(this,\"mousemove\")),r.addMultiMouseDownListener(n,[400,300,250],this,\"onMouseEvent\"),e.renderer.scrollBarV&&(r.addMultiMouseDownListener(e.renderer.scrollBarV.inner,[400,300,250],this,\"onMouseEvent\"),r.addMultiMouseDownListener(e.renderer.scrollBarH.inner,[400,300,250],this,\"onMouseEvent\"),i.isIE&&(r.addListener(e.renderer.scrollBarV.element,\"mousedown\",t),r.addListener(e.renderer.scrollBarH.element,\"mousemove\",t))),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,\"mousewheel\"));var u=e.renderer.$gutter;r.addListener(u,\"mousedown\",this.onMouseEvent.bind(this,\"guttermousedown\")),r.addListener(u,\"click\",this.onMouseEvent.bind(this,\"gutterclick\")),r.addListener(u,\"dblclick\",this.onMouseEvent.bind(this,\"gutterdblclick\")),r.addListener(u,\"mousemove\",this.onMouseEvent.bind(this,\"guttermousemove\")),r.addListener(n,\"mousedown\",t),r.addListener(u,\"mousedown\",function(t){return e.focus(),r.preventDefault(t)})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;n&&n.length&&this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=2*this.$scrollSpeed,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);function o(e){if(e)return i.isWebKit&&!e.which&&s.releaseMouse?s.releaseMouse():(s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),void(s.$mouseMoved=!0))}function a(e){clearInterval(l),f(),s[s.state+\"End\"]&&s[s.state+\"End\"](e),s.state=\"\",null==n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent(\"mouseup\",e)}var s=this,f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&\"dblclick\"==e.domEvent.type)return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null}).call(l.prototype),f.defineOptions(l.prototype,\"mouseHandler\",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:150},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,t,n){function u(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler(\"mousedown\",this.onMouseDown.bind(e)),t.setDefaultHandler(\"dblclick\",this.onDoubleClick.bind(e)),t.setDefaultHandler(\"tripleclick\",this.onTripleClick.bind(e)),t.setDefaultHandler(\"quadclick\",this.onQuadClick.bind(e)),t.setDefaultHandler(\"mousewheel\",this.onMouseWheel.bind(e));[\"select\",\"startSelect\",\"selectEnd\",\"selectAllEnd\",\"selectByWordsEnd\",\"selectByLinesEnd\",\"dragWait\",\"dragWaitEnd\",\"focusWait\"].forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,\"getLineRange\"),e.selectByWords=this.extendSelectionBy.bind(e,\"getWordRange\")}function f(e,t){return(e.start.row==e.end.row?2*t.column-e.start.column-e.end.column:e.start.row!=e.end.row-1||e.start.column||e.end.column?2*t.row-e.start.row-e.end.row:t.column-4)<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}e(\"../lib/dom\"),e(\"../lib/event\"),e(\"../lib/useragent\");(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor;if(0===e.getButton())return!t||r.isFocused()||(r.focus(),!this.$focusTimout||this.$clickSelection||r.inMultiSelectMode)?(this.captureMouse(e),!t||this.$clickSelection||e.getShiftKey()||r.inMultiSelectMode?this.startSelect(n):t&&(this.mousedownEvent.time=Date.now(),this.startSelect(n)),e.preventDefault()):(this.mousedownEvent.time=Date.now(),this.setState(\"focusWait\"),void this.captureMouse(e));r.getSelectionRange().isEmpty()&&r.selection.moveToPosition(n),r.textInput.onContextMenu(e.domEvent)},this.startSelect=function(e){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var t=this.editor;this.mousedownEvent.getShiftKey()?t.selection.selectToPosition(e):this.$clickSelection||t.selection.moveToPosition(e),t.renderer.scroller.setCapture&&t.renderer.scroller.setCapture(),t.setStyle(\"ace_selecting\"),this.setState(\"select\")},this.select=function(){var r,e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);this.$clickSelection&&(e=-1==(r=this.$clickSelection.comparePoint(n))?this.$clickSelection.end:1==r?this.$clickSelection.start:(n=(e=f(this.$clickSelection,n)).cursor,e.anchor),t.selection.setSelectionAnchor(e.row,e.column)),t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(o){var s,t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),u=n.selection[o](r.row,r.column);this.$clickSelection&&(s=this.$clickSelection.comparePoint(u.start),o=this.$clickSelection.comparePoint(u.end),-1==s&&o<=0?(t=this.$clickSelection.end,u.end.row==r.row&&u.end.column==r.column||(r=u.start)):1==o&&0<=s?(t=this.$clickSelection.start,u.start.row==r.row&&u.start.column==r.column||(r=u.end)):t=-1==s&&1==o?(r=u.end,u.start):(r=(u=f(this.$clickSelection,r)).cursor,u.anchor),n.selection.setSelectionAnchor(t.row,t.column)),n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle(\"ace_selecting\"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=function(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(0<e||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,i=n.session.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState(\"select\")):(i=n.selection.getWordRange(t.row,t.column),this.setState(\"selectByWords\")),this.$clickSelection=i,this[this.state]&&this[this.state](e)},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState(\"selectByLines\"),this.$clickSelection=n.selection.getLineRange(t.row),this[this.state]&&this[this.state](e)},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState(\"selectAll\")},this.onMouseWheel=function(e){if(!e.getAccelKey()){e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor;return r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed)||n<200?(this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()):void 0}}}).call(u.prototype),t.DefaultHandlers=u}),ace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"],function(e,t,n){function a(e){o.call(this,e)}var r=e(\"../lib/dom\"),i=e(\"../lib/oop\"),s=e(\"../lib/event\"),o=e(\"../tooltip\").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();n<(e+=15)+i&&(e-=e+i-n),r<(t+=15)+s&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=function(e){function l(){var v=u.getDocumentPosition().row,d=n.$annotations[v];if(!d)return c();if(v==t.session.getLength()){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}f!=d&&(f=d.text.join(\"<br/>\"),i.setHtml(f),i.show(),t.on(\"mousewheel\",c),e.$tooltipFollowsMouse?h(u):(d=n.$cells[t.session.documentToScreenRow(v,0)].element.getBoundingClientRect(),(v=i.getElement().style).left=d.right+\"px\",v.top=d.bottom+\"px\"))}function c(){o=o&&clearTimeout(o),f&&(i.hide(),f=null,t.removeEventListener(\"mousewheel\",c))}function h(e){i.setPosition(e.x,e.y)}var o,u,f,t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler(\"guttermousedown\",function(r){if(t.isFocused()&&0==r.getButton()&&\"foldWidgets\"!=n.getRegion(r)){var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(2==r.domEvent.detail)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState(\"selectByLines\"),e.captureMouse(r),r.preventDefault()}}),e.editor.setDefaultHandler(\"guttermousemove\",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,\"ace_fold-widget\"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t,o=o||setTimeout(function(){o=null,(u&&!e.isMousePressed?l:c)()},50)}),s.addListener(t.renderer.$gutter,\"mouseout\",function(e){u=null,f&&!o&&(o=setTimeout(function(){o=null,c()},50))}),t.on(\"changeSession\",c)}}),ace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"],function(e,t,n){function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}e(\"./lib/oop\");var i=e(\"./lib/dom\");(function(){this.$init=function(){return this.$element=i.createElement(\"div\"),this.$element.className=\"ace_tooltip\",this.$element.style.display=\"none\",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+\"px\",this.getElement().style.top=t+\"px\"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){null!=e&&this.setText(e),null!=t&&null!=n&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display=\"block\",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display=\"none\",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),ace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,s,n){var r=e(\"../lib/event\"),i=e(\"../lib/useragent\"),s=s.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};!function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos||(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var n,t=this.editor.getSelectionRange();return t.isEmpty()?this.$inSelection=!1:(n=this.getDocumentPosition(),this.$inSelection=t.contains(n.row,n.column)),this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}.call(s.prototype)}),ace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"],function(e,t,n){function f(e){function C(){var e=g;(function(e,s){var r=Date.now(),i=!s||e.row!=s.row,s=!s||e.column!=s.column;!S||i||s?(t.$blockScrolling+=1,t.moveCursorToPosition(e),--t.$blockScrolling,S=r,x={x:p,y:d}):5<l(x.x,x.y,p,d)?S=null:200<=r-S&&(t.renderer.scrollCursorIntoView(),S=null)})(g=t.renderer.screenToTextCoordinates(p,d),e),function(e,m){var r=Date.now(),h=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,c=t.renderer.scroller.getBoundingClientRect(),v={x:{left:p-c.left,right:c.right-p},y:{top:d-c.top,bottom:c.bottom-d}},f=Math.min(v.x.left,v.x.right),l=Math.min(v.y.top,v.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=v.x.left<v.x.right?-3:2),l/h<=1&&(c.row+=v.y.top<v.y.bottom?-1:1),h=e.row!=c.row,v=e.column!=c.column,m=!m||e.row!=m.row,h||v&&!m?E?200<=r-E&&t.renderer.scrollCursorIntoView(c):E=r:E=null}(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,\"ace_selection\",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),v=setInterval(C,20),y=0,i.addListener(document,\"mousemove\",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),--t.$blockScrolling,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),y=0,S=E=m=null,i.removeListener(document,\"mousemove\",O)}function O(){null==A&&(A=setTimeout(function(){null!=A&&h&&L()},20))}function M(t){t=t.types;return!t||Array.prototype.some.call(t,function(e){return\"text/plain\"==e||\"Text\"==e})}function _(e){var t=[\"copy\",\"copymove\",\"all\",\"uninitialized\"],r=s.isMac?e.altKey:e.ctrlKey,i=\"uninitialized\";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o=\"none\";return r&&0<=t.indexOf(i)?o=\"copy\":0<=[\"move\",\"copymove\",\"linkmove\",\"all\",\"uninitialized\"].indexOf(i)?o=\"move\":0<=t.indexOf(i)&&(o=\"copy\"),o}var t=e.editor,n=r.createElement(\"img\");n.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",s.isOpera&&(n.style.cssText=\"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\");[\"dragWait\",\"dragWaitEnd\",\"startDrag\",\"dragReadyEnd\",\"onMouseDrag\"].forEach(function(t){e[t]=this[t]},this),t.addEventListener(\"mousedown\",this.onMouseDown.bind(e));var h,p,d,v,m,g,b,w,E,S,x,c=t.container,y=0;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?\"copy\":\"copyMove\",s.isOpera&&(t.container.appendChild(n),n._top=n.offsetTop),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData(\"Text\",t.session.getTextRange()),w=!0,this.setState(\"drag\")},this.onDragEnd=function(n){c.draggable=!1,w=!1,this.setState(null),t.getReadOnly()||(n=n.dataTransfer.dropEffect,b||\"move\"!=n||t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)),this.editor.unsetStyle(\"ace_dragging\")},this.onDragEnter=function(e){if(!t.getReadOnly()&&M(e.dataTransfer))return h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(!t.getReadOnly()&&M(e.dataTransfer))return h||(k(),y++),null!==A&&(A=null),p=e.clientX,d=e.clientY,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){if(--y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(h){var r=e.dataTransfer;if(w)switch(b){case\"move\":m=m.contains(g.row,g.column)?{start:g,end:g}:t.moveText(m,g);break;case\"copy\":m=t.moveText(m,g,!0)}else{r=r.getData(\"Text\");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)}},i.addListener(c,\"dragstart\",this.onDragStart.bind(e)),i.addListener(c,\"dragend\",this.onDragEnd.bind(e)),i.addListener(c,\"dragenter\",this.onDragEnter.bind(e)),i.addListener(c,\"dragover\",this.onDragOver.bind(e)),i.addListener(c,\"dragleave\",this.onDragLeave.bind(e)),i.addListener(c,\"drop\",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e(\"../lib/dom\"),i=e(\"../lib/event\"),s=e(\"../lib/useragent\");(function(){this.dragWait=function(){Date.now()-this.mousedownEvent.time>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){this.editor.container.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle(\"ace_dragging\"),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1,this.editor.container.draggable=!0,this.editor.renderer.$cursorLayer.setBlinking(!1),this.editor.setStyle(\"ace_dragging\"),this.setState(\"dragReady\")},this.onMouseDrag=function(e){var t=this.editor.container;s.isIE&&\"dragReady\"==this.state&&3<l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y)&&t.dragDrop(),\"dragWait\"===this.state&&0<l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y)&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))},this.onMouseDown=function(e){var t,r,o;this.$dragEnabled&&(this.mousedownEvent=e,t=this.editor,o=e.inSelection(),r=e.getButton(),1===(e.domEvent.detail||1)&&0===r&&o&&(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey())||(this.mousedownEvent.time=Date.now(),\"unselectable\"in(o=e.domEvent.target||e.domEvent.srcElement)&&(o.unselectable=\"on\"),t.getDragDelay()?(s.isWebKit&&(this.cancelDrag=!0,t.container.draggable=!0),this.setState(\"dragWait\")):this.startDrag(),this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0)))}}).call(f.prototype),t.DragdropHandler=f}),ace.define(\"ace/config\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\"],function(e,t,n){var r=e(\"./lib/lang\"),i=e(\"./lib/oop\"),s=e(\"./lib/net\"),o=e(\"./lib/event_emitter\").EventEmitter,u=function(){return this}(),a={packaged:!1,workerPath:null,modePath:null,themePath:null,basePath:\"\",suffix:\".js\",$moduleUrls:{}};t.get=function(e){if(!a.hasOwnProperty(e))throw new Error(\"Unknown config key: \"+e);return a[e]},t.set=function(e,t){if(!a.hasOwnProperty(e))throw new Error(\"Unknown config key: \"+e);a[e]=t},t.all=function(){return r.copyObject(a)},i.implement(t,o),t.moduleUrl=function(s,t){if(a.$moduleUrls[s])return a.$moduleUrls[s];var o=s.split(\"/\"),r=\"snippets\"==(t=t||o[o.length-2]||\"\")?\"/\":\"-\",i=o[o.length-1];\"-\"==r&&(s=new RegExp(\"^\"+t+\"[\\\\-_]|[\\\\-_]\"+t+\"$\",\"g\"),i=i.replace(s,\"\")),(!i||i==t)&&1<o.length&&(i=o[o.length-2]);o=a[t+\"Path\"];return null==o?o=a.basePath:\"/\"==r&&(t=r=\"\"),o&&\"/\"!=o.slice(-1)&&(o+=\"/\"),o+t+r+i+this.get(\"suffix\")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,a){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return a&&a(i);if(t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(a),!(1<t.$loading[n].length)){a=function(){e([n],function(e){t._emit(\"load.module\",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get(\"packaged\"))return a();s.loadScript(t.moduleUrl(n,o),a)}},t.init=function(r){if(a.packaged=r||e.packaged||n.packaged||u.define&&define.packaged,!u.document)return\"\";for(var y,i={},s=\"\",o=document.getElementsByTagName(\"script\"),f=0;f<o.length;f++){var c=o[f],g=c.src||c.getAttribute(\"src\");if(g){for(var p=c.attributes,d=0,v=p.length;d<v;d++){var m=p[d];0===m.name.indexOf(\"data-ace-\")&&(i[function(e){return e.replace(/-(.)/g,function(e,t){return t.toUpperCase()})}(m.name.replace(/^data-ace-/,\"\"))]=m.value)}g=g.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);g&&(s=g[1])}}for(y in s&&(i.base=i.base||s,i.packaged=!0),i.basePath=i.base,i.workerPath=i.workerPath||i.base,i.modePath=i.modePath||i.base,i.themePath=i.themePath||i.base,delete i.base,i)void 0!==i[y]&&t.set(y,i[y])};var c={setOptions:function(e){Object.keys(e).forEach(function(t){this.setOption(t,e[t])},this)},getOptions:function(e){var t={};return e?Array.isArray(e)||(t=e,e=Object.keys(t)):e=Object.keys(this.$options),e.forEach(function(e){t[e]=this.getOption(e)},this),t},setOption:function(e,t){if(this[\"$\"+e]!==t){var n=this.$options[e];if(n)return n.forwardTo?this[n.forwardTo]&&this[n.forwardTo].setOption(e,t):(n.handlesSet||(this[\"$\"+e]=t),void(n&&n.set&&n.set.call(this,t)));\"undefined\"!=typeof console&&console.warn&&console.warn('misspelled option \"'+e+'\"')}},getOption:function(e){var t=this.$options[e];return t?t.forwardTo?this[t.forwardTo]&&this[t.forwardTo].getOption(e):t&&t.get?t.get.call(this):this[\"$\"+e]:void(\"undefined\"!=typeof console&&console.warn&&console.warn('misspelled option \"'+e+'\"'))}},h={};t.defineOptions=function(e,t,n){return e.$options||(h[t]=e.$options={}),Object.keys(n).forEach(function(t){var r=n[t];(r=\"string\"==typeof r?{forwardTo:r}:r).name||(r.name=t),\"initialValue\"in(e.$options[r.name]=r)&&(e[\"$\"+r.name]=r.initialValue)}),i.implement(e,c),this},t.resetOptions=function(e){Object.keys(e.$options).forEach(function(t){var n=e.$options[t];\"value\"in n&&e.setOption(t,n.value)})},t.setDefaultValue=function(i,n,r){i=h[i]||(h[i]={});i[n]&&(i.forwardTo?t.setDefaultValue(i.forwardTo,n,r):i[n].value=r)},t.setDefaultValues=function(e,n){Object.keys(n).forEach(function(r){t.setDefaultValue(e,r,n[r])})}}),ace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){var r=e(\"./dom\");t.get=function(e,t){var n=new XMLHttpRequest;n.open(\"GET\",e,!0),n.onreadystatechange=function(){4===n.readyState&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement(\"script\");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){!n&&i.readyState&&\"loaded\"!=i.readyState&&\"complete\"!=i.readyState||(i=i.onload=i.onreadystatechange=null,n||t())}},t.qualifyURL=function(e){var t=document.createElement(\"a\");return t.href=e,t.href}}),ace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(e,t,n){function i(){this.propagationStopped=!0}function s(){this.defaultPrevented=!0}var r={};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(n.length||r){(t=\"object\"!=typeof t||!t?{}:t).type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s);for(var n=n.slice(),o=0;o<n.length&&(n[o](t,this),!t.propagationStopped);o++);return r&&!t.defaultPrevented?r(t,this):void 0}},r._signal=function(e,t){if(n=(this._eventRegistry||{})[e])for(var n=n.slice(),r=0;r<n.length;r++)n[r](t,this)},r.once=function(e,t){var n=this;t&&this.addEventListener(e,function r(){n.removeEventListener(e,r),t.apply(null,arguments)})},r.setDefaultHandler=function(e,t){var i,s,n=this._defaultHandlers;(n=n||(this._defaultHandlers={_disabled_:{}}))[e]&&(s=n[e],(i=n._disabled_[e])||(n._disabled_[e]=i=[]),i.push(s),-1!=(s=i.indexOf(t))&&i.splice(s,1)),n[e]=t},r.removeDefaultHandler=function(e,s){var r,n=this._defaultHandlers;n&&(r=n._disabled_[e],n[e]==s?(n[e],r&&this.setDefaultHandler(e,r.pop())):!r||-1!=(s=r.indexOf(s))&&r.splice(s,1))},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return-1==(r=r||(this._eventRegistry[e]=[])).indexOf(t)&&r[n?\"unshift\":\"push\"](t),t},r.off=r.removeListener=r.removeEventListener=function(n,r){this._eventRegistry=this._eventRegistry||{};n=this._eventRegistry[n];!n||-1!==(r=n.indexOf(r))&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),ace.define(\"ace/mouse/fold_handler\",[\"require\",\"exports\",\"module\"],function(e,t,n){t.FoldHandler=function(e){e.on(\"click\",function(t){var i=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(i.row,i.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on(\"gutterclick\",function(t){var r,i;\"foldWidgets\"==e.renderer.$gutterLayer.getRegion(t)&&(r=t.getDocumentPosition().row,(i=e.session).foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop())}),e.on(\"gutterdblclick\",function(t){var i,o,u;\"foldWidgets\"==e.renderer.$gutterLayer.getRegion(t)&&(u=t.getDocumentPosition().row,(o=(o=(i=e.session).getParentFoldRangeData(u,!0)).range||o.firstRange)&&(u=o.start.row,(u=i.getFoldAt(u,i.getLine(u).length,1))?i.removeFold(u):(i.addFold(\"...\",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))),t.stop())})}}),ace.define(\"ace/keyboard/keybinding\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/event\"],function(s,t,n){var r=s(\"../lib/keys\"),i=s(\"../lib/event\"),s=function(e){this.$editor=e,this.$data={},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0),this.$data={editor:this.$editor}},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]!=e){for(;t[t.length-1]&&t[t.length-1]!=this.$defaultHandler;)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)}},this.addKeyboardHandler=function(e,t){var n;e&&(\"function\"!=typeof e||e.handleKeyboard||(e.handleKeyboard=e),-1!=(n=this.$handlers.indexOf(e))&&this.$handlers.splice(n,1),null==t?this.$handlers.push(e):this.$handlers.splice(t,0,e),-1==n&&e.attach&&e.attach(this.$editor))},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return-1!=t&&(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.$callKeyboardHandlers=function(e,t,n,r){for(var s,o=!1,u=this.$editor.commands,a=this.$handlers.length;a--&&!((s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r))&&s.command&&((o=\"null\"==s.command||u.exec(s.command,this.$editor,s.args,r))&&r&&-1!=e&&1!=s.passEvent&&1!=s.command.passEvent&&i.stopEvent(r),o)););return o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)||this.$editor.commands.exec(\"insertstring\",this.$editor,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"],function(e,t,n){function p(e,t){this.$breakpoints=[],this.$decorations=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$undoSelect=!0,this.$foldData=[],this.$foldData.toString=function(){return this.join(\"\\n\")},this.on(\"changeFold\",this.onChangeFold.bind(this)),this.$onChange=this.onChange.bind(this),\"object\"==typeof e&&e.getLine||(e=new l(e)),this.setDocument(e),this.selection=new u(this),s.resetOptions(this),this.setMode(t),s._signal(\"session\",this)}var r=e(\"./lib/oop\"),i=e(\"./lib/lang\"),s=e(\"./config\"),o=e(\"./lib/event_emitter\").EventEmitter,u=e(\"./selection\").Selection,a=e(\"./mode/text\").Mode,f=e(\"./range\").Range,l=e(\"./document\").Document,c=e(\"./background_tokenizer\").BackgroundTokenizer,h=e(\"./search_highlight\").SearchHighlight;(function(){function g(e){return!(e<4352)&&(4352<=e&&e<=4447||4515<=e&&e<=4519||4602<=e&&e<=4607||9001<=e&&e<=9002||11904<=e&&e<=11929||11931<=e&&e<=12019||12032<=e&&e<=12245||12272<=e&&e<=12283||12288<=e&&e<=12350||12353<=e&&e<=12438||12441<=e&&e<=12543||12549<=e&&e<=12589||12593<=e&&e<=12686||12688<=e&&e<=12730||12736<=e&&e<=12771||12784<=e&&e<=12830||12832<=e&&e<=12871||12880<=e&&e<=13054||13056<=e&&e<=19903||19968<=e&&e<=42124||42128<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||55216<=e&&e<=55238||55243<=e&&e<=55291||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65106||65108<=e&&e<=65126||65128<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510)}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener(\"change\",this.$onChange),(this.doc=e).on(\"change\",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(n){if(!n)return this.$docRowCache=[],void(this.$screenRowCache=[]);var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,n)+1;n<t&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){for(var n=0,r=e.length-1;n<=r;){var i=n+r>>1,s=e[i];if(s<t)n=1+i;else{if(!(t<s))return i;r=i-1}}return n-1},this.resetCaches=function(){this.$modified=!0,this.$wrapData=[],this.$rowLengthCache=[],this.$resetRowCache(0),this.bgTokenizer&&this.bgTokenizer.start(0)},this.onChangeFold=function(t){t=t.data;this.$resetRowCache(t.start.row)},this.onChange=function(e){var t=e.data;this.$modified=!0,this.$resetRowCache(t.range.start.row);var n=this.$updateInternalDataOnChange(e);this.$fromUndo||!this.$undoManager||t.ignore||(this.$deltasDoc.push(t),n&&0!=n.length&&this.$deltasFold.push({action:\"removeFolds\",folds:n}),this.$informUndoManager.schedule()),this.bgTokenizer.$updateOnChange(t),this._signal(\"change\",e)},this.setValue=function(e){this.doc.setValue(e),this.selection.moveTo(0,0),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.setUndoManager(this.$undoManager),this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(e){return this.bgTokenizer.getState(e)},this.getTokens=function(e){return this.bgTokenizer.getTokens(e)},this.getTokenAt=function(r,t){var n=this.bgTokenizer.getTokens(r),i=0;if(null==t)s=n.length-1,i=this.getLine(r).length;else for(var s=0;s<n.length&&!(t<=(i+=n[s].value.length));s++);return(r=n[s])?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){var t;this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel(),e&&((t=this).$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:\"fold\",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:\"doc\",deltas:t.$deltasDoc}),t.$deltasDoc=[]),0<t.$deltas.length&&e.execute({action:\"aceupdate\",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager))},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(\" \",this.getTabSize()):\"\\t\"},this.setUseSoftTabs=function(e){this.setOption(\"useSoftTabs\",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption(\"tabSize\",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption(\"overwrite\",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=\"\"),this.$decorations[e]+=\" \"+t,this._signal(\"changeBreakpoint\",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||\"\").replace(\" \"+t,\"\"),this._signal(\"changeBreakpoint\",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t<e.length;t++)this.$breakpoints[e[t]]=\"ace_breakpoint\";this._signal(\"changeBreakpoint\",{})},this.clearBreakpoints=function(){this.$breakpoints=[],this._signal(\"changeBreakpoint\",{})},this.setBreakpoint=function(e,t){(t=void 0===t?\"ace_breakpoint\":t)?this.$breakpoints[e]=t:delete this.$breakpoints[e],this._signal(\"changeBreakpoint\",{})},this.clearBreakpoint=function(e){delete this.$breakpoints[e],this._signal(\"changeBreakpoint\",{})},this.addMarker=function(e,s,n,r){var i=this.$markerId++,s={range:e,type:n||\"line\",renderer:\"function\"==typeof n?n:null,clazz:s,inFront:!!r,id:i};return r?(this.$frontMarkers[i]=s,this._signal(\"changeFrontMarker\")):(this.$backMarkers[i]=s,this._signal(\"changeBackMarker\")),i},this.addDynamicMarker=function(e,t){if(e.update){var n=this.$markerId++;return e.id=n,e.inFront=!!t,t?(this.$frontMarkers[n]=e,this._signal(\"changeFrontMarker\")):(this.$backMarkers[n]=e,this._signal(\"changeBackMarker\")),e}},this.removeMarker=function(e){var n,t=this.$frontMarkers[e]||this.$backMarkers[e];t&&(n=t.inFront?this.$frontMarkers:this.$backMarkers,t&&(delete n[e],this._signal(t.inFront?\"changeFrontMarker\":\"changeBackMarker\")))},this.getMarkers=function(e){return e?this.$frontMarkers:this.$backMarkers},this.highlight=function(e){var t;this.$searchHighlight||(t=new h(null,\"ace_selected-word\",\"text\"),this.$searchHighlight=this.addDynamicMarker(t)),this.$searchHighlight.setRegexp(e)},this.highlightLines=function(e,i,n,r){\"number\"!=typeof i&&(n=i,i=e),n=n||\"ace_step\";i=new f(e,0,i,1/0);return i.id=this.addMarker(i,n,\"fullLine\",r),i},this.setAnnotations=function(e){this.$annotations=e,this._signal(\"changeAnnotation\",{})},this.getAnnotations=function(){return this.$annotations||[]},this.clearAnnotations=function(){this.setAnnotations([])},this.$detectNewLine=function(t){t=t.match(/^.*?(\\r?\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\"},this.getWordRange=function(e,t){var i,n=this.getLine(e),r=!1;i=(r=(r=0<t?!!n.charAt(t-1).match(this.tokenRe):r)||!!n.charAt(t).match(this.tokenRe))?this.tokenRe:/^\\s+$/.test(n.slice(t-1,t+1))?/\\s/:this.nonTokenRe;var s=t;if(0<s){for(;0<=--s&&n.charAt(s).match(i););s++}for(var o=t;o<n.length&&n.charAt(o).match(i);)o++;return new f(e,s,e,o)},this.getAWordRange=function(e,t){for(var n=this.getWordRange(e,t),r=this.getLine(n.end.row);r.charAt(n.end.column).match(/[ \\t]/);)n.end.column+=1;return n},this.setNewLineMode=function(e){this.doc.setNewLineMode(e)},this.getNewLineMode=function(){return this.doc.getNewLineMode()},this.setUseWorker=function(e){this.setOption(\"useWorker\",e)},this.getUseWorker=function(){return this.$useWorker},this.onReloadTokenizer=function(e){var t=e.data;this.bgTokenizer.start(t.first),this._signal(\"tokenizerUpdate\",e)},this.$modes={},this.$mode=null,this.$modeId=null,this.setMode=function(e,t){if(e&&\"object\"==typeof e){if(e.getTokenizer)return this.$onChangeMode(e);var n=e,r=n.path}else r=e||\"ace/mode/text\";if(this.$modes[\"ace/mode/text\"]||(this.$modes[\"ace/mode/text\"]=new a),this.$modes[r]&&!n)return this.$onChangeMode(this.$modes[r]),void(t&&t());this.$modeId=r,s.loadModule([\"mode\",r],function(e){return this.$modeId!==r?t&&t():this.$modes[r]&&!n?this.$onChangeMode(this.$modes[r]):void(e&&e.Mode&&(e=new e.Mode(n),n||((this.$modes[r]=e).$id=r),this.$onChangeMode(e),t&&t()))}.bind(this)),this.$mode||this.$onChangeMode(this.$modes[\"ace/mode/text\"],!0)},this.$onChangeMode=function(e,t){var n,r,i;t||(this.$modeId=e.$id),this.$mode!==e&&(this.$mode=e,this.$stopWorker(),this.$useWorker&&this.$startWorker(),void 0!==(n=e.getTokenizer()).addEventListener&&(r=this.onReloadTokenizer.bind(this),n.addEventListener(\"update\",r)),this.bgTokenizer?this.bgTokenizer.setTokenizer(n):(this.bgTokenizer=new c(n),(i=this).bgTokenizer.addEventListener(\"update\",function(e){i._signal(\"tokenizerUpdate\",e)})),this.bgTokenizer.setDocument(this.getDocument()),this.tokenRe=e.tokenRe,this.nonTokenRe=e.nonTokenRe,t||(this.$options.wrapMethod.set.call(this,this.$wrapMethod),this.$setFolding(e.foldingRules),this.bgTokenizer.start(0),this._emit(\"changeMode\")))},this.$stopWorker=function(){this.$worker&&this.$worker.terminate(),this.$worker=null},this.$startWorker=function(){if(\"undefined\"==typeof Worker||e.noWorker)this.$worker=null;else try{this.$worker=this.$mode.createWorker(this)}catch(t){console.log(\"Could not load worker\"),console.log(t),this.$worker=null}},this.getMode=function(){return this.$mode},this.$scrollTop=0,this.setScrollTop=function(e){this.$scrollTop===e||isNaN(e)||(this.$scrollTop=e,this._signal(\"changeScrollTop\",e))},this.getScrollTop=function(){return this.$scrollTop},this.$scrollLeft=0,this.setScrollLeft=function(e){this.$scrollLeft===e||isNaN(e)||(this.$scrollLeft=e,this._signal(\"changeScrollLeft\",e))},this.getScrollLeft=function(){return this.$scrollLeft},this.getScreenWidth=function(){return this.$computeWidth(),this.lineWidgets?Math.max(this.getLineWidgetMaxWidth(),this.screenWidth):this.screenWidth},this.getLineWidgetMaxWidth=function(){if(null!=this.lineWidgetsWidth)return this.lineWidgetsWidth;var e=0;return this.lineWidgets.forEach(function(t){t&&t.screenWidth>e&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){if(this.$modified=!1,this.$useWrapMode)return this.screenWidth=this.$wrapLimit;for(var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:1/0,u=t.length,a=0;a<u;a++){if(o<a){if(u<=(a=s.end.row+1))break;o=(s=this.$foldData[i++])?s.start.row:1/0}null==n[a]&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.undoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var n=null,r=e.length-1;-1!=r;r--){var i=e[r];\"doc\"==i.group?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n}},this.redoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var n=null,r=0;r<e.length;r++){var i=e[r];\"doc\"==i.group&&(this.doc.applyDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!1,n))}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n}},this.setUndoSelect=function(e){this.$undoSelect=e},this.$getUndoSelection=function(e,t,n){function r(n){n=\"insertText\"===n.action||\"insertLines\"===n.action;return t?!n:n}for(var s,o,l,i=e[0],a=(r(i)?s=f.fromPoints(i.range.start,i.range.end):s=f.fromPoints(i.range.start,i.range.start),1);a<e.length;a++)r(i=e[a])?(o=i.range.start,-1==s.compare(o.row,o.column)&&s.setStart(i.range.start),o=i.range.end,1==s.compare(o.row,o.column)&&s.setEnd(i.range.end)):(o=i.range.start,-1==s.compare(o.row,o.column)&&(s=f.fromPoints(i.range.start,i.range.start)));return null!=n&&(0===f.comparePoints(n.start,s.start)&&(n.start.column+=s.end.column-s.start.column,n.end.column+=s.end.column-s.start.column),1==(l=n.compareRange(s))?s.setStart(n.start):-1==l&&s.setEnd(n.end)),s},this.replace=function(e,t){return this.doc.replace(e,t)},this.moveText=function(l,s,n){var a,o,u,r=this.getTextRange(l),i=this.getFoldsInRange(l),s=f.fromPoints(s,s);return n||(this.remove(l),o=l.start.row-l.end.row,(u=o?-l.end.column:l.start.column-l.end.column)&&(s.start.row==l.end.row&&s.start.column>l.end.column&&(s.start.column+=u),s.end.row==l.end.row&&s.end.column>l.end.column&&(s.end.column+=u)),o&&s.start.row>=l.end.row&&(s.start.row+=o,s.end.row+=o)),s.end=this.insert(s.start,r),i.length&&(a=l.start,l=s.start,o=l.row-a.row,u=l.column-a.column,this.addFolds(i.map(function(e){return(e=e.clone()).start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))),s},this.indentRows=function(e,t,n){n=n.replace(/\\t/g,this.getTabString());for(var r=e;r<=t;r++)this.insert({row:r,column:0},n)},this.outdentRows=function(e){for(var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize(),i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o<r&&\" \"==s.charAt(o);++o);o<r&&\"\\t\"==s.charAt(o)?(n.start.column=o,n.end.column=o+1):(n.start.column=0,n.end.column=o),this.remove(n)}},this.$moveLines=function(e,u,n){if(e=this.getRowFoldStart(e),u=this.getRowFoldEnd(u),n<0){if((o=this.getRowFoldStart(e+n))<0)return 0;var i=o-e}else if(0<n){if((o=this.getRowFoldEnd(u+n))>this.doc.getLength()-1)return 0;i=o-u}else{e=this.$clipRowToDocument(e);i=(u=this.$clipRowToDocument(u))-e+1}var o=new f(e,0,u,Number.MAX_VALUE),o=this.getFoldsInRange(o).map(function(e){return(e=e.clone()).start.row+=i,e.end.row+=i,e}),u=0==n?this.doc.getLines(e,u):this.doc.removeLines(e,u);return this.doc.insertLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){var n;return t=Math.max(0,t),t=e<0?e=0:(n=this.doc.getLength())<=e?this.doc.getLine(e=n-1).length:Math.min(this.doc.getLine(e).length,t),{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(t){t!=this.$useWrapMode&&(this.$useWrapMode=t,this.$modified=!0,this.$resetRowCache(0),t&&(t=this.getLength(),this.$wrapData=Array(t),this.$updateWrapData(0,t-1)),this._signal(\"changeWrapMode\"))},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){this.$wrapLimitRange.min===e&&this.$wrapLimitRange.max===t||(this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this._signal(\"changeWrapMode\"))},this.adjustWrapLimit=function(e,t){var r=this.$wrapLimitRange;r.max<0&&(r={min:t,max:t});r=this.$constrainWrapLimit(e,r.min,r.max);return r!=this.$wrapLimit&&1<r&&(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal(\"changeWrapLimit\")),!0)},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),e=n?Math.min(n,e):e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,r=e.data.action,i=e.data.range.start.row,s=e.data.range.end.row,o=e.data.range.start,u=e.data.range.end,a=null;if(n=-1!=r.indexOf(\"Lines\")?(s=\"insertLines\"==r?i+e.data.lines.length:i,e.data.lines?e.data.lines.length:s-i):s-i,this.$updating=!0,0!=n)if(-1!=r.indexOf(\"remove\")){this[t?\"$wrapData\":\"$rowLengthCache\"].splice(i,n);var f=this.$foldData,a=this.getFoldsInRange(e.data.range);this.removeFolds(a);var c=0;for((l=this.getFoldLine(u.row))&&(l.addRemoveChars(u.row,u.column,o.column-u.column),l.shiftRow(-n),(d=this.getFoldLine(i))&&d!==l&&(d.merge(l),l=d),c=f.indexOf(l)+1);c<f.length;c++)(l=f[c]).start.row>=u.row&&l.shiftRow(-n);s=i}else{var v=Array(n);v.unshift(i,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,v);f=this.$foldData,c=0;for((l=this.getFoldLine(i))&&(0==(v=l.range.compareInside(o.row,o.column))?((l=l.split(o.row,o.column)).shiftRow(n),l.addRemoveChars(s,0,u.column-o.column)):-1==v&&(l.addRemoveChars(i,0,u.column-o.column),l.shiftRow(n)),c=f.indexOf(l)+1);c<f.length;c++)(l=f[c]).start.row>=i&&l.shiftRow(n)}else{var l,n=Math.abs(e.data.range.start.column-e.data.range.end.column);-1!=r.indexOf(\"remove\")&&(a=this.getFoldsInRange(e.data.range),this.removeFolds(a),n=-n),(l=this.getFoldLine(i))&&l.addRemoveChars(i,o.column,n)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error(\"doc.getLength() and $wrapData.length have to be the same!\"),this.$updating=!1,t?this.$updateWrapData(i,s):this.$updateRowLengthCache(i,s),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var o,a,n=this.doc.getAllLines(),r=this.getTabSize(),i=this.$wrapData,s=this.$wrapLimit,f=e;for(t=Math.min(t,n.length-1);f<=t;)(a=this.getFoldLine(f,a))?(o=[],a.walk(function(e,t,r,i){var s;if(null!=e){(s=this.$getDisplayTokens(e,o.length))[0]=u;for(var a=1;a<s.length;a++)s[a]=l}else s=this.$getDisplayTokens(n[t].substring(i,r),o.length);o=o.concat(s)}.bind(this),a.end.row,n[a.end.row].length+1),i[a.start.row]=this.$computeWrapSplits(o,s,r),f=a.end.row+1):(o=this.$getDisplayTokens(n[f]),i[f]=this.$computeWrapSplits(o,s,r),f++)};var u=3,l=4;this.$computeWrapSplits=function(e,t){function a(t){var r=e.slice(i,t),o=r.length;r.join(\"\").replace(/12/g,function(){--o}).replace(/2/g,function(){--o}),s+=o,n.push(s),i=t}if(0==e.length)return[];for(var n=[],r=e.length,i=0,s=0,o=this.$wrapAsCode;t<r-i;){var f=i+t;if(10<=e[f-1]&&10<=e[f])a(f);else if(e[f]!=u&&e[f]!=l){for(var c=Math.max(f-(o?10:t-(t>>2)),i-1);c<f&&e[f]<u;)f--;if(o){for(;c<f&&e[f]<u;)f--;for(;c<f&&9==e[f];)f--}else for(;c<f&&e[f]<10;)f--;a(c<f?++f:f=i+t)}else{for(;f!=i-1&&e[f]!=u;f--);if(i<f)a(f);else{for(f=i+t;f<e.length&&e[f]==l;f++);if(f==e.length)break;a(f)}}}return n},this.$getDisplayTokens=function(e,r){var s,i=[];r=r||0;for(var o=0;o<e.length;o++){var u=e.charCodeAt(o);if(9==u){s=this.getScreenTabSize(i.length+r),i.push(11);for(var a=1;a<s;a++)i.push(12)}else 32==u?i.push(10):39<u&&u<48||57<u&&u<64?i.push(9):4352<=u&&g(u)?i.push(1,2):i.push(1)}return i},this.$getStringScreenWidth=function(e,t,n){if(0==t)return[0,0];var r,i;for(null==t&&(t=1/0),n=n||0,i=0;i<e.length&&(9==(r=e.charCodeAt(i))?n+=this.getScreenTabSize(n):4352<=r&&g(r)?n+=2:n+=1,!(t<n));i++);return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){var t=this.lineWidgets&&this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.getRowLineCount=function(e){return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1:1},this.getScreenLastRowColumn=function(t){t=this.screenToDocumentPosition(t,Number.MAX_VALUE);return this.documentToScreenColumn(t.row,t.column)},this.getDocumentLastRowColumn=function(e,n){n=this.documentToScreenRow(e,n);return this.getScreenLastRowColumn(n)},this.getDocumentLastRowColumnPosition=function(e,n){n=this.documentToScreenRow(e,n);return this.screenToDocumentPosition(n,Number.MAX_VALUE/10)},this.getRowSplitData=function(e){return this.$useWrapMode?this.$wrapData[e]:void 0},this.getScreenTabSize=function(e){return this.$tabSize-e%this.$tabSize},this.screenToDocumentRow=function(e,t){return this.screenToDocumentPosition(e,t).row},this.screenToDocumentColumn=function(e,t){return this.screenToDocumentPosition(e,t).column},this.screenToDocumentPosition=function(e,t){if(e<0)return{row:0,column:0};var n,c,r=0,i=0,o=0,u=0,v=this.$screenRowCache,f=this.$getRowCacheIndex(v,e),m=v.length;c=m&&0<=f?(o=v[f],r=this.$docRowCache[f],e>v[m-1]):!m;for(var s,h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:1/0;o<=e&&!(e<o+(u=this.getRowLength(r))||h<=r);)o+=u,d<++r&&(r=p.end.row+1,d=(p=this.getNextFoldLine(r,p))?p.start.row:1/0),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o));if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||h<r)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}return!this.$useWrapMode||(v=this.$wrapData[r])&&(s=v[m=Math.floor(e-o)],0<m&&v.length&&(i=v[m-1]||v[v.length-1],n=n.substring(i))),i+=this.$getStringScreenWidth(n,t)[1],this.$useWrapMode&&s<=i&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){var f=void 0===t?this.$clipPositionToDocument(e.row,e.column):this.$clipPositionToDocument(e,t);e=f.row,t=f.column;var r=0,i=null,l=null;(l=this.getFoldAt(e,t,1))&&(e=l.start.row,t=l.start.column);var o,c,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;c=l&&0<=f?(u=a[f],r=this.$screenRowCache[f],e>a[l-1]):!l;for(var h=this.getNextFoldLine(u),p=h?h.start.row:1/0;u<e;){if(p<=u){if(e<(o=h.end.row+1))break;p=(h=this.getNextFoldLine(o,h))?h.start.row:1/0}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d=\"\",i=h&&p<=u?(d=this.getFoldDisplayLine(h,e,t),h.start.row):(d=this.getLine(e).substring(0,t),e);if(this.$useWrapMode){var v=this.$wrapData[i];if(v){for(var m=0;d.length>=v[m];)r++,m++;d=d.substring(v[m-1]||0,d.length)}}return{row:r,column:this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(this.$useWrapMode)for(var i=this.$wrapData.length,s=0,r=0,o=(t=this.$foldData[r++])?t.start.row:1/0;s<i;){var u=this.$wrapData[s];e+=u?u.length+1:1,o<++s&&(s=t.end.row+1,o=(t=this.$foldData[r++])?t.start.row:1/0)}else for(var e=this.getLength(),n=this.$foldData,r=0;r<n.length;r++)e-=(t=n[r]).end.row-t.start.row;return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){}}).call(p.prototype),e(\"./edit_session/folding\").Folding.call(p.prototype),e(\"./edit_session/bracket_match\").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,\"session\",{wrap:{set:function(e){var t;e&&\"off\"!=e?\"free\"==e?e=!0:\"printMargin\"==e?e=-1:\"string\"==typeof e&&(e=parseInt(e,10)||!1):e=!1,this.$wrap!=e&&(e?(this.setWrapLimitRange(t=\"number\"==typeof e?e:null,t),this.setUseWrapMode(!0)):this.setUseWrapMode(!1),this.$wrap=e)},get:function(){return this.getUseWrapMode()?-1==this.$wrap?\"printMargin\":this.getWrapLimitRange().min?this.$wrap:\"free\":\"off\"},handlesSet:!0},wrapMethod:{set:function(e){(e=\"auto\"==e?\"text\"!=this.$mode.type:\"text\"!=e)!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:\"auto\"},firstLineNumber:{set:function(){this._signal(\"changeBreakpoint\")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){isNaN(e)||this.$tabSize===e||(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal(\"changeTabSize\"))},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal(\"changeOverwrite\")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),ace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"],function(u,t,n){var r=u(\"./lib/oop\"),i=u(\"./lib/lang\"),s=u(\"./lib/event_emitter\").EventEmitter,o=u(\"./range\").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.lead=this.selectionLead=this.doc.createAnchor(0,0),this.anchor=this.selectionAnchor=this.doc.createAnchor(0,0);var t=this;this.lead.on(\"change\",function(e){t._emit(\"changeCursor\"),t.$isEmpty||t._emit(\"changeSelection\"),t.$keepDesiredColumnOnChange||e.old.column==e.value.column||(t.$desiredColumn=null)}),this.selectionAnchor.on(\"change\",function(){t.$isEmpty||t._emit(\"changeSelection\")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.isEmpty()&&this.getRange().isMultiLine()},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.anchor.setPosition(e,t),this.$isEmpty&&(this.$isEmpty=!1,this._emit(\"changeSelection\"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.shiftSelection=function(e){var t,n,r;this.$isEmpty?this.moveCursorTo(this.lead.row,this.lead.column+e):(t=this.getSelectionAnchor(),n=this.getSelectionLead(),(r=this.isBackwards())&&0===t.column||this.setSelectionAnchor(t.row,t.column+e),!r&&0===n.column||this.$moveSelection(function(){this.moveCursorTo(n.row,n.column+e)}))},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit(\"changeSelection\"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){var n;return void 0===t&&(e=(n=e||this.lead).row,t=n.column),this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var t=this.getCursor(),t=this.session.getAWordRange(t.row,t.column);this.setSelectionRange(t)},this.getLineRange=function(r,t){var n=\"number\"==typeof r?r:this.lead.row,r=this.session.getFoldLine(n),r=r?(n=r.start.row,r.end.row):n;return!0===t?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var n,e=this.lead.getPosition();(n=this.session.getFoldAt(e.row,e.column,-1))?this.moveCursorTo(n.start.row,n.start.column):0==e.column?0<e.row&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length):(n=this.session.getTabSize(),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(\" \").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1))},this.moveCursorRight=function(){var n,e=this.lead.getPosition();(n=this.session.getFoldAt(e.row,e.column,1))?this.moveCursorTo(n.end.row,n.end.column):this.lead.column==this.doc.getLine(this.lead.row).length?this.lead.row<this.doc.getLength()-1&&this.moveCursorTo(this.lead.row+1,0):(n=this.session.getTabSize(),e=this.lead,this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column,e.column+n).split(\" \").length-1==n?this.moveCursorBy(0,n):this.moveCursorBy(0,1))},this.moveCursorLineStart=function(){var s=this.lead.row,t=this.lead.column,r=this.session.documentToScreenRow(s,t),r=this.session.screenToDocumentPosition(r,0),s=this.session.getDisplayLine(s,null,r.row,r.column).match(/^\\s*/);s[0].length==t||this.session.$useEmacsStyleLineStart||(r.column+=s[0].length),this.moveCursorToPosition(r)},this.moveCursorLineEnd=function(){var r=this.lead,t=this.session.getDocumentLastRowColumnPosition(r.row,r.column);this.lead.column==t.column&&(r=this.session.getLine(t.row),t.column!=r.length||0<(r=r.search(/\\s+$/))&&(t.column=r)),this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s)this.moveCursorTo(s.end.row,s.end.column);else{if(this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t)),t>=n.length)return this.moveCursorTo(e,n.length),this.moveCursorRight(),void(e<this.doc.getLength()-1&&this.moveCursorWordRight());this.session.tokenRe.exec(r)&&(t+=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)}},this.moveCursorLongWordLeft=function(){var e=this.lead.row,t=this.lead.column;if(s=this.session.getFoldAt(e,t,-1))this.moveCursorTo(s.start.row,s.start.column);else{var s=this.session.getFoldStringAt(e,t,-1);null==s&&(s=this.doc.getLine(e).substring(0,t));s=i.stringReverse(s);if(this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0,this.session.nonTokenRe.exec(s)&&(t-=this.session.nonTokenRe.lastIndex,s=s.slice(this.session.nonTokenRe.lastIndex),this.session.nonTokenRe.lastIndex=0),t<=0)return this.moveCursorTo(e,0),this.moveCursorLeft(),void(0<e&&this.moveCursorWordLeft());this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)}},this.$shortWordEndIndex=function(e){var r,n=0,i=/\\s/,s=this.session.tokenRe;if(s.lastIndex=0,this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{for(;(r=e[n])&&i.test(r);)n++;if(n<1)for(s.lastIndex=0;(r=e[n])&&!s.test(r);)if(s.lastIndex=0,n++,i.test(r)){if(2<n){n--;break}for(;(r=e[n])&&i.test(r);)n++;if(2<n)break}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,o=this.doc.getLine(e),r=o.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==o.length){for(var s=this.doc.getLength();r=this.doc.getLine(++e),e<s&&/^\\s*$/.test(r););/^\\s+/.test(r)||(r=\"\"),t=0}o=this.$shortWordEndIndex(r);this.moveCursorTo(e,t+o)},this.moveCursorShortWordLeft=function(){var e=this.lead.row,t=this.lead.column;if(o=this.session.getFoldAt(e,t,-1))return this.moveCursorTo(o.start.row,o.start.column);var r=this.session.getLine(e).substring(0,t);if(0==t){for(;r=this.doc.getLine(--e),0<e&&/^\\s*$/.test(r););t=r.length,/\\s+$/.test(r)||(r=\"\")}var o=i.stringReverse(r),o=this.$shortWordEndIndex(o);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var r=this.session.documentToScreenPosition(this.lead.row,this.lead.column);0===t&&(this.$desiredColumn?r.column=this.$desiredColumn:this.$desiredColumn=r.column);r=this.session.screenToDocumentPosition(r.row+e,r.column);0!==e&&0===t&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&r.row++,this.moveCursorTo(r.row,r.column+t,0===t)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,r,n){r=this.session.screenToDocumentPosition(e,r);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e.call(null,this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){var e;return this.rangeCount?e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t}):(e=this.getRange()).isBackwards=this.isBackwards(),e},this.fromJSON=function(e){if(null==e.start){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e.isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(e,t,n){function i(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}}(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(e,t){return 0==this.compare(e,t)},this.compareRange=function(r){var t=r.end,r=r.start,t=this.compare(t.row,t.column);return 1==t?1==(t=this.compare(r.row,r.column))?2:0==t?1:0:-1==t?-2:-1==(t=this.compare(r.row,r.column))?-1:1==t?42:0},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return 0==this.comparePoint(e.start)&&0==this.comparePoint(e.end)},this.intersects=function(t){t=this.compareRange(t);return-1==t||0==t||1==t},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){\"object\"==typeof e?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){\"object\"==typeof e?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return 0==this.compare(e,t)&&(!this.isEnd(e,t)&&!this.isStart(e,t))},this.insideStart=function(e,t){return 0==this.compare(e,t)&&!this.isEnd(e,t)},this.insideEnd=function(e,t){return 0==this.compare(e,t)&&!this.isStart(e,t)},this.compare=function(e,t){return this.isMultiLine()||e!==this.start.row?e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row!==e||t<=this.end.column?0:1:t<this.start.column?-1:t>this.end.column?1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){var n,r;return this.end.row>t?n={row:t+1,column:0}:this.end.row<e&&(n={row:e,column:0}),this.start.row>t?r={row:t+1,column:0}:this.start.row<e&&(r={row:e,column:0}),i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var r,s,n=this.compare(e,t);return 0==n?this:(-1==n?r={row:e,column:t}:s={row:e,column:t},i.fromPoints(r||this.start,s||this.end))},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(n){var t=n.documentToScreenPosition(this.start),n=n.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},i.comparePoints=function(e,t){return e.row-t.row||e.column-t.column},t.Range=i}),ace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"],function(l,t,n){var r=l(\"../tokenizer\").Tokenizer,i=l(\"./text_highlight_rules\").TextHighlightRules,s=l(\"./behaviour\").Behaviour,o=l(\"../unicode\"),u=l(\"../lib/lang\"),a=l(\"../token_iterator\").TokenIterator,f=l(\"../range\").Range,l=function(){this.HighlightRules=i,this.$behaviour=new s};(function(){this.tokenRe=new RegExp(\"^[\"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+\"\\\\$_]+\",\"g\"),this.nonTokenRe=new RegExp(\"^(?:[^\"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+\"\\\\$_]|\\\\s])+\",\"g\"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=new this.HighlightRules,this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart=\"\",this.blockComment=\"\",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=1/0,f=t.getTabSize(),l=!1;if(this.lineCommentStart){c=Array.isArray(this.lineCommentStart)?(p=this.lineCommentStart.map(u.escapeRegExp).join(\"|\"),this.lineCommentStart[0]):(p=u.escapeRegExp(this.lineCommentStart),this.lineCommentStart),p=new RegExp(\"^(\\\\s*)(?:\"+p+\") ?\");var l=t.getUseSoftTabs(),m=function(e,t){var r,s,n=e.match(p);n&&(r=n[1].length,s=n[0].length,b(e,r,s)||\" \"!=n[0][s-1]||s--,i.removeInLine(t,r,s))},y=c+\" \",v=function(e,t){s&&!/\\S/.test(e)||(b(e,a,a)?i.insertInLine({row:t,column:a},y):i.insertInLine({row:t,column:a},c))},g=function(e,t){return p.test(e)},b=function(e,t,n){for(var r=0;t--&&\" \"==e.charAt(t);)r++;if(r%f!=0)return!1;for(r=0;\" \"==e.charAt(n++);)r++;return 2<f?r%f!=f-1:r%f==0}}else{if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp(\"^(\\\\s*)(?:\"+u.escapeRegExp(c)+\")\"),d=new RegExp(\"(?:\"+u.escapeRegExp(h)+\")\\\\s*$\"),v=function(e,t){g(e,t)||s&&!/\\S/.test(e)||(i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c))},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;for(var r=t.getTokens(n),i=0;i<r.length;i++)if(\"comment\"===r[i].type)return!0}}var E=1/0;w(function(e,t){var n=e.search(/\\S/);-1!==n?(n<a&&(a=n),o&&!g(e,t)&&(o=!1)):E>e.length&&(E=e.length)}),a==1/0&&(a=E,o=s=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(i){!i.start&&i[0]&&(i=i[0]);var c,h,o=(s=new a(t,r.row,r.column)).getCurrentToken(),l=(t.selection,t.selection.toOrientedRange());if(o&&/comment/.test(o.type)){for(;o&&/comment/.test(o.type);){if(-1!=(v=o.value.indexOf(i.start))){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v,p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}for(var s,v,o=(s=new a(t,r.row,r.column)).getCurrentToken();o&&/comment/.test(o.type);){if(-1!=(v=o.value.indexOf(i.end))){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v,d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)}},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){for(var t in this.$embeds=[],this.$modes={},e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);for(var n=[\"toggleBlockComment\",\"toggleCommentLines\",\"getNextLineIndent\",\"checkOutdent\",\"autoOutdent\",\"transformAction\",\"getCompletions\"],t=0;t<n.length;t++)!function(e){var r=n[t],i=e[r];e[n[t]]=function(){return this.$delegator(r,arguments,i)}}(this)},this.$delegator=function(e,t,n){var r=t[0];\"string\"!=typeof r&&(r=r[0]);for(var i=0;i<this.$embeds.length;i++)if(this.$modes[this.$embeds[i]]){var o=r.split(this.$embeds[i]);if(!o[0]&&o[1]){t[0]=o[1];o=this.$modes[this.$embeds[i]];return o[e].apply(o,t)}}var u=n.apply(this,t);return n?u:void 0},this.transformAction=function(e,t,n,r,i){if(this.$behaviour){var o,s=this.$behaviour.getBehaviours();for(o in s)if(s[o][t]){var u=s[o][t].apply(this,arguments);if(u)return u}}},this.getKeywords=function(e){if(!this.completionKeywords){var t=this.$tokenizer.rules,n=[];for(r in t)for(var r,i=t[r],s=0,o=i.length;s<o;s++)if(\"string\"==typeof i[s].token)/keyword|support|storage/.test(i[s].token)&&n.push(i[s].regex);else if(\"object\"==typeof i[s].token)for(var u=0,a=i[s].token.length;u<a;u++)/keyword|support|storage/.test(i[s].token[u])&&(r=i[s].regex.match(/\\(.+?\\)/g)[u],n.push(r.substr(1,r.length-2)));this.completionKeywords=n}return e?n.concat(this.$keywordList||[]):this.$keywordList},this.$createKeywordList=function(){return this.$highlightRules||this.getTokenizer(),this.$keywordList=this.$highlightRules.$keywordList||[]},this.getCompletions=function(e,t,n,r){return(this.$keywordList||this.$createKeywordList()).map(function(e){return{name:e,value:e,score:0,meta:\"keyword\"}})},this.$id=\"ace/mode/text\"}).call(l.prototype),t.Mode=l}),ace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\"],function(e,t,n){function i(e){for(var t in this.states=e,this.regExps={},this.matchMappings={},this.states){for(var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:\"text\"},o=\"g\",u=[],a=0;a<n.length;a++){var f=n[a];if(f.defaultToken&&(s.defaultToken=f.defaultToken),f.caseInsensitive&&(o=\"gi\"),null!=f.regex){f.regex instanceof RegExp&&(f.regex=f.regex.toString().slice(1,-1));var l=f.regex,c=new RegExp(\"(?:(\"+l+\")|(.))\").exec(\"a\").length-2;if(Array.isArray(f.token))if(1==f.token.length||1==c)f.token=f.token[0];else{if(c-1!=f.token.length)throw new Error(\"number of classes and regexp groups in '\"+f.token+\"'\\n'\"+f.regex+\"' doesn't match\\n\"+(c-1)+\"!=\"+f.token.length);f.tokenArray=f.token,f.token=null,f.onMatch=this.$arrayTokens}else\"function\"!=typeof f.token||f.onMatch||(f.onMatch=1<c?this.$applyToken:f.token);1<c&&(l=/\\\\\\d/.test(f.regex)?f.regex.replace(/\\\\([0-9]+)/g,function(e,t){return\"\\\\\"+(parseInt(t,10)+i+1)}):(c=1,this.removeCapturingGroups(f.regex)),f.splitRegex||\"string\"==typeof f.token||u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}}u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp(\"(\"+r.join(\")|(\")+\")|($)\",o)}}var r=1e3;(function(){this.$setMaxTokenCount=function(e){r=0|e},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(\"string\"==typeof n)return[{type:n,value:e}];for(var r=[],i=0,s=n.length;i<s;i++)t[i]&&(r[r.length]={type:n[i],value:t[i]});return r},this.$arrayTokens=function(e){if(!e)return[];var t=this.splitRegex.exec(e);if(!t)return\"text\";for(var n=[],r=this.tokenArray,i=0,s=r.length;i<s;i++)t[i+1]&&(n[n.length]={type:r[i],value:t[i+1]});return n},this.removeCapturingGroups=function(e){return e.replace(/\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,function(e,t){return t?\"(?:\":e})},this.createSplitterRegexp=function(e,t){var n,r,i;return-1!=e.indexOf(\"(?=\")&&(n=0,r=!1,i={},e.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g,function(e,t,s,o,u,a){return r?r=\"]\"!=u:u?r=!0:o?(n==i.stack&&(i.end=a+1,i.stack=-1),n--):s&&(n++,1!=s.length&&(i.stack=n,i.start=a)),e}),null!=i.end&&/^\\)*$/.test(e.substr(i.end))&&(e=e.substring(0,i.start)+e.substr(i.end))),new RegExp(e,(t||\"\").replace(\"g\",\"\"))},this.getLineTokens=function(e,t){var n;t&&\"string\"!=typeof t?t=(n=t.slice(0))[0]:n=[];var i=t||\"start\",s=this.states[i];s||(s=this.states[i=\"start\"]);for(var a,o=this.matchMappings[i],u=this.regExps[i],f=[],l=u.lastIndex=0,c={type:null,value:\"\"};a=u.exec(e);){var m,h=o.defaultToken,p=null,d=a[0],v=u.lastIndex;v-d.length>l&&(m=e.substring(l,v-d.length),c.type==h?c.value+=m:(c.type&&f.push(c),c={type:h,value:m}));for(var g=0;g<a.length-2;g++)if(void 0!==a[g+1]){h=(p=s[o[g]]).onMatch?p.onMatch(d,i,n):p.token,p.next&&(i=\"string\"==typeof p.next?p.next:p.next(i,n),(s=this.states[i])||(window.console&&console.error&&console.error(i,\"doesn't exist\"),s=this.states[i=\"start\"]),o=this.matchMappings[i],(u=this.regExps[i]).lastIndex=l=v);break}if(d)if(\"string\"==typeof h)p&&!1===p.merge||c.type!==h?(c.type&&f.push(c),c={type:h,value:d}):c.value+=d;else if(h){c.type&&f.push(c);for(c={type:null,value:\"\"},g=0;g<h.length;g++)f.push(h[g])}if(l==e.length)break;if(l=v,f.length>r){for(;l<e.length;)c.type&&f.push(c),c={value:e.substring(l,l+=2e3),type:\"overflow\"};i=\"start\",n=[];break}}return c.type&&f.push(c),1<n.length&&n[0]!==i&&n.unshift(i),{tokens:f,state:n.length?n:i}}}).call(i.prototype),t.Tokenizer=i}),ace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"],function(i,t,n){var r=i(\"../lib/lang\"),i=function(){this.$rules={start:[{token:\"empty_line\",regex:\"^$\"},{defaultToken:\"text\"}]}};(function(){this.addRules=function(e,t){if(t)for(var n in e){for(var r=e[n],i=0;i<r.length;i++){var s=r[i];s.next&&(\"string\"!=typeof s.next?s.nextState&&0!==s.nextState.indexOf(t)&&(s.nextState=t+s.nextState):0!==s.next.indexOf(t)&&(s.next=t+s.next))}this.$rules[t+n]=r}else for(var n in e)this.$rules[n]=e[n]},this.getRules=function(){return this.$rules},this.embedRules=function(o,t,n,i,s){o=\"function\"==typeof o?(new o).getRules():o;if(i)for(var u=0;u<i.length;u++)i[u]=t+i[u];else for(var a in i=[],o)i.push(t+a);if(this.addRules(o,t),n)for(var f=Array.prototype[s?\"push\":\"unshift\"],u=0;u<i.length;u++)f.apply(this.$rules[i[u]],r.deepCopy(n));this.$embeds||(this.$embeds=[]),this.$embeds.push(t)},this.getEmbeds=function(){return this.$embeds};function e(e,t){return\"start\"==e&&!t.length||t.unshift(this.nextState,e),this.nextState}function t(e,t){return t.shift(),t.shift()||\"start\"}this.normalizeRules=function(){var n=0,r=this.$rules;Object.keys(r).forEach(function i(s){var o=r[s];o.processed=!0;for(var u=0;u<o.length;u++){var a=o[u];!a.regex&&a.start&&(a.regex=a.start,a.next||(a.next=[]),a.next.push({defaultToken:a.token},{token:a.token+\".end\",regex:a.end||a.start,next:\"pop\"}),a.token=a.token+\".start\",a.push=!0);var l,p,d,f=a.next||a.push;if(f&&Array.isArray(f)?((l=a.stateName)||(\"string\"!=typeof(l=a.token)&&(l=l[0]||\"\"),r[l]&&(l+=n++)),r[l]=f,i(a.next=l)):\"pop\"==f&&(a.next=t),a.push&&(a.nextState=a.next||a.push,a.next=e,delete a.push),a.rules)for(var c in a.rules)r[c]?r[c].push&&r[c].push.apply(r[c],a.rules[c]):r[c]=a.rules[c];a.include||\"string\"==typeof a?(d=a.include||a,p=r[d]):Array.isArray(a)&&(p=a),p&&(d=[u,1].concat(p),a.noEscape&&(d=d.filter(function(e){return!e.next})),o.splice.apply(o,d),u--,p=null),a.keywordMap&&(a.token=this.createKeywordMapper(a.keywordMap,a.defaultToken||\"text\",a.caseInsensitive),delete a.defaultToken)}},this)},this.createKeywordMapper=function(e,t,n,r){var i=Object.create(null);return Object.keys(e).forEach(function(t){for(var s=e[t],o=(s=n?s.toLowerCase():s).split(r||\"|\"),u=o.length;u--;)i[o[u]]=t}),Object.getPrototypeOf(i)&&(i.__proto__=null),this.$keywordList=Object.keys(i),e=null,n?function(e){return i[e.toLowerCase()]||t}:function(e){return i[e]||t}},this.getKeywords=function(){return this.$keywords}}).call(i.prototype),t.TextHighlightRules=i}),ace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){this.$behaviours={}}(function(){this.add=function(e,t,n){switch(void 0){case this.$behaviours:this.$behaviours={};case this.$behaviours[e]:this.$behaviours[e]={}}this.$behaviours[e][t]=n},this.addBehaviours=function(e){for(var t in e)for(var n in e[t])this.add(t,n,e[t][n])},this.remove=function(e){this.$behaviours&&this.$behaviours[e]&&delete this.$behaviours[e]},this.inherit=function(e,n){n=(\"function\"==typeof e?new e:e).getBehaviours(n),this.addBehaviours(n)},this.getBehaviours=function(e){if(!e)return this.$behaviours;for(var t={},n=0;n<e.length;n++)this.$behaviours[e[n]]&&(t[e[n]]=this.$behaviours[e[n]]);return t}}).call(r.prototype),t.Behaviour=r}),ace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"],function(e,t,n){t.packages={},function(e){var r,n=/\\w{4}/g;for(r in e)t.packages[r]=e[r].replace(n,\"\\\\u$&\")}({L:\"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",Ll:\"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",Lu:\"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",Lt:\"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",Lm:\"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",Lo:\"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",M:\"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",Mn:\"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",Mc:\"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",Me:\"0488048906DE20DD-20E020E2-20E4A670-A672\",N:\"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",Nd:\"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",Nl:\"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",No:\"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",P:\"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",Pd:\"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",Ps:\"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",Pe:\"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",Pi:\"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",Pf:\"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",Pc:\"005F203F20402054FE33FE34FE4D-FE4FFF3F\",Po:\"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",S:\"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",Sm:\"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",Sc:\"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",Sk:\"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",So:\"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",Z:\"002000A01680180E2000-200A20282029202F205F3000\",Zs:\"002000A01680180E2000-200A202F205F3000\",Zl:\"2028\",Zp:\"2029\",C:\"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",Cc:\"0000-001F007F-009F\",Cf:\"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",Co:\"E000-F8FF\",Cs:\"D800-DFFF\",Cn:\"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"})}),ace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(e,t,r){this.$session=e,this.$row=t,this.$rowTokens=e.getTokens(t),r=e.getTokenAt(t,r),this.$tokenIndex=r?r.index:-1}(function(){this.stepBackward=function(){for(--this.$tokenIndex;this.$tokenIndex<0;){if(--this.$row,this.$row<0)return this.$row=0,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=this.$rowTokens.length-1}return this.$rowTokens[this.$tokenIndex]},this.stepForward=function(){var e;for(this.$tokenIndex+=1;this.$tokenIndex>=this.$rowTokens.length;){if(this.$row+=1,e=e||this.$session.getLength(),this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(void 0!==n)return n;for(n=0;0<t;)n+=e[--t].value.length;return n}}).call(r.prototype),t.TokenIterator=r}),ace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(u,t,n){var r=u(\"./lib/oop\"),i=u(\"./lib/event_emitter\").EventEmitter,s=u(\"./range\").Range,o=u(\"./anchor\").Anchor,u=function(e){this.$lines=[],0===e.length?this.$lines=[\"\"]:Array.isArray(e)?this._insertLines(0,e):this.insert({row:0,column:0},e)};(function(){r.implement(this,i),this.setValue=function(e){var t=this.getLength();this.remove(new s(0,0,t,this.getLine(t-1).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},0===\"aaa\".split(/a/).length?this.$split=function(e){return e.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:this.$split=function(e){return e.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(t){t=t.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=t?t[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(e){this.$newLineMode!==e&&(this.$newLineMode=e,this._signal(\"changeNewLineMode\"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return\"\\r\\n\"==e||\"\\r\"==e||\"\\n\"==e},this.getLine=function(e){return this.$lines[e]||\"\"},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){if(e.start.row==e.end.row)return this.getLine(e.start.row).substring(e.start.column,e.end.column);var t=this.getLines(e.start.row,e.end.row);t[0]=(t[0]||\"\").substring(e.start.column);var n=t.length-1;return e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column)),t.join(this.getNewLineCharacter())},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):e.row<0&&(e.row=0),e},this.insert=function(e,i){if(!i||0===i.length)return e;e=this.$clipPosition(e),this.getLength()<=1&&this.$detectNewLine(i);var n=this.$split(i),r=n.splice(0,1)[0],i=0==n.length?null:n.splice(n.length-1,1)[0];return e=this.insertInLine(e,r),null!==i&&(e=this.insertNewLine(e),e=this._insertLines(e.row,n),e=this.insertInLine(e,i||\"\")),e},this.insertLines=function(e,t){return e>=this.getLength()?this.insert({row:e,column:0},\"\\n\"+t.join(\"\\n\")):this._insertLines(Math.max(e,0),t)},this._insertLines=function(e,t){if(0==t.length)return{row:e,column:0};for(;61440<t.length;){var n=this._insertLines(e,t.slice(0,61440));t=t.slice(61440),e=n.row}var i=[e,0];i.push.apply(i,t),this.$lines.splice.apply(this.$lines,i);i=new s(e,0,e+t.length,0);return this._signal(\"change\",{data:{action:\"insertLines\",range:i,lines:t}}),i.end},this.insertNewLine=function(r){r=this.$clipPosition(r);var n=this.$lines[r.row]||\"\";this.$lines[r.row]=n.substring(0,r.column),this.$lines.splice(r.row+1,0,n.substring(r.column,n.length));n={row:r.row+1,column:0},r={action:\"insertText\",range:s.fromPoints(r,n),text:this.getNewLineCharacter()};return this._signal(\"change\",{data:r}),n},this.insertInLine=function(e,i){if(0==i.length)return e;var r=this.$lines[e.row]||\"\";this.$lines[e.row]=r.substring(0,e.column)+i+r.substring(e.column);r={row:e.row,column:e.column+i.length},i={action:\"insertText\",range:s.fromPoints(e,r),text:i};return this._signal(\"change\",{data:i}),r},this.remove=function(e){if((e=!(e instanceof s)?s.fromPoints(e.start,e.end):e).start=this.$clipPosition(e.start),e.end=this.$clipPosition(e.end),e.isEmpty())return e.start;var r,i,t=e.start.row,n=e.end.row;return e.isMultiLine()?(r=0==e.start.column?t:t+1,i=n-1,0<e.end.column&&this.removeInLine(n,0,e.end.column),r<=i&&this._removeLines(r,i),r!=t&&(this.removeInLine(t,e.start.column,this.getLine(t).length),this.removeNewLine(e.start.row))):this.removeInLine(t,e.start.column,e.end.column),e.start},this.removeInLine=function(e,t,n){if(t!=n){var r=new s(e,t,e,n),u=this.getLine(e),o=u.substring(t,n),u=u.substring(0,t)+u.substring(n,u.length);return this.$lines.splice(e,1,u),this._signal(\"change\",{data:{action:\"removeText\",range:r,text:o}}),r.start}},this.removeLines=function(e,t){return e<0||t>=this.getLength()?this.remove(new s(e,0,t+1,0)):this._removeLines(e,t)},this._removeLines=function(r,t){var i=new s(r,0,t+1,0),r=this.$lines.splice(r,t-r+1),i={action:\"removeLines\",range:i,nl:this.getNewLineCharacter(),lines:r};return this._signal(\"change\",{data:i}),r},this.removeNewLine=function(e){var t=this.getLine(e),n=this.getLine(e+1),o=new s(e,t.length,e+1,0);this.$lines.splice(e,2,t+n);o={action:\"removeText\",range:o,text:this.getNewLineCharacter()};this._signal(\"change\",{data:o})},this.replace=function(e,t){return e instanceof s||(e=s.fromPoints(e.start,e.end)),0==t.length&&e.isEmpty()?e.start:t==this.getTextRange(e)?e.end:(this.remove(e),t?this.insert(e.start,t):e.start)},this.applyDeltas=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);\"insertLines\"==n.action?this.insertLines(r.start.row,n.lines):\"insertText\"==n.action?this.insert(r.start,n.text):\"removeLines\"==n.action?this._removeLines(r.start.row,r.end.row-1):\"removeText\"==n.action&&this.remove(r)}},this.revertDeltas=function(e){for(var t=e.length-1;0<=t;t--){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);\"insertLines\"==n.action?this._removeLines(r.start.row,r.end.row-1):\"insertText\"==n.action?this.remove(r):\"removeLines\"==n.action?this._insertLines(r.start.row,n.lines):\"removeText\"==n.action&&this.insert(r.start,n.text)}},this.indexToPosition=function(e,t){for(var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=t||0,s=n.length;i<s;i++)if((e-=n[i].length+r)<0)return{row:i,column:e+n[i].length+r};return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){for(var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length),o=t||0;o<s;++o)i+=n[o].length+r;return i+e.column}}).call(u.prototype),t.Document=u}),ace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(e,s,n){var r=e(\"./lib/oop\"),i=e(\"./lib/event_emitter\").EventEmitter,s=s.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),void 0===n?this.setPosition(t.row,t.column):this.setPosition(t,n)};!function(){r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(s){var r,i,t=s.data,o=t.range;o.start.row==o.end.row&&o.start.row!=this.row||o.start.row>this.row||o.start.row==this.row&&o.start.column>this.column||(r=this.row,i=this.column,s=o.start,o=o.end,\"insertText\"===t.action?s.row===r&&s.column<=i?s.column===i&&this.$insertRight||(s.row===o.row?i+=o.column-s.column:(i-=s.column,r+=o.row-s.row)):s.row!==o.row&&s.row<r&&(r+=o.row-s.row):\"insertLines\"===t.action?(s.row!==r||0!==i||!this.$insertRight)&&s.row<=r&&(r+=o.row-s.row):\"removeText\"===t.action?s.row===r&&s.column<i?i=o.column>=i?s.column:Math.max(0,i-(o.column-s.column)):s.row!==o.row&&s.row<r?(o.row===r&&(i=Math.max(0,i-o.column)+s.column),r-=o.row-s.row):o.row===r&&(r-=o.row-s.row,i=Math.max(0,i-o.column)+s.column):\"removeLines\"==t.action&&s.row<=r&&(o.row<=r?r-=o.row-s.row:(r=s.row,i=0)),this.setPosition(r,i,!0))},this.setPosition=function(r,i,n){r=n?{row:r,column:i}:this.$clipPositionToDocument(r,i);this.row==r.row&&this.column==r.column||(i={row:this.row,column:this.column},this.row=r.row,this.column=r.column,this._signal(\"change\",{old:i,value:r}))},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}.call(s.prototype)}),ace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(s,t,n){var r=s(\"./lib/oop\"),i=s(\"./lib/event_emitter\").EventEmitter,s=function(e,t){this.running=!1,this.lines=[],this.states=[],this.currentLine=0,this.tokenizer=e;var n=this;this.$worker=function(){if(n.running){for(var e=new Date,t=n.currentLine,r=-1,i=n.doc;n.lines[t];)t++;var s=t,o=i.getLength(),u=0;for(n.running=!1;t<o;){for(n.$tokenizeRow(t),r=t;t++,n.lines[t];);if(++u%5==0&&20<new Date-e)return n.running=setTimeout(n.$worker,20),void(n.currentLine=t)}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){this._signal(\"update\",{data:{first:e,last:t}})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var i=e.range,n=i.start.row,i=i.end.row-n;0==i?this.lines[n]=null:\"removeText\"==e.action||\"removeLines\"==e.action?(this.lines.splice(n,1+i,null),this.states.splice(n,1+i,null)):((i=Array(1+i)).unshift(n,1),this.lines.splice.apply(this.lines,i),this.states.splice.apply(this.states,i)),this.currentLine=Math.min(n,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||\"start\"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),r=this.states[e-1],r=this.tokenizer.getLineTokens(t,r,e);return this.states[e]+\"\"!=r.state+\"\"?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"],function(o,t,n){var r=o(\"./lib/lang\"),s=(o(\"./lib/oop\"),o(\"./range\").Range),o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||\"text\"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){this.regExp+\"\"!=e+\"\"&&(this.regExp=e,this.cache=[])},this.update=function(e,t,n,i){if(this.regExp)for(var o=i.firstRow,u=i.lastRow,a=o;a<=u;a++){var f=this.cache[a];null==f&&(f=(f=(f=r.getMatchOffsets(n.getLine(a),this.regExp)).length>this.MAX_RANGES?f.slice(0,this.MAX_RANGES):f).map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:\"\");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"],function(e,t,n){var r=e(\"../range\").Range,i=e(\"./fold_line\").FoldLine,s=e(\"./fold\").Fold,o=e(\"../token_iterator\").TokenIterator;t.Folding=function(){this.getFoldAt=function(e,t,n){var r=this.getFoldLine(e);if(!r)return null;for(var i=r.folds,s=0;s<i.length;s++){var o=i[s];if(o.range.contains(e,t)&&!(1==n&&o.range.isEnd(e,t)||-1==n&&o.range.isStart(e,t)))return o}},this.getFoldsInRange=function(e){var t=e.start,n=e.end,r=this.$foldData,i=[];t.column+=1,--n.column;for(var s=0;s<r.length;s++)if(2!=(o=r[s].range.compareRange(e))){if(-2==o)break;for(var u=r[s].folds,a=0;a<u.length;a++){var o,f=u[a];if(-2==(o=f.range.compareRange(e)))break;if(2!=o){if(42==o)break;i.push(f)}}}return--t.column,n.column+=1,i},this.getFoldsInRangeList=function(e){var t;return Array.isArray(e)?(t=[],e.forEach(function(e){t=t.concat(this.getFoldsInRange(e))},this)):t=this.getFoldsInRange(e),t},this.getAllFolds=function(){for(var e=[],t=this.$foldData,n=0;n<t.length;n++)for(var r=0;r<t[n].folds.length;r++)e.push(t[n].folds[r]);return e},this.getFoldStringAt=function(e,t,n,r){if(!(r=r||this.getFoldLine(e)))return null;for(var s,i={end:{column:0}},u=0;u<r.folds.length;u++){var o,a=(o=r.folds[u]).range.compareEnd(e,t);if(-1==a){s=this.getLine(o.start.row).substring(i.end.column,o.start.column);break}if(0===a)return null;i=o}return s=s||this.getLine(o.start.row).substring(i.end.column),-1==n?s.substring(0,t-i.end.column):1==n?s.substring(t-i.end.column):s},this.getFoldLine=function(e,t){var n=this.$foldData,r=0;for(-1==(r=t?n.indexOf(t):r)&&(r=0);r<n.length;r++){var i=n[r];if(i.start.row<=e&&i.end.row>=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;for(-1==(r=t?n.indexOf(t):r)&&(r=0);r<n.length;r++){var i=n[r];if(i.end.row>=e)return i}return null},this.getFoldedRowCount=function(e,t){for(var n=this.$foldData,r=t-e+1,i=0;i<n.length;i++){var u=n[i],o=u.end.row,u=u.start.row;if(t<=o){u<t&&(e<=u?r-=t-u:r=0);break}e<=o&&(r-=e<=u?o-u:o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(p,h){var o,n=this.$foldData,r=!1;p instanceof s?o=p:(o=new s(h,p)).collapseChildren=h.collapseChildren,this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u<f||u==f&&a<=l-2){p=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(p&&h==p)return p.addSubFold(o);if(p&&!p.range.isStart(u,a)||h&&!h.range.isEnd(f,l))throw new Error(\"A fold can't intersect already existing fold\"+o.range+p.range);p=this.getFoldsInRange(o.range);0<p.length&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d<n.length;d++){var v=n[d];if(f==v.start.row){v.addFold(o),r=!0;break}if(u==v.end.row){if(v.addFold(o),r=!0,!o.sameRow){var m=n[d+1];if(m&&m.start.row==f){v.merge(m);break}}break}if(f<=v.start.row)break}return r||(v=this.$addFoldLine(new i(this.$foldData,o))),this.$useWrapMode?this.$updateWrapData(v.start.row,v.start.row):this.$updateRowLengthCache(v.start.row,v.start.row),this.$modified=!0,this._emit(\"changeFold\",{data:o,action:\"add\"}),o}throw new Error(\"The range has to be at least 2 characters width\")},this.addFolds=function(e){e.forEach(function(e){this.addFold(e)},this)},this.removeFold=function(e){var o=e.foldLine,n=o.start.row,r=o.end.row,i=this.$foldData,s=o.folds;1==s.length?i.splice(i.indexOf(o),1):o.range.isEnd(e.end.row,e.end.column)?(s.pop(),o.end.row=s[s.length-1].end.row,o.end.column=s[s.length-1].end.column):o.range.isStart(e.start.row,e.start.column)?(s.shift(),o.start.row=s[0].start.row,o.start.column=s[0].start.column):e.sameRow?s.splice(s.indexOf(e),1):((s=(o=o.split(e.start.row,e.start.column)).folds).shift(),o.start.row=s[0].start.row,o.start.column=s[0].start.column),this.$updating||(this.$useWrapMode?this.$updateWrapData(n,r):this.$updateRowLengthCache(n,r)),this.$modified=!0,this._emit(\"changeFold\",{data:e,action:\"remove\"})},this.removeFolds=function(e){for(var t=[],n=0;n<e.length;n++)t.push(e[n]);t.forEach(function(e){this.removeFold(e)},this),this.$modified=!0},this.expandFold=function(e){this.removeFold(e),e.subFolds.forEach(function(t){e.restoreRange(t),this.addFold(t)},this),0<e.collapseChildren&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(i,t){var n;if(null==i?(n=new r(0,0,this.getLength(),0),t=!0):n=\"number\"==typeof i?new r(i,0,i,this.getLine(i).length):\"row\"in i?r.fromPoints(i,i):i,i=this.getFoldsInRangeList(n),t)this.removeFolds(i);else for(var s=i;s.length;)this.expandFolds(s),s=this.getFoldsInRangeList(n);if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,n){n=this.getFoldLine(e,n);return n?n.end.row:e},this.getRowFoldStart=function(e,n){n=this.getFoldLine(e,n);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){null==r&&(r=e.start.row,i=0),null==t&&(t=e.end.row,n=this.getLine(t).length);var s=this.doc,o=\"\";return e.walk(function(e,t,n,u){if(!(t<r)){if(t==r){if(n<i)return;u=Math.max(i,u)}o+=null!=e?e:s.getLine(t).substring(u,n)}},t,n),o},this.getDisplayLine=function(s,t,n,r){var i=this.getFoldLine(s);if(i)return this.getFoldDisplayLine(i,s,t,n,r);s=this.doc.getLine(s);return s.substring(r||0,t||s.length)},this.$cloneFoldData=function(){var e=[];return e=this.$foldData.map(function(n){n=n.folds.map(function(e){return e.clone()});return new i(e,n)})},this.toggleFold=function(e){var i,n=this.selection.getRange();if(n.isEmpty()){var o=n.start;if(u=this.getFoldAt(o.row,o.column))return void this.expandFold(u);(i=this.findMatchingBracket(o))?1==n.comparePoint(i)?n.end=i:(n.start=i,n.start.column++,n.end.column--):(i=this.findMatchingBracket({row:o.row,column:o.column+1}))?(1==n.comparePoint(i)?n.end=i:n.start=i,n.start.column++):n=this.getCommentFoldRange(o.row,o.column)||n}else{o=this.getFoldsInRange(n);if(e&&o.length)return void this.expandFolds(o);1==o.length&&(u=o[0])}if((u=u||this.getFoldAt(n.start.row,n.start.column))&&u.range.toString()==n.toString())this.expandFold(u);else{var u=\"...\";if(!n.isMultiLine()){if((u=this.getTextRange(n)).length<4)return;u=u.trim().substring(0,2)+\"..\"}this.addFold(u,n)}},this.getCommentFoldRange=function(e,t,n){var i=new o(this,e,t),s=i.getCurrentToken();if(s&&/^comment|string/.test(s.type)){var u=new r,a=new RegExp(s.type.replace(/\\..*/,\"\\\\.\"));if(1!=n){for(;(s=i.stepBackward())&&a.test(s.type););i.stepForward()}if(u.start.row=i.getCurrentTokenRow(),u.start.column=i.getCurrentTokenColumn()+2,i=new o(this,e,t),-1!=n){for(;(s=i.stepForward())&&a.test(s.type););s=i.stepBackward()}else s=i.getCurrentToken();return u.end.row=i.getCurrentTokenRow(),u.end.column=i.getCurrentTokenColumn()+s.value.length-2,u}},this.foldAll=function(e,t,n){null==n&&(n=1e5);var r=this.foldWidgets;if(r){t=t||this.getLength();for(var i=e=e||0;i<t;i++)if(null==r[i]&&(r[i]=this.getFoldWidget(i)),\"start\"==r[i]){var s=this.getFoldWidgetRange(i);if(s&&s.isMultiLine()&&s.end.row<=t&&s.start.row>=e){i=s.end.row;try{var o=this.addFold(\"...\",s);o&&(o.collapseChildren=n)}catch(u){}}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle=\"markbegin\",this.setFoldStyle=function(t){if(!this.$foldStyles[t])throw new Error(\"invalid fold style: \"+t+\"[\"+Object.keys(this.$foldStyles).join(\", \")+\"]\");this.$foldStyle!=t&&(\"manual\"==(this.$foldStyle=t)&&this.unfold(),t=this.$foldMode,this.$setFolding(null),this.$setFolding(t))},this.$setFolding=function(e){this.$foldMode!=e&&(this.$foldMode=e,this.removeListener(\"change\",this.$updateFoldWidgets),this._emit(\"changeAnnotation\"),e&&\"manual\"!=this.$foldStyle?(this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.on(\"change\",this.$updateFoldWidgets)):this.foldWidgets=null)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};for(var r=e-1;0<=r;){var s=n[r];if(\"start\"==(s=null==s?n[r]=this.getFoldWidget(r):s)){var o=this.getFoldWidgetRange(r),i=i||o;if(o&&o.end.row>=e)break}r--}return{range:-1!==r&&o,firstRange:i}},this.onFoldWidgetClick=function(e,i){var n={children:(i=i.domEvent).shiftKey,all:i.ctrlKey||i.metaKey,siblings:i.altKey};this.$toggleFoldWidget(e,n)||(i=i.target||i.srcElement)&&/ace_fold-widget/.test(i.className)&&(i.className+=\" ace_invalid\")},this.$toggleFoldWidget=function(e,t){if(this.getFoldWidget){var s=this.getFoldWidget(e),o=this.getLine(e),u=\"end\"===s?-1:1,s=this.getFoldAt(e,-1==u?0:o.length,u);if(s)t.children||t.all?this.removeFold(s):this.expandFold(s);else{var a,f,o=this.getFoldWidgetRange(e,!0);if(!o||o.isMultiLine()||!(s=this.getFoldAt(o.start.row,o.start.column,1))||!o.isEqual(s.range))return t.siblings?((u=this.getParentFoldRangeData(e)).range&&(a=u.range.start.row+1,f=u.range.end.row),this.foldAll(a,f,t.all?1e4:0)):t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,o.end.row,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold(\"...\",o)),o;this.removeFold(s)}}},this.toggleFoldWidget=function(e){var i=this.selection.getCursor().row;i=this.getRowFoldStart(i);var r,n=this.$toggleFoldWidget(i,{});n||(n=(r=this.getParentFoldRangeData(i,!0)).range||r.firstRange)&&(i=n.start.row,(i=this.getFoldAt(i,this.getLine(i).length,1))?this.removeFold(i):this.addFold(\"...\",n))},this.updateFoldWidgets=function(r){var t=r.data,s=t.range,r=s.start.row,s=s.end.row-r;0==s?this.foldWidgets[r]=null:\"removeText\"==t.action||\"removeLines\"==t.action?this.foldWidgets.splice(r,1+s,null):((s=Array(1+s)).unshift(r,1),this.foldWidgets.splice.apply(this.foldWidgets,s))}}}),ace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,t,n){function i(n,t){this.foldData=n,Array.isArray(t)?this.folds=t:t=this.folds=[t];n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e(\"../range\").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.row<this.startRow||e.endRow>this.endRow)throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),0<this.range.compareEnd(e.start.row,e.start.column)?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var s,o,r=0,i=this.folds,a=!0;null==t&&(t=this.end.row,n=this.end.column);for(var f=0;f<i.length;f++){if(-1==(o=(s=i[f]).range.compareStart(t,n)))return void e(null,t,n,r,a);if(!e(null,s.start.row,s.start.column,r,a)&&e(s.placeholder,s.start.row,s.start.column,r)||0==o)return;a=!s.sameRow,r=s.end.column}e(null,t,n,r,a)},this.getNextFoldTo=function(e,t){for(var n,r,i=0;i<this.folds.length;i++){if(-1==(r=(n=this.folds[i]).range.compareEnd(e,t)))return{fold:n,kind:\"after\"};if(0==r)return{fold:n,kind:\"inside\"}}return null},this.addRemoveChars=function(e,t,n){var i,r=this.getNextFoldTo(e,t);if(r)if(i=r.fold,\"inside\"==r.kind&&i.start.column!=t&&i.start.row!=e)window.console&&window.console.log(e,t,i);else if(i.start.row==e){var s,o=(s=this.folds).indexOf(i);for(0==o&&(this.start.column+=n);o<s.length;o++){if((i=s[o]).start.column+=n,!i.sameRow)return;i.end.column+=n}this.end.column+=n}},this.split=function(s,o){var u=this.getNextFoldTo(s,o).fold,a=this.folds,s=this.foldData;if(!u)return null;o=a.indexOf(u),u=a[o-1];this.end.row=u.end.row,this.end.column=u.end.column;a=new i(s,a=a.splice(o,a.length-o));return s.splice(s.indexOf(this)+1,0,a),a},this.merge=function(e){for(var t=e.folds,n=0;n<t.length;n++)this.addFold(t[n]);var r=this.foldData;r.splice(r.indexOf(e),1)},this.toString=function(){var e=[this.range.toString()+\": [\"];return this.folds.forEach(function(t){e.push(\"  \"+t.toString())}),e.push(\"]\"),e.join(\"\\n\")},this.idxToPosition=function(e){for(var n,t=0,r=0;r<this.folds.length;r++){if((e-=(n=this.folds[r]).start.column-t)<0)return{row:n.start.row,column:n.start.column+e};if((e-=n.placeholder.length)<0)return n.start;t=n.end.column}return{row:this.end.row,column:this.end.column+e}}}).call(i.prototype),t.FoldLine=i}),ace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"],function(s,t,n){function u(e,t){e.row-=t.row,0==e.row&&(e.column-=t.column)}function a(e,t){u(e.start,t),u(e.end,t)}function f(e,t){0==e.row&&(e.column+=t.column),e.row+=t.row}s(\"../range\").Range;var i=s(\"../range_list\").RangeList,s=s(\"../lib/oop\"),o=t.Fold=function(e,t){this.foldLine=null,this.placeholder=t,this.range=e,this.start=e.start,this.end=e.end,this.sameRow=e.start.row==e.end.row,this.subFolds=this.ranges=[]};s.inherits(o,i),function(){this.toString=function(){return'\"'+this.placeholder+'\" '+this.range.toString()},this.setFoldLine=function(e){this.foldLine=e,this.subFolds.forEach(function(t){t.setFoldLine(e)})},this.clone=function(){var e=this.range.clone(),t=new o(e,this.placeholder);return this.subFolds.forEach(function(e){t.subFolds.push(e.clone())}),t.collapseChildren=this.collapseChildren,t},this.addSubFold=function(e){if(!this.range.isEqual(e)){if(!this.range.containsRange(e))throw new Error(\"A fold can't intersect already existing fold\"+e.range+this.range);a(e,this.start);for(var t=e.start.row,n=e.start.column,r=0,i=-1;r<this.subFolds.length&&1==(i=this.subFolds[r].range.compare(t,n));r++);var s=this.subFolds[r];if(0==i)return s.addSubFold(e);for(var t=e.range.end.row,n=e.range.end.column,o=r,i=-1;o<this.subFolds.length&&1==(i=this.subFolds[o].range.compare(t,n));o++);this.subFolds[o];if(0==i)throw new Error(\"A fold can't intersect already existing fold\"+e.range+this.range);this.subFolds.splice(r,o-r,e);return e.setFoldLine(this.foldLine),e}},this.restoreRange=function(e){return function(e,t){f(e.start,t),f(e.end,t)}(e,this.start)}}.call(o.prototype)}),ace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(s,t,n){var i=s(\"./range\").Range.comparePoints,s=function(){this.ranges=[]};(function(){this.comparePoints=i,this.pointIndex=function(e,t,n){for(var r=this.ranges,s=n||0;s<r.length;s++){var a=r[s],u=i(e,a.end);if(!(0<u)){a=i(e,a.start);return 0===u?t&&0!==a?-s-2:s:0<a||0===a&&!t?s:-s-1}}return-s-1},this.add=function(e){var r=!e.isEmpty(),n=this.pointIndex(e.start,r),r=this.pointIndex(e.end,r,n=n<0?-n-1:n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){for(var t=[],n=e.length;n--;)t.push.call(t,this.add(e[n]));return t},this.substractPoint=function(t){t=this.pointIndex(t);if(0<=t)return this.ranges.splice(t,1)},this.merge=function(){for(var e=[],t=this.ranges,n=(t=t.sort(function(e,t){return i(e.start,t.start)}))[0],s=1;s<t.length;s++){var r=n,n=t[s],o=i(r.end,n.start);o<0||(0!=o||r.isEmpty()||n.isEmpty())&&(i(r.end,n.end)<0&&(r.end.row=n.end.row,r.end.column=n.end.column),t.splice(s,1),e.push(n),n=r,s--)}return this.ranges=t,e},this.contains=function(e,t){return 0<=this.pointIndex({row:e,column:t})},this.containsPoint=function(e){return 0<=this.pointIndex(e)},this.rangeAtPoint=function(t){t=this.pointIndex(t);if(0<=t)return this.ranges[t]},this.clipRows=function(r,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row<r)return[];var r=this.pointIndex({row:r,column:0}),i=this.pointIndex({row:t,column:0},r=r<0?-r-1:r);i<0&&(i=-i-1);for(var s=[],o=r;o<i;o++)s.push(n[o]);return s},this.removeAll=function(){return this.ranges.splice(0,this.ranges.length)},this.attach=function(e){this.session&&this.detach(),this.session=e,this.onChange=this.$onChange.bind(this),this.session.on(\"change\",this.onChange)},this.detach=function(){this.session&&(this.session.removeListener(\"change\",this.onChange),this.session=null)},this.$onChange=function(e){var r,n,t=e.data.range;\"i\"==e.data.action[0]?(n=t.start,r=t.end):(r=t.start,n=t.end);for(var c,i=n.row,o=r.row-i,u=-n.column+r.column,a=this.ranges,f=0,l=a.length;f<l;f++)if(!((c=a[f]).end.row<i)){if(c.start.row>i)break;c.start.row==i&&c.start.column>=n.column&&(c.start.column!=n.column||!this.$insertRight)&&(c.start.column+=u,c.start.row+=o),c.end.row==i&&c.end.column>=n.column&&(c.end.column==n.column&&this.$insertRight||(c.end.column==n.column&&0<u&&f<l-1&&c.end.column>c.start.column&&c.end.column==a[f+1].start.column&&(c.end.column-=u),c.end.column+=u,c.end.row+=o))}if(0!=o&&f<l)for(;f<l;f++)(c=a[f]).start.row+=o,c.end.row+=o}}).call(s.prototype),t.RangeList=s}),ace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"],function(e,t,n){var r=e(\"../token_iterator\").TokenIterator,i=e(\"../range\").Range;t.BracketMatch=function(){this.findMatchingBracket=function(e,r){if(0==e.column)return null;r=r||this.getLine(e.row).charAt(e.column-1);if(\"\"==r)return null;r=r.match(/([\\(\\[\\{])|([\\)\\]\\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var r,u,t=this.getLine(e.row),n=!0,s=t.charAt(e.column-1),o=s&&s.match(/([\\(\\[\\{])|([\\)\\]\\}])/);if(o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\\(\\[\\{])|([\\)\\]\\}])/),n=!1),!o)return null;if(o[1]){if(!(u=this.$findClosingBracket(o[1],e)))return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{if(!(u=this.$findOpeningBracket(o[2],e)))return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={\")\":\"(\",\"(\":\")\",\"]\":\"[\",\"[\":\"]\",\"{\":\"}\",\"}\":\"{\"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();if(u=u||o.stepForward()){n=n||new RegExp(\"(\\\\.?\"+u.type.replace(\".\",\"\\\\.\").replace(\"rparen\",\".paren\")+\")+\");for(var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;;){for(;0<=a;){var l=f.charAt(a);if(l==i){if(0==--s)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);--a}for(;(u=o.stepBackward())&&!n.test(u.type););if(null==u)break;a=(f=u.value).length-1}return null}},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();if(u=u||o.stepForward()){n=n||new RegExp(\"(\\\\.?\"+u.type.replace(\".\",\"\\\\.\").replace(\"lparen\",\".paren\")+\")+\");for(var a=t.column-o.getCurrentTokenColumn();;){for(var f=u.value,l=f.length;a<l;){var c=f.charAt(a);if(c==i){if(0==--s)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else c==e&&(s+=1);a+=1}for(;(u=o.stepForward())&&!n.test(u.type););if(null==u)break;a=0}return null}}}}),ace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"],function(o,t,n){var r=o(\"./lib/lang\"),i=o(\"./lib/oop\"),s=o(\"./range\").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(t){t=this.$matchIterator(t,this.$options);if(!t)return!1;var n=null;return t.forEach(function(e,t,i){return n=e.start?e:(i=e.offset+(i||0),new s(t,i,t,i+e.length)),!0}),n},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var l,a=u.length,f=i.length-a;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;h<a;h++)if(-1==i[c+h].search(u[h]))continue e;var v=i[c],m=i[c+a-1],v=v.length-v.match(u[0])[0].length,m=m.match(u[a-1])[0].length;l&&l.end.row===c&&l.end.column>v||(o.push(l=new s(c,v,c+a-1,m)),2<a&&(c=c+a-2))}}else for(var g=0;g<i.length;g++)for(var y=r.getMatchOffsets(i[g],u),h=0;h<y.length;h++){var b=y[h];o.push(new s(g,b.offset,g,b.offset+b.length))}if(n){for(var w=n.start.column,E=n.start.column,g=0,h=o.length-1;g<h&&o[g].start.column<w&&o[g].start.row==n.start.row;)g++;for(;g<h&&o[h].end.column>E&&o[h].end.row==n.end.row;)h--;for(o=o.slice(g,h+1),g=0,h=o.length;g<h;g++)o[g].start.row+=n.start.row,o[g].end.row+=n.start.row}return o},this.replace=function(e,t){var n=this.$options,r=this.$assembleRegExp(n);if(n.$isMultiLine)return t;if(r){var i=r.exec(e);if(!i||i[0].length!=e.length)return null;if(t=e.replace(r,t),n.preserveCase){t=t.split(\"\");for(var s=Math.min(e.length,e.length);s--;){var o=e[s];o&&o.toLowerCase()!=o?t[s]=t[s].toUpperCase():t[s]=t[s].toLowerCase()}t=t.join(\"\")}return t}},this.$matchIterator=function(e,t){var n=this.$assembleRegExp(t);if(!n)return!1;var o,a,f,i=this,u=t.backwards;return f=t.$isMultiLine?(a=n.length,function(t,r,i){var u=t.search(n[0]);if(-1!=u){for(var f=1;f<a;f++)if(-1==(t=e.getLine(r+f)).search(n[f]))return;var c=t.match(n[a-1])[0].length,c=new s(r,u,r+a-1,c);return 1==n.offset?(c.start.row--,c.start.column=Number.MAX_VALUE):i&&(c.start.column+=i),!!o(c)||void 0}}):u?function(e,t,i){for(var s=r.getMatchOffsets(e,n),u=s.length-1;0<=u;u--)if(o(s[u],t,i))return!0}:function(e,t,i){for(var s=r.getMatchOffsets(e,n),u=0;u<s.length;u++)if(o(s[u],t,i))return!0},{forEach:function(n){o=n,i.$lineIterator(e,t).forEach(f)}}},this.$assembleRegExp=function(e,t){if(e.needle instanceof RegExp)return e.re=e.needle;var n=e.needle;if(!e.needle)return e.re=!1;e.regExp||(n=r.escapeRegExp(n)),e.wholeWord&&(n=\"\\\\b\"+n+\"\\\\b\");var i=e.caseSensitive?\"g\":\"gi\";if(e.$isMultiLine=!t&&/[\\n\\r]/.test(n),e.$isMultiLine)return e.re=this.$assembleMultilineRegExp(n,i);try{var s=new RegExp(n,i)}catch(o){s=!1}return e.re=s},this.$assembleMultilineRegExp=function(e,t){for(var n=e.replace(/\\r\\n|\\r|\\n/g,\"$\\n^\").split(\"\\n\"),r=[],i=0;i<n.length;i++)try{r.push(new RegExp(n[i],t))}catch(s){return!1}return\"\"==n[0]?(r.shift(),r.offset=1):r.offset=0,r},this.$lineIterator=function(e,t){var n=1==t.backwards,r=0!=t.skipCurrent,i=t.range,s=t.start;(s=s||(i?i[n?\"end\":\"start\"]:e.selection.getRange())).start&&(s=s[r!=n?\"end\":\"start\"]);var o=i?i.start.row:0,u=i?i.end.row:e.getLength()-1;return{forEach:n?function(n){var r=s.row;if(!n(e.getLine(r).substring(0,s.column),r)){for(r--;o<=r;r--)if(n(e.getLine(r),r))return;if(0!=t.wrap)for(r=u,o=s.row;o<=r;r--)if(n(e.getLine(r),r))return}}:function(n){var r=s.row;if(!n(e.getLine(r).substr(s.column),r,s.column)){for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(0!=t.wrap)for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return}}}}}).call(o.prototype),t.Search=o}),ace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"],function(o,t,n){var r=o(\"../lib/oop\"),i=o(\"../keyboard/hash_handler\").HashHandler,s=o(\"../lib/event_emitter\").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler(\"exec\",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(r,t,i){if(!(r=\"string\"==typeof r?this.commands[r]:r))return!1;if(t&&t.$readOnly&&!r.readOnly)return!1;r={editor:t,command:r,args:i},i=this._emit(\"exec\",r);return this._signal(\"afterExec\",r),!1!==i},this.toggleRecording=function(e){if(!this.$inReplay)return e&&e._emit(\"changeStatus\"),this.recording?(this.macro.pop(),this.removeEventListener(\"exec\",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on(\"exec\",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(!this.$inReplay&&this.macro){if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){\"string\"==typeof t?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}}},this.trimMacro=function(e){return e.map(function(e){return\"string\"!=typeof e[0]&&(e[0]=e[0].name),e=!e[1]?e[0]:e})}}.call(o.prototype),t.CommandManager=o}),ace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"],function(e,t,n){function s(e,t){var n,r;this.platform=t||(i.isMac?\"mac\":\"win\"),this.commands={},this.commandKeyBinding={},this.__defineGetter__&&this.__defineSetter__&&\"undefined\"!=typeof console&&console.error?(n=!1,r=function(){n||(n=!0,console.error(\"commmandKeyBinding has too many m's. use commandKeyBinding\"))},this.__defineGetter__(\"commmandKeyBinding\",function(){return r(),this.commandKeyBinding}),this.__defineSetter__(\"commmandKeyBinding\",function(e){return r(),this.commandKeyBinding=e})):this.commmandKeyBinding=this.commandKeyBinding,this.addCommands(e)}var r=e(\"../lib/keys\"),i=e(\"../lib/useragent\");(function(){this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),(this.commands[e.name]=e).bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e){var t=\"string\"==typeof e?e:e.name;e=this.commands[t],delete this.commands[t];var r,n=this.commandKeyBinding;for(r in n)for(var i in n[r])n[r][i]==e&&delete n[r][i]},this.bindKey=function(e,t){var n;e&&(\"function\"!=typeof t?(n=this.commandKeyBinding,e.split(\"|\").forEach(function(i){var r=this.parseKeys(i,t),i=r.hashId;(n[i]||(n[i]={}))[r.key]=t},this)):this.addCommand({exec:t,bindKey:e,name:t.name||e}))},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(n){if(\"string\"==typeof n)return this.bindKey(n,t);\"object\"==typeof(n=\"function\"==typeof n?{exec:n}:n)&&(n.name||(n.name=t),this.addCommand(n))}},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){var n=e.bindKey;n&&(n=\"string\"==typeof n?n:n[this.platform],this.bindKey(n,e))},this.parseKeys=function(e){var t=(e=-1!=e.indexOf(\" \")?e.split(/\\s+/).pop():e).toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(1==t.length&&\"shift\"==t[0])return{key:n.toUpperCase(),hashId:-1}}for(var s=0,o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(null==u)return\"undefined\"!=typeof console&&console.error(\"invalid modifier \"+t[o]+\" in \"+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=this.commandKeyBinding;return r[t]&&r[t][n]},this.handleKeyboard=function(e,t,n,r){return{command:this.findKeyCommand(t,n)}}}).call(s.prototype),t.HashHandler=s}),ace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\"],function(e,t,n){function s(e,t){return{win:e,mac:t}}var r=e(\"../lib/lang\"),i=e(\"../config\");t.commands=[{name:\"showSettingsMenu\",bindKey:s(\"Ctrl-,\",\"Command-,\"),exec:function(e){i.loadModule(\"ace/ext/settings_menu\",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:\"goToNextError\",bindKey:s(\"Alt-E\",\"Ctrl-E\"),exec:function(e){i.loadModule(\"ace/ext/error_marker\",function(t){t.showErrorMarker(e,1)})},scrollIntoView:\"animate\",readOnly:!0},{name:\"goToPreviousError\",bindKey:s(\"Alt-Shift-E\",\"Ctrl-Shift-E\"),exec:function(e){i.loadModule(\"ace/ext/error_marker\",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:\"animate\",readOnly:!0},{name:\"selectall\",bindKey:s(\"Ctrl-A\",\"Command-A\"),exec:function(e){e.selectAll()},readOnly:!0},{name:\"centerselection\",bindKey:s(null,\"Ctrl-L\"),exec:function(e){e.centerSelection()},readOnly:!0},{name:\"gotoline\",bindKey:s(\"Ctrl-L\",\"Command-L\"),exec:function(e){var t=parseInt(prompt(\"Enter line number:\"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:\"fold\",bindKey:s(\"Alt-L|Ctrl-F1\",\"Command-Alt-L|Command-F1\"),exec:function(e){e.session.toggleFold(!1)},scrollIntoView:\"center\",readOnly:!0},{name:\"unfold\",bindKey:s(\"Alt-Shift-L|Ctrl-Shift-F1\",\"Command-Alt-Shift-L|Command-Shift-F1\"),exec:function(e){e.session.toggleFold(!0)},scrollIntoView:\"center\",readOnly:!0},{name:\"toggleFoldWidget\",bindKey:s(\"F2\",\"F2\"),exec:function(e){e.session.toggleFoldWidget()},scrollIntoView:\"center\",readOnly:!0},{name:\"toggleParentFoldWidget\",bindKey:s(\"Alt-F2\",\"Alt-F2\"),exec:function(e){e.session.toggleFoldWidget(!0)},scrollIntoView:\"center\",readOnly:!0},{name:\"foldall\",bindKey:s(\"Ctrl-Alt-0\",\"Ctrl-Command-Option-0\"),exec:function(e){e.session.foldAll()},scrollIntoView:\"center\",readOnly:!0},{name:\"foldOther\",bindKey:s(\"Alt-0\",\"Command-Option-0\"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:\"center\",readOnly:!0},{name:\"unfoldall\",bindKey:s(\"Alt-Shift-0\",\"Command-Option-Shift-0\"),exec:function(e){e.session.unfold()},scrollIntoView:\"center\",readOnly:!0},{name:\"findnext\",bindKey:s(\"Ctrl-K\",\"Command-G\"),exec:function(e){e.findNext()},readOnly:!0},{name:\"findprevious\",bindKey:s(\"Ctrl-Shift-K\",\"Command-Shift-G\"),exec:function(e){e.findPrevious()},readOnly:!0},{name:\"selectOrFindNext\",bindKey:s(\"ALt-K\",\"Ctrl-G\"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:\"selectOrFindPrevious\",bindKey:s(\"Alt-Shift-K\",\"Ctrl-Shift-G\"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:\"find\",bindKey:s(\"Ctrl-F\",\"Command-F\"),exec:function(e){i.loadModule(\"ace/ext/searchbox\",function(t){t.Search(e)})},readOnly:!0},{name:\"overwrite\",bindKey:\"Insert\",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:\"selecttostart\",bindKey:s(\"Ctrl-Shift-Home\",\"Command-Shift-Up\"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"gotostart\",bindKey:s(\"Ctrl-Home\",\"Command-Home|Command-Up\"),exec:function(e){e.navigateFileStart()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"selectup\",bindKey:s(\"Shift-Up\",\"Shift-Up\"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:\"forEach\",readOnly:!0},{name:\"golineup\",bindKey:s(\"Up\",\"Up|Ctrl-P\"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:\"forEach\",readOnly:!0},{name:\"selecttoend\",bindKey:s(\"Ctrl-Shift-End\",\"Command-Shift-Down\"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"gotoend\",bindKey:s(\"Ctrl-End\",\"Command-End|Command-Down\"),exec:function(e){e.navigateFileEnd()},multiSelectAction:\"forEach\",readOnly:!0,scrollIntoView:\"animate\",aceCommandGroup:\"fileJump\"},{name:\"selectdown\",bindKey:s(\"Shift-Down\",\"Shift-Down\"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"golinedown\",bindKey:s(\"Down\",\"Down|Ctrl-N\"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectwordleft\",bindKey:s(\"Ctrl-Shift-Left\",\"Option-Shift-Left\"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotowordleft\",bindKey:s(\"Ctrl-Left\",\"Option-Left\"),exec:function(e){e.navigateWordLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selecttolinestart\",bindKey:s(\"Alt-Shift-Left\",\"Command-Shift-Left\"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotolinestart\",bindKey:s(\"Alt-Left|Home\",\"Command-Left|Home|Ctrl-A\"),exec:function(e){e.navigateLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectleft\",bindKey:s(\"Shift-Left\",\"Shift-Left\"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotoleft\",bindKey:s(\"Left\",\"Left|Ctrl-B\"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectwordright\",bindKey:s(\"Ctrl-Shift-Right\",\"Option-Shift-Right\"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotowordright\",bindKey:s(\"Ctrl-Right\",\"Option-Right\"),exec:function(e){e.navigateWordRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selecttolineend\",bindKey:s(\"Alt-Shift-Right\",\"Command-Shift-Right\"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotolineend\",bindKey:s(\"Alt-Right|End\",\"Command-Right|End|Ctrl-E\"),exec:function(e){e.navigateLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectright\",bindKey:s(\"Shift-Right\",\"Shift-Right\"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"gotoright\",bindKey:s(\"Right\",\"Right|Ctrl-F\"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectpagedown\",bindKey:\"Shift-PageDown\",exec:function(e){e.selectPageDown()},readOnly:!0},{name:\"pagedown\",bindKey:s(null,\"Option-PageDown\"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:\"gotopagedown\",bindKey:s(\"PageDown\",\"PageDown|Ctrl-V\"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:\"selectpageup\",bindKey:\"Shift-PageUp\",exec:function(e){e.selectPageUp()},readOnly:!0},{name:\"pageup\",bindKey:s(null,\"Option-PageUp\"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:\"gotopageup\",bindKey:\"PageUp\",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:\"scrollup\",bindKey:s(\"Ctrl-Up\",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:\"scrolldown\",bindKey:s(\"Ctrl-Down\",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:\"selectlinestart\",bindKey:\"Shift-Home\",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"selectlineend\",bindKey:\"Shift-End\",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\",readOnly:!0},{name:\"togglerecording\",bindKey:s(\"Ctrl-Alt-E\",\"Command-Option-E\"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:\"replaymacro\",bindKey:s(\"Ctrl-Shift-E\",\"Command-Shift-E\"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:\"jumptomatching\",bindKey:s(\"Ctrl-P\",\"Ctrl-Shift-P\"),exec:function(e){e.jumpToMatching()},multiSelectAction:\"forEach\",readOnly:!0},{name:\"selecttomatching\",bindKey:s(\"Ctrl-Shift-P\",null),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:\"forEach\",readOnly:!0},{name:\"cut\",exec:function(e){var t=e.getSelectionRange();e._emit(\"cut\",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:\"cursor\",multiSelectAction:\"forEach\"},{name:\"removeline\",bindKey:s(\"Ctrl-D\",\"Command-D\"),exec:function(e){e.removeLines()},scrollIntoView:\"cursor\",multiSelectAction:\"forEachLine\"},{name:\"duplicateSelection\",bindKey:s(\"Ctrl-Shift-D\",\"Command-Shift-D\"),exec:function(e){e.duplicateSelection()},scrollIntoView:\"cursor\",multiSelectAction:\"forEach\"},{name:\"sortlines\",bindKey:s(\"Ctrl-Alt-S\",\"Command-Alt-S\"),exec:function(e){e.sortLines()},scrollIntoView:\"selection\",multiSelectAction:\"forEachLine\"},{name:\"togglecomment\",bindKey:s(\"Ctrl-/\",\"Command-/\"),exec:function(e){e.toggleCommentLines()},multiSelectAction:\"forEachLine\",scrollIntoView:\"selectionPart\"},{name:\"toggleBlockComment\",bindKey:s(\"Ctrl-Shift-/\",\"Command-Shift-/\"),exec:function(e){e.toggleBlockComment()},multiSelectAction:\"forEach\",scrollIntoView:\"selectionPart\"},{name:\"modifyNumberUp\",bindKey:s(\"Ctrl-Shift-Up\",\"Alt-Shift-Up\"),exec:function(e){e.modifyNumber(1)},multiSelectAction:\"forEach\"},{name:\"modifyNumberDown\",bindKey:s(\"Ctrl-Shift-Down\",\"Alt-Shift-Down\"),exec:function(e){e.modifyNumber(-1)},multiSelectAction:\"forEach\"},{name:\"replace\",bindKey:s(\"Ctrl-H\",\"Command-Option-F\"),exec:function(e){i.loadModule(\"ace/ext/searchbox\",function(t){t.Search(e,!0)})}},{name:\"undo\",bindKey:s(\"Ctrl-Z\",\"Command-Z\"),exec:function(e){e.undo()}},{name:\"redo\",bindKey:s(\"Ctrl-Shift-Z|Ctrl-Y\",\"Command-Shift-Z|Command-Y\"),exec:function(e){e.redo()}},{name:\"copylinesup\",bindKey:s(\"Alt-Shift-Up\",\"Command-Option-Up\"),exec:function(e){e.copyLinesUp()},scrollIntoView:\"cursor\"},{name:\"movelinesup\",bindKey:s(\"Alt-Up\",\"Option-Up\"),exec:function(e){e.moveLinesUp()},scrollIntoView:\"cursor\"},{name:\"copylinesdown\",bindKey:s(\"Alt-Shift-Down\",\"Command-Option-Down\"),exec:function(e){e.copyLinesDown()},scrollIntoView:\"cursor\"},{name:\"movelinesdown\",bindKey:s(\"Alt-Down\",\"Option-Down\"),exec:function(e){e.moveLinesDown()},scrollIntoView:\"cursor\"},{name:\"del\",bindKey:s(\"Delete\",\"Delete|Ctrl-D|Shift-Delete\"),exec:function(e){e.remove(\"right\")},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"backspace\",bindKey:s(\"Shift-Backspace|Backspace\",\"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"),exec:function(e){e.remove(\"left\")},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"cut_or_delete\",bindKey:s(\"Shift-Delete\",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove(\"left\")},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removetolinestart\",bindKey:s(\"Alt-Backspace\",\"Command-Backspace\"),exec:function(e){e.removeToLineStart()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removetolineend\",bindKey:s(\"Alt-Delete\",\"Ctrl-K\"),exec:function(e){e.removeToLineEnd()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removewordleft\",bindKey:s(\"Ctrl-Backspace\",\"Alt-Backspace|Ctrl-Alt-Backspace\"),exec:function(e){e.removeWordLeft()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"removewordright\",bindKey:s(\"Ctrl-Delete\",\"Alt-Delete\"),exec:function(e){e.removeWordRight()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"outdent\",bindKey:s(\"Shift-Tab\",\"Shift-Tab\"),exec:function(e){e.blockOutdent()},multiSelectAction:\"forEach\",scrollIntoView:\"selectionPart\"},{name:\"indent\",bindKey:s(\"Tab\",\"Tab\"),exec:function(e){e.indent()},multiSelectAction:\"forEach\",scrollIntoView:\"selectionPart\"},{name:\"blockoutdent\",bindKey:s(\"Ctrl-[\",\"Ctrl-[\"),exec:function(e){e.blockOutdent()},multiSelectAction:\"forEachLine\",scrollIntoView:\"selectionPart\"},{name:\"blockindent\",bindKey:s(\"Ctrl-]\",\"Ctrl-]\"),exec:function(e){e.blockIndent()},multiSelectAction:\"forEachLine\",scrollIntoView:\"selectionPart\"},{name:\"insertstring\",exec:function(e,t){e.insert(t)},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"inserttext\",exec:function(e,t){e.insert(r.stringRepeat(t.text||\"\",t.times||1))},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"splitline\",bindKey:s(null,\"Ctrl-O\"),exec:function(e){e.splitLine()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"transposeletters\",bindKey:s(\"Ctrl-T\",\"Ctrl-T\"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:\"cursor\"},{name:\"touppercase\",bindKey:s(\"Ctrl-U\",\"Ctrl-U\"),exec:function(e){e.toUpperCase()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"},{name:\"tolowercase\",bindKey:s(\"Ctrl-Shift-U\",\"Ctrl-Shift-U\"),exec:function(e){e.toLowerCase()},multiSelectAction:\"forEach\",scrollIntoView:\"cursor\"}]}),ace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"],function(e,t,n){function r(){this.reset()}(function(){this.execute=function(e){var t=e.args[0];this.$doc=e.args[1],e.merge&&this.hasUndo()&&(this.dirtyCounter--,t=this.$undoStack.pop().concat(t)),this.$undoStack.push(t),this.$redoStack=[],this.dirtyCounter<0&&(this.dirtyCounter=NaN),this.dirtyCounter++},this.undo=function(e){var t=this.$undoStack.pop(),n=null;return t&&(n=this.$doc.undoChanges(t,e),this.$redoStack.push(t),this.dirtyCounter--),n},this.redo=function(e){var t=this.$redoStack.pop(),n=null;return t&&(n=this.$doc.redoChanges(t,e),this.$undoStack.push(t),this.dirtyCounter++),n},this.reset=function(){this.$undoStack=[],this.$redoStack=[],this.dirtyCounter=0},this.hasUndo=function(){return 0<this.$undoStack.length},this.hasRedo=function(){return 0<this.$redoStack.length},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return 0===this.dirtyCounter}}).call(r.prototype),t.UndoManager=r}),ace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"],function(g,t,n){var r=g(\"./lib/oop\"),i=g(\"./lib/dom\"),s=g(\"./config\"),o=g(\"./lib/useragent\"),u=g(\"./layer/gutter\").Gutter,a=g(\"./layer/marker\").Marker,f=g(\"./layer/text\").Text,l=g(\"./layer/cursor\").Cursor,c=g(\"./scrollbar\").HScrollBar,h=g(\"./scrollbar\").VScrollBar,p=g(\"./renderloop\").RenderLoop,d=g(\"./layer/font_metrics\").FontMetrics,v=g(\"./lib/event_emitter\").EventEmitter;i.importCssString('.ace_editor {position: relative;overflow: hidden;font-family: \\'Monaco\\', \\'Menlo\\', \\'Ubuntu Mono\\', \\'Consolas\\', \\'source-code-pro\\', monospace;font-size: 12px;line-height: normal;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: text;min-width: 100%;}.ace_dragging, .ace_dragging * {cursor: move !important;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \\'\\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;}.ace_text-input.ace_composition {background: #f8f8f8;color: #111;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;/* setting pointer-events: auto; on node under the mouse, which changesduring scroll, will break mouse wheel scrolling in Safari */pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0px;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-moz-transition: opacity 0.18s;-webkit-transition: opacity 0.18s;-o-transition: opacity 0.18s;-ms-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;display: block;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block;   }.ace_fold-widget.ace_end {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");}.ace_fold-widget.ace_closed {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}/*** Dark version for fold widgets*/.ace_dark .ace_fold-widget {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");}.ace_dark .ace_fold-widget.ace_end {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget.ace_closed {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-moz-transition: opacity 0.4s ease 0.05s;-webkit-transition: opacity 0.4s ease 0.05s;-o-transition: opacity 0.4s ease 0.05s;-ms-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-moz-transition: opacity 0.05s ease 0.05s;-webkit-transition: opacity 0.05s ease 0.05s;-o-transition: opacity 0.05s ease 0.05s;-ms-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}',\"ace_editor\");g=function(e,r){var n=this;this.container=e||i.createElement(\"div\"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,\"ace_editor\"),this.setTheme(r),this.$gutter=i.createElement(\"div\"),this.$gutter.className=\"ace_gutter\",this.container.appendChild(this.$gutter),this.scroller=i.createElement(\"div\"),this.scroller.className=\"ace_scroller\",this.container.appendChild(this.scroller),this.content=i.createElement(\"div\"),this.content.className=\"ace_content\",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on(\"changeGutterWidth\",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener(\"scroll\",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener(\"scroll\",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container,500),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener(\"changeCharacterSize\",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal(\"changeCharacterSize\",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit(\"renderer\",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle(\"ace_nobold\",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off(\"changeNewLineMode\",this.onChangeNewLineMode),(this.session=e)&&(this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on(\"changeNewLineMode\",this.onChangeNewLineMode))},this.updateLines=function(e,t){void 0===t&&(t=1/0),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRow<t&&(this.$changedLines.lastRow=t)):this.$changedLines={firstRow:e,lastRow:t},this.$changedLines.firstRow>this.layerConfig.lastRow||this.$changedLines.lastRow<this.layerConfig.firstRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,s,n,r){if(!(2<this.resizing)){0<this.resizing?this.resizing++:this.resizing=e?1:0;var i=this.container;r=r||(i.clientHeight||i.scrollHeight),n=n||(i.clientWidth||i.scrollWidth);s=this.$updateCachedSize(e,s,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0)}},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};return r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+\"px\",i|=this.CHANGE_SCROLL),n&&(e||s.width!=n)&&(i|=this.CHANGE_SIZE,s.width=n,null==t&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+\"px\",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+\"px\",this.scroller.style.bottom=this.scrollBarH.getHeight()+\"px\",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)&&(i|=this.CHANGE_FULL)),s.$dirty=!n||!r,i&&this._signal(\"resize\",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()||this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var t=this.$size.scrollerWidth-2*this.$padding,t=Math.floor(t/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption(\"animatedScroll\",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption(\"showInvisibles\",e)},this.getShowInvisibles=function(){return this.getOption(\"showInvisibles\")},this.getDisplayIndentGuides=function(){return this.getOption(\"displayIndentGuides\")},this.setDisplayIndentGuides=function(e){this.setOption(\"displayIndentGuides\",e)},this.setShowPrintMargin=function(e){this.setOption(\"showPrintMargin\",e)},this.getShowPrintMargin=function(){return this.getOption(\"showPrintMargin\")},this.setPrintMarginColumn=function(e){this.setOption(\"printMarginColumn\",e)},this.getPrintMarginColumn=function(){return this.getOption(\"printMarginColumn\")},this.getShowGutter=function(){return this.getOption(\"showGutter\")},this.setShowGutter=function(e){return this.setOption(\"showGutter\",e)},this.getFadeFoldWidgets=function(){return this.getOption(\"fadeFoldWidgets\")},this.setFadeFoldWidgets=function(e){this.setOption(\"fadeFoldWidgets\",e)},this.setHighlightGutterLine=function(e){this.setOption(\"highlightGutterLine\",e)},this.getHighlightGutterLine=function(){return this.getOption(\"highlightGutterLine\")},this.$updateGutterLineHighlight=function(){var n,e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;this.session.getUseWrapMode()&&((n=this.session.selection.getCursor()).column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)),this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+\"px\",this.$gutterLineHighlight.style.height=t+\"px\"},this.$updatePrintMargin=function(){var t;(this.$showPrintMargin||this.$printMarginEl)&&(this.$printMarginEl||((t=i.createElement(\"div\")).className=\"ace_layer ace_print-margin-layer\",this.$printMarginEl=i.createElement(\"div\"),this.$printMarginEl.className=\"ace_print-margin\",t.appendChild(this.$printMarginEl),this.content.insertBefore(t,this.content.firstChild)),(t=this.$printMarginEl.style).left=this.characterWidth*this.$printMarginColumn+this.$padding+\"px\",t.visibility=this.$showPrintMargin?\"visible\":\"hidden\",this.session&&-1==this.session.$wrap&&this.adjustWrapLimit())},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.content},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){var t,n,r,i,s;this.$keepTextAreaAtCursor&&(s=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left,t-=s.offset,r=this.lineHeight,t<0||t>s.height-r||(i=this.characterWidth,this.$composition&&(s=this.textarea.value.replace(/^\\x01+/,\"\"),i*=this.session.$getStringScreenWidth(s)[0]+2,r+=2,--t),(n-=this.scrollLeft)>this.$size.scrollerWidth-i&&(n=this.$size.scrollerWidth-i),n-=this.scrollBar.width,this.textarea.style.height=r+\"px\",this.textarea.style.width=i+\"px\",this.textarea.style.right=Math.max(0,this.$size.scrollerWidth-n-i)+\"px\",this.textarea.style.bottom=Math.max(0,this.$size.height-t-r)+\"px\"))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var e=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+e},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=0|e,i.bottom=0|t,i.right=0|r,i.left=0|n,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption(\"hScrollBarAlwaysVisible\",e)},this.getVScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption(\"vScrollBarAlwaysVisible\",e)},this.$updateScrollBarV=function(){this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,n){if(this.$changes&&(e|=this.$changes,this.$changes=0),this.session&&this.container.offsetWidth&&!this.$frozen&&(e||n)){if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal(\"beforeRender\");n=this.layerConfig;(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL)&&(e|=this.$computeLayerConfig(),n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+\"px\",this.content.style.marginTop=-n.offset+\"px\",this.content.style.width=n.width+2*this.$padding+\"px\",this.content.style.height=n.minHeight+\"px\"),e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+\"px\",this.scroller.className=this.scrollLeft<=0?\"ace_scroller\":\"ace_scroller ace_scroll-left\"),e&this.CHANGE_FULL?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()):e&this.CHANGE_SCROLL?(e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor()):(e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n)),this._signal(\"afterRender\")}else this.$changes|=e},this.$autosize=function(){var i=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.max((this.$minLines||1)*this.lineHeight,Math.min(t,i))+this.scrollMargin.v+(this.$extraHeight||0),i=t<i;n==this.desiredHeight&&this.$size.height==this.desiredHeight&&i==this.$vScroll||(i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i)),i=this.container.clientWidth,this.container.style.height=n+\"px\",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n)},this.$computeLayerConfig=function(){this.$maxLines&&1<this.lineHeight&&this.$autosize();var e=this.session,t=this.$size,g=t.height<=2*this.lineHeight,i=this.session.getScreenLength()*this.lineHeight,s=this.scrollTop%this.lineHeight,o=t.scrollerHeight+this.lineHeight,u=this.$getLongestLine(),d=!g&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-u-2*this.$padding<0),f=this.$horizScroll!==d;f&&(this.$horizScroll=d,this.scrollBarH.setVisible(d)),!this.$maxLines&&this.$scrollPastEnd&&this.scrollTop>i-t.scrollerHeight&&(i+=Math.min((t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd,this.scrollTop-i+t.scrollerHeight));var b=!g&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i<0),c=this.$vScroll!==b;c&&(this.$vScroll=b,this.scrollBarV.setVisible(b)),this.session.setScrollTop(Math.max(-this.scrollMargin.top,Math.min(this.scrollTop,i-t.scrollerHeight+this.scrollMargin.bottom))),this.session.setScrollLeft(Math.max(-this.scrollMargin.left,Math.min(this.scrollLeft,u+2*this.$padding-t.scrollerWidth+this.scrollMargin.right)));var v=Math.ceil(o/this.lineHeight)-1,d=(p=Math.max(0,Math.round((this.scrollTop-s)/this.lineHeight)))+v,g=this.lineHeight,p=e.screenToDocumentRow(p,0),b=e.getFoldLine(p);b&&(p=b.start.row);v=e.documentToScreenRow(p,0),b=e.getRowLength(p)*g,d=Math.min(e.screenToDocumentRow(d,0),e.getLength()-1),o=t.scrollerHeight+e.getRowLength(d)*g+b,s=this.scrollTop-v*g,b=0;return this.layerConfig.width!=u&&(b=this.CHANGE_H_SCROLL),(f||c)&&(b=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal(\"scrollbarVisibilityChanged\"),c&&(u=this.$getLongestLine())),this.layerConfig={width:u,padding:this.$padding,firstRow:p,firstRowScreen:v,lastRow:d,lineHeight:g,characterWidth:this.characterWidth,minHeight:o,maxHeight:i,offset:s,gutterOffset:Math.max(0,Math.ceil((s+t.height-t.scrollerHeight)/g)),height:this.$size.scrollerHeight},b},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(!(e>n.lastRow+1||t<n.firstRow))return t===1/0?(this.$showGutter&&this.$gutterLayer.update(n),void this.$textLayer.update(n)):(this.$textLayer.updateLines(n,e,t),!0)},this.$getLongestLine=function(){var e=this.session.getScreenWidth();return this.showInvisibles&&!this.session.$useWrapMode&&(e+=1),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(o,t,a){var i,u,f;0!==this.$size.scrollerHeight&&(i=(u=this.$cursorLayer.getPixelPosition(o)).left,f=u.top,o=a&&a.top||0,u=a&&a.bottom||0,f<(a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop)+o?(t&&(f-=t*this.$size.scrollerHeight),0===f&&(f=-this.scrollMargin.top),this.session.setScrollTop(f)):a+this.$size.scrollerHeight-u<f+this.lineHeight&&(t&&(f+=t*this.$size.scrollerHeight),this.session.setScrollTop(f+this.lineHeight-this.$size.scrollerHeight)),i<(f=this.scrollLeft)?(i<this.$padding+2*this.layerConfig.characterWidth&&(i=-this.scrollMargin.left),this.session.setScrollLeft(i)):f+this.$size.scrollerWidth<i+this.characterWidth?this.session.setScrollLeft(Math.round(i+this.characterWidth-this.$size.scrollerWidth)):f<=this.$padding&&i-f<this.characterWidth&&this.session.setScrollLeft(0))},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollLeft()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(e){this.session.setScrollTop(e*this.lineHeight)},this.alignCursor=function(r,i){var n=this.$cursorLayer.getPixelPosition(r=\"number\"==typeof r?{row:r,column:0}:r),r=this.$size.scrollerHeight-this.lineHeight,i=n.top-r*(i||0);return this.session.setScrollTop(i),i},this.STEPS=8,this.$calcSteps=function(e,t){for(var n=0,r=this.STEPS,i=[],n=0;n<r;++n)i.push(function(e,t,n){return n*(Math.pow(e-1,3)+1)+t}(n/this.STEPS,e,t-e));return i},this.scrollToLine=function(s,o,n,r){s=this.$cursorLayer.getPixelPosition({row:s,column:0}).top;o&&(s-=this.$size.scrollerHeight/2);o=this.scrollTop;this.session.setScrollTop(s),!1!==n&&this.animateScrolling(o,r)},this.animateScrolling=function(e,t){var n=this.scrollTop;if(this.$animatedScroll){var r=this;if(e!=n){if(this.$scrollAnimation){var i=this.$scrollAnimation.steps;if(i.length&&(e=i[0])==n)return}var s=r.$calcSteps(e,n);this.$scrollAnimation={from:e,to:n,steps:s},clearInterval(this.$timer),r.session.setScrollTop(s.shift()),r.session.$scrollTop=n,this.$timer=setInterval(function(){s.length?(r.session.setScrollTop(s.shift()),r.session.$scrollTop=n):null!=n?(r.session.$scrollTop=-1,r.session.setScrollTop(n),n=null):(r.$timer=clearInterval(r.$timer),r.$scrollAnimation=null,t&&t())},10)}}},this.scrollToY=function(e){this.scrollTop!==e&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=e)},this.scrollToX=function(e){this.scrollLeft!==e&&(this.scrollLeft=e),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollTo=function(e,t){this.session.setScrollTop(t),this.session.setScrollLeft(t)},this.scrollBy=function(e,t){t&&this.session.setScrollTop(this.session.getScrollTop()+t),e&&this.session.setScrollLeft(this.session.getScrollLeft()+e)},this.isScrollableBy=function(e,t){return t<0&&this.session.getScrollTop()>=1-this.scrollMargin.top||(0<t&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight-(this.$size.scrollerHeight-this.lineHeight)*this.$scrollPastEnd<-1+this.scrollMargin.bottom||(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||(0<e&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0)))},this.pixelToScreenCoordinates=function(r,i){var s=this.scroller.getBoundingClientRect(),r=(r+this.scrollLeft-s.left-this.$padding)/this.characterWidth,i=Math.floor((i+this.scrollTop-s.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:0<r-s?1:-1}},this.screenToTextCoordinates=function(r,t){var i=this.scroller.getBoundingClientRect(),r=Math.round((r+this.scrollLeft-i.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-i.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(s,i){var n=this.scroller.getBoundingClientRect(),s=this.session.documentToScreenPosition(s,i),i=this.$padding+Math.round(s.column*this.characterWidth),s=s.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,\"ace_focus\")},this.visualizeBlur=function(){i.removeCssClass(this.container,\"ace_focus\")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,\"ace_composition\"),this.textarea.style.cssText=\"\",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(i.removeCssClass(this.textarea,\"ace_composition\"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();var s;r.cssClass&&(i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass),s=\"padding\"in r?r.padding:\"padding\"in(n.theme||{})?4:n.$padding,n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,\"ace_dark\",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent(\"themeLoaded\",{theme:r}),t&&t())}var r,n=this;this.$themeId=e,n._dispatchEvent(\"themeChange\",{theme:e}),e&&\"string\"!=typeof e?o(e):(r=e||this.$options.theme.initialValue,s.loadModule([\"theme\",r],o))},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,!1!==t)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.content.style.cursor!=e&&(this.content.style.cursor=e)},this.setMouseCursor=function(e){this.content.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,\"renderer\",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){\"number\"==typeof e&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?\"block\":\"none\",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,\"ace_fade-fold-widgets\",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight)return this.$gutterLineHighlight=i.createElement(\"div\"),this.$gutterLineHighlight.className=\"ace_gutter-active-line\",void this.$gutter.appendChild(this.$gutterLineHighlight);this.$gutterLineHighlight.style.display=e?\"\":\"none\",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){\"number\"==typeof e&&(e+=\"px\"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},scrollPastEnd:{set:function(e){this.$scrollPastEnd!=(e=+e||0)&&(this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:\"./theme/textmate\",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"],function(u,t,n){var r=u(\"../lib/dom\"),i=u(\"../lib/oop\"),s=u(\"../lib/lang\"),o=u(\"../lib/event_emitter\").EventEmitter,u=function(e){this.element=r.createElement(\"div\"),this.element.className=\"ace_layer ace_gutter-layer\",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener(\"change\",this.$updateAnnotations),(this.session=e).on(\"change\",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn(\"deprecated use session.addGutterDecoration\"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn(\"deprecated use session.removeGutterDecoration\"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;t<e.length;t++){var u=e[t],o=u.row,i=(i=this.$annotations[o])||(this.$annotations[o]={text:[]}),o=(o=u.text)?s.escapeHTML(o):u.html||\"\";-1===i.text.indexOf(o)&&i.text.push(o);u=u.type;\"error\"==u?i.className=\" ace_error\":\"warning\"==u&&\" ace_error\"!=i.className?i.className=\" ace_warning\":\"info\"!=u||i.className||(i.className=\" ace_info\")}},this.$updateAnnotations=function(r){var t,s;this.$annotations.length&&(r=(s=(t=r.data).range).start.row,0!=(s=s.end.row-r)&&(\"removeText\"==t.action||\"removeLines\"==t.action?this.$annotations.splice(r,1+s,null):((s=new Array(1+s)).unshift(r,1),this.$annotations.splice.apply(this.$annotations,s))))},this.update=function(e){for(var t=this.session,E=e.firstRow,i=Math.min(e.lastRow+e.gutterOffset,t.getLength()-1),s=t.getNextFoldLine(E),o=s?s.start.row:1/0,u=this.$showFoldWidgets&&t.foldWidgets,a=t.$breakpoints,f=t.$decorations,l=t.$firstLineNumber,c=0,h=t.gutterRenderer||this.$renderer,p=null,d=-1,v=E;;){if(o<v&&(v=s.end.row+1,o=(s=t.getNextFoldLine(v,s))?s.start.row:1/0),i<v){for(;this.$cells.length>d+1;)p=this.$cells.pop(),this.element.removeChild(p.element);break}(p=this.$cells[++d])||((p={element:null,textNode:null,foldWidget:null}).element=r.createElement(\"div\"),p.textNode=document.createTextNode(\"\"),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m=\"ace_gutter-cell \";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var y,b=t.getRowLength(v)*e.lineHeight+\"px\";b!=p.element.style.height&&(p.element.style.height=b),!u||null==(y=u[v])&&(y=u[v]=t.getFoldWidget(v)),y?(p.foldWidget||(p.foldWidget=r.createElement(\"span\"),p.element.appendChild(p.foldWidget)),m=\"ace_fold-widget ace_\"+y,\"start\"==y&&v==o&&v<s.end.row?m+=\" ace_closed\":m+=\" ace_open\",p.foldWidget.className!=m&&(p.foldWidget.className=m),b=e.lineHeight+\"px\",p.foldWidget.style.height!=b&&(p.foldWidget.style.height=b)):p.foldWidget&&(p.element.removeChild(p.foldWidget),p.foldWidget=null);b=c=h?h.getText(t,v):v+l;b!=p.textNode.data&&(p.textNode.data=b),v++}this.element.style.height=e.minHeight+\"px\",(this.$fixedWidth||t.$useWrapMode)&&(c=t.getLength()+l);var w=h?h.getWidth(t,c,e):c.toString().length*e.characterWidth,E=this.$padding||this.$computePadding();(w+=E.left+E.right)===this.gutterWidth||isNaN(w)||(this.gutterWidth=w,this.element.style.width=Math.ceil(this.gutterWidth)+\"px\",this._emit(\"changeGutterWidth\",w))},this.$fixedWidth=!1,this.$showLineNumbers=!0,this.$renderer=\"\",this.setShowLineNumbers=function(e){this.$renderer=!e&&{getWidth:function(){return\"\"},getText:function(){return\"\"}}},this.getShowLineNumbers=function(){return this.$showLineNumbers},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(e){e?r.addCssClass(this.element,\"ace_folding-enabled\"):r.removeCssClass(this.element,\"ace_folding-enabled\"),this.$showFoldWidgets=e,this.$padding=null},this.getShowFoldWidgets=function(){return this.$showFoldWidgets},this.$computePadding=function(){if(!this.element.firstChild)return{left:0,right:0};var e=r.computedStyle(this.element.firstChild);return this.$padding={},this.$padding.left=parseInt(e.paddingLeft)+1||0,this.$padding.right=parseInt(e.paddingRight)||0,this.$padding},this.getRegion=function(e){var t=this.$padding||this.$computePadding(),n=this.element.getBoundingClientRect();return e.x<t.left+n.left?\"markers\":this.$showFoldWidgets&&e.x>n.right-t.right?\"foldWidgets\":void 0}}).call(u.prototype),t.Gutter=u}),ace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"],function(s,t,n){var r=s(\"../range\").Range,i=s(\"../lib/dom\"),s=function(e){this.element=i.createElement(\"div\"),this.element.className=\"ace_layer ace_marker-layer\",e.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){if(e=e||this.config){this.config=e;var n,t=[];for(n in this.markers){var o,u,s,r=this.markers[n];r.range?(s=r.range.clipRows(e.firstRow,e.lastRow)).isEmpty()||(s=s.toScreenRange(this.session),r.renderer?(o=this.$getTop(s.start.row,e),u=this.$padding+s.start.column*e.characterWidth,r.renderer(t,s,u,o,e)):\"fullLine\"==r.type?this.drawFullLineMarker(t,s,r.clazz,e):\"screenLine\"==r.type?this.drawScreenLineMarker(t,s,r.clazz,e):s.isMultiLine()?\"text\"==r.type?this.drawTextMarker(t,s,r.clazz,e):this.drawMultiLineMarker(t,s,r.clazz,e):this.drawSingleLineMarker(t,s,r.clazz+\" ace_start\",e)):r.update(t,this,this.session,e)}this.element=i.setInnerHtml(this.element,t.join(\"\"))}},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(e,t,n,i,s){var o=t.start.row,u=new r(o,t.start.column,o,this.session.getScreenLastRowColumn(o));for(this.drawSingleLineMarker(e,u,n+\" ace_start\",i,1,s),o=t.end.row,u=new r(o,0,o,t.end.column),this.drawSingleLineMarker(e,u,n,i,0,s),o=t.start.row+1;o<t.end.row;o++)u.start.row=o,u.end.row=o,u.end.column=this.session.getScreenLastRowColumn(o),this.drawSingleLineMarker(e,u,n,i,1,s)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),f=s+t.start.column*r.characterWidth;e.push(\"<div class='\",n,\" ace_start' style='\",\"height:\",o,\"px;\",\"right:0;\",\"top:\",u,\"px;\",\"left:\",f,\"px;\",i=i||\"\",\"'></div>\");u=this.$getTop(t.end.row,r),f=t.end.column*r.characterWidth;e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"width:\",f,\"px;\",\"top:\",u,\"px;\",\"left:\",s,\"px;\",i,\"'></div>\"),(o=(t.end.row-t.start.row-1)*r.lineHeight)<0||(u=this.$getTop(t.start.row+1,r),e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"right:0;\",\"top:\",u,\"px;\",\"left:\",s,\"px;\",i,\"'></div>\"))},this.drawSingleLineMarker=function(e,t,n,f,a,s){var o=f.lineHeight,u=(t.end.column+(a||0)-t.start.column)*f.characterWidth,a=this.$getTop(t.start.row,f),f=this.$padding+t.start.column*f.characterWidth;e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"width:\",u,\"px;\",\"top:\",a,\"px;\",\"left:\",f,\"px;\",s||\"\",\"'></div>\")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"top:\",s,\"px;\",\"left:0;right:0;\",i||\"\",\"'></div>\")},this.drawScreenLineMarker=function(e,s,n,o,i){s=this.$getTop(s.start.row,o),o=o.lineHeight;e.push(\"<div class='\",n,\"' style='\",\"height:\",o,\"px;\",\"top:\",s,\"px;\",\"left:0;right:0;\",i||\"\",\"'></div>\")}}).call(s.prototype),t.Marker=s}),ace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"],function(a,t,n){var r=a(\"../lib/oop\"),i=a(\"../lib/dom\"),s=a(\"../lib/lang\"),u=(a(\"../lib/useragent\"),a(\"../lib/event_emitter\").EventEmitter),a=function(e){this.element=i.createElement(\"div\"),this.element.className=\"ace_layer ace_text-layer\",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR=\"¶\",this.EOL_CHAR_LF=\"¬\",this.EOL_CHAR_CRLF=\"¤\",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR=\"→\",this.SPACE_CHAR=\"·\",this.$padding=0,this.$updateEolChar=function(){var e=\"\\n\"==this.session.doc.getNewLineCharacter()?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding=\"0 \"+e+\"px\"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on(\"changeCharacterSize\",function(e){this._signal(\"changeCharacterSize\",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles!=e&&(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides!=e&&(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;for(var r,i,o,u,a,t=this.$tabStrings=[0],n=1;n<e+1;n++)this.showInvisibles?t.push(\"<span class='ace_invisible ace_invisible_tab'>\"+this.TAB_CHAR+s.stringRepeat(\" \",n-1)+\"</span>\"):t.push(s.stringRepeat(\" \",n));this.displayIndentGuides&&(this.$indentGuideRe=/\\s\\S| \\t|\\t |\\s$/,r=\"ace_indent-guide\",o=i=\"\",a=this.showInvisibles?(r+=\" ace_invisible\",i=\" ace_invisible_space\",o=\" ace_invisible_tab\",u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),this.TAB_CHAR+s.stringRepeat(\" \",this.tabSize-1)):u=s.stringRepeat(\" \",this.tabSize),this.$tabStrings[\" \"]=\"<span class='\"+r+i+\"'>\"+u+\"</span>\",this.$tabStrings[\"\\t\"]=\"<span class='\"+r+o+\"'>\"+a+\"</span>\")},this.updateLines=function(e,t,n){this.config.lastRow==e.lastRow&&this.config.firstRow==e.firstRow||this.scrollLines(e),this.config=e;for(var r=Math.max(t,e.firstRow),s=Math.min(n,e.lastRow),o=this.element.childNodes,u=0,a=e.firstRow;a<r;a++){if(f=this.session.getFoldLine(a)){if(f.containsRow(r)){r=f.start.row;break}a=f.end.row}u++}for(var f,l=(f=this.session.getNextFoldLine(a=r))?f.start.row:1/0;l<a&&(a=f.end.row+1,l=(f=this.session.getNextFoldLine(a,f))?f.start.row:1/0),!(s<a);){var h,c=o[u++];c&&(this.$renderLine(h=[],a,!this.$useLineGroups(),a==l&&f),c.style.height=e.lineHeight*this.session.getRowLength(a)+\"px\",i.setInnerHtml(c,h.join(\"\"))),a++}},this.scrollLines=function(e){var t=this.config;if(this.config=e,!t||t.lastRow<e.firstRow)return this.update(e);if(e.lastRow<t.firstRow)return this.update(e);var i,n=this.element;if(t.firstRow<e.firstRow)for(var r=this.session.getFoldedRowCount(t.firstRow,e.firstRow-1);0<r;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);0<r;r--)n.removeChild(n.lastChild);e.firstRow<t.firstRow&&(i=this.$renderLinesFragment(e,e.firstRow,t.firstRow-1),n.firstChild?n.insertBefore(i,n.firstChild):n.appendChild(i)),e.lastRow>t.lastRow&&(i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow),n.appendChild(i))},this.$renderLinesFragment=function(e,t,n){for(var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:1/0;u<s&&(s=o.end.row+1,u=(o=this.session.getNextFoldLine(s,o))?o.start.row:1/0),!(n<s);){var a=i.createElement(\"div\"),f=[];if(this.$renderLine(f,s,!1,s==u&&o),a.innerHTML=f.join(\"\"),this.$useLineGroups())a.className=\"ace_line_group\",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+\"px\";else for(;a.firstChild;)r.appendChild(a.firstChild);s++}return r},this.update=function(e){for(var t=[],n=(this.config=e).firstRow,r=e.lastRow,s=n,o=this.session.getNextFoldLine(s),u=o?o.start.row:1/0;u<s&&(s=o.end.row+1,u=(o=this.session.getNextFoldLine(s,o))?o.start.row:1/0),!(r<s);)this.$useLineGroups()&&t.push(\"<div class='ace_line_group' style='height:\",e.lineHeight*this.session.getRowLength(s),\"px'>\"),this.$renderLine(t,s,!1,s==u&&o),this.$useLineGroups()&&t.push(\"</div>\"),s++;this.element=i.setInnerHtml(this.element,t.join(\"\"))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var f,l,i=this,a=r.replace(/\\t|&|<|( +)|([\\x00-\\x1f\\x80-\\xa0\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g,function(l,n,f,a,u){if(n)return i.showInvisibles?\"<span class='ace_invisible ace_invisible_space'>\"+s.stringRepeat(i.SPACE_CHAR,l.length)+\"</span>\":s.stringRepeat(\" \",l.length);if(\"&\"==l)return\"&#38;\";if(\"<\"==l)return\"&#60;\";if(\"\\t\"==l){a=i.session.getScreenTabSize(t+a);return t+=a-1,i.$tabStrings[a]}if(\"　\"!=l)return f?\"<span class='ace_invisible ace_invisible_space ace_invalid'>\"+i.SPACE_CHAR+\"</span>\":(t+=1,\"<span class='ace_cjk' style='width:\"+2*i.config.characterWidth+\"px'>\"+l+\"</span>\");f=i.showInvisibles?\"ace_cjk ace_invisible ace_invisible_space\":\"ace_cjk\",l=i.showInvisibles?i.SPACE_CHAR:\"\";return t+=1,\"<span class='\"+f+\"' style='width:\"+2*i.config.characterWidth+\"px'>\"+l+\"</span>\"});return this.$textToken[n.type]?e.push(a):(f=\"ace_\"+n.type.replace(/\\./g,\" ace_\"),l=\"\",\"fold\"==n.type&&(l=\" style='width:\"+n.value.length*this.config.characterWidth+\"px;' \"),e.push(\"<span class='\",f,\"'\",l,\">\",a,\"</span>\")),t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||n<=r?t:\" \"==t[0]?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[\" \"],r/this.tabSize)),t.substr(r)):\"\\t\"==t[0]?(e.push(s.stringRepeat(this.$tabStrings[\"\\t\"],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){for(var i=0,s=0,o=n[0],u=0,a=0;a<t.length;a++){var f=t[a],l=f.value;if(0==a&&this.displayIndentGuides){if(i=l.length,!(l=this.renderIndentGuide(e,l,o)))continue;i-=l.length}if(i+l.length<o)u=this.$renderToken(e,u,f,l),i+=l.length;else{for(;i+l.length>=o;)u=this.$renderToken(e,u,f,l.substring(0,o-i)),l=l.substring(o-i),i=o,r||e.push(\"</div>\",\"<div class='ace_line' style='height:\",this.config.lineHeight,\"px'>\"),u=0,o=n[++s]||Number.MAX_VALUE;0!=l.length&&(i+=l.length,u=this.$renderToken(e,u,f,l))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;(i=this.displayIndentGuides?this.renderIndentGuide(e,i):i)&&(n=this.$renderToken(e,n,r,i));for(var s=1;s<t.length;s++)i=(r=t[s]).value,n=this.$renderToken(e,n,r,i)},this.$renderLine=function(e,t,n,r){var i,s;i=(r=!r&&0!=r?this.session.getFoldLine(t):r)?this.$getFoldLineTokens(t,r):this.session.getTokens(t),n||e.push(\"<div class='ace_line' style='height:\",this.config.lineHeight*(this.$useLineGroups()?1:this.session.getRowLength(t)),\"px'>\"),i.length&&((s=this.session.getRowSplitData(t))&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)),this.showInvisibles&&(r&&(t=r.end.row),e.push(\"<span class='ace_invisible ace_invisible_eol'>\",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,\"</span>\")),n||e.push(\"</div>\")},this.$getFoldLineTokens=function(e,t){var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){null!=e?r.push({type:\"fold\",value:e}):(s=a?n.getTokens(t):s).length&&function(e,t,n){for(var o,i=0,s=0;s+e[i].value.length<t;)if(s+=e[i].value.length,++i==e.length)return;for(s!=t&&((o=e[i].value.substring(t-s)).length>n-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1);s<n&&i<e.length;)(o=e[i].value).length+s>n?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}(s,u,o)},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(s,t,n){var i,r=s(\"../lib/dom\"),s=function(e){this.element=r.createElement(\"div\"),this.element.className=\"ace_layer ace_cursor-layer\",e.appendChild(this.element),void 0===i&&(i=\"opacity\"in this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,\"ace_hidden-cursors\"),this.$updateCursors=this.$updateVisibility.bind(this)};(function(){this.$updateVisibility=function(e){for(var t=this.cursors,n=t.length;n--;)t[n].style.visibility=e?\"\":\"hidden\"},this.$updateOpacity=function(e){for(var t=this.cursors,n=t.length;n--;)t[n].style.opacity=e?\"\":\"0\"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e==this.smoothBlinking||i||(this.smoothBlinking=e,r.setCssClass(this.element,\"ace_smooth-blinking\",e),this.$updateCursors(!0),this.$updateCursors=(e?this.$updateOpacity:this.$updateVisibility).bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement(\"div\");return e.className=\"ace_cursor\",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(1<this.cursors.length){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,\"ace_hidden-cursors\"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,\"ace_hidden-cursors\"),this.restartTimer()},this.restartTimer=function(){var t,e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,\"ace_smooth-blinking\"),e(!0),this.isBlinking&&this.blinkInterval&&this.isVisible&&(this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,\"ace_smooth-blinking\")}.bind(this)),t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this),this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t())},this.getPixelPosition=function(n,t){if(!this.config||!this.session)return{left:0,top:0};n=n||this.session.selection.getCursor();n=this.session.documentToScreenPosition(n);return{left:this.$padding+n.column*this.config.characterWidth,top:(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight}},this.update=function(e){this.config=e;for(var t=this.session.$selectionMarkers,n=0,r=0,n=0,i=(t=void 0===t||0===t.length?[{cursor:null}]:t).length;n<i;n++){var o,s=this.getPixelPosition(t[n].cursor,!0);(s.top>e.height+e.offset||s.top<0)&&1<n||((o=(this.cursors[r++]||this.addCursor()).style).left=s.left+\"px\",o.top=s.top+\"px\",o.width=e.characterWidth+\"px\",o.height=e.lineHeight+\"px\")}for(;this.cursors.length>r;)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.$setOverwrite=function(e){e!=this.overwrite&&((this.overwrite=e)?r.addCssClass(this.element,\"ace_overwrite-cursors\"):r.removeCssClass(this.element,\"ace_overwrite-cursors\"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),ace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"],function(f,t,n){function u(e){this.element=i.createElement(\"div\"),this.element.className=\"ace_scrollbar ace_scrollbar\"+this.classSuffix,this.inner=i.createElement(\"div\"),this.inner.className=\"ace_scrollbar-inner\",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,\"scroll\",this.onScroll.bind(this)),s.addListener(this.element,\"mousedown\",s.preventDefault)}var r=f(\"./lib/oop\"),i=f(\"./lib/dom\"),s=f(\"./lib/event\"),o=f(\"./lib/event_emitter\").EventEmitter;!function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?\"\":\"none\",this.isVisible=e}}.call(u.prototype);function a(e,t){u.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+\"px\"}r.inherits(a,u),function(){this.classSuffix=\"-v\",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit(\"scroll\",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+\"px\"},this.setInnerHeight=function(e){this.inner.style.height=e+\"px\"},this.setScrollHeight=function(e){this.inner.style.height=e+\"px\"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(a.prototype);f=function(e,t){u.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+\"px\"};r.inherits(f,u),function(){this.classSuffix=\"-h\",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit(\"scroll\",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+\"px\"},this.setInnerWidth=function(e){this.inner.style.width=e+\"px\"},this.setScrollWidth=function(e){this.inner.style.width=e+\"px\"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),ace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"],function(i,t,n){var r=i(\"./lib/event\"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){var t;this.changes=this.changes|e,!this.pending&&this.changes&&(this.pending=!0,r.nextFrame(function(){var e;for(t.pending=!1;e=t.changes;)t.changes=0,t.onRender(e)},(t=this).window))}}).call(i.prototype),t.RenderLoop=i}),ace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event_emitter\"],function(e,a,n){var r=e(\"../lib/oop\"),i=e(\"../lib/dom\"),s=e(\"../lib/lang\"),o=e(\"../lib/event_emitter\").EventEmitter,u=0,a=a.FontMetrics=function(e,t){this.el=i.createElement(\"div\"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement(\"div\"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement(\"div\"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),u||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat(\"X\",u),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};!function(){r.implement(this,o),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement(\"div\");this.$setMeasureNodeStyles(e.style),e.style.width=\"0.2px\",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;u=0<t&&t<1?1:100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height=\"auto\",e.left=e.top=\"-100px\",e.visibility=\"hidden\",e.position=\"fixed\",e.whiteSpace=\"pre\",e.font=\"inherit\",e.overflow=t?\"hidden\":\"visible\"},this.checkForSizeChanges=function(){var t,e=this.$measureSizes();!e||this.$characterSize.width===e.width&&this.$characterSize.height===e.height||(this.$measureNode.style.fontWeight=\"bold\",t=this.$measureSizes(),this.$measureNode.style.fontWeight=\"\",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit(\"changeCharacterSize\",{data:e}))},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&this.$pollSizeChangesTimer},this.$measureSizes=function(){var t;return 0===(t=1===u?{height:(t=this.$measureNode.getBoundingClientRect()).height,width:t.width}:{height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/u}).width||0===t.height?null:t},this.$measureCharWidth=function(e){return this.$main.innerHTML=s.stringRepeat(e,u),this.$main.getBoundingClientRect().width/u},this.getCharacterWidth=function(e){var t=this.charSizes[e];return void 0===t&&(this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}.call(a.prototype)}),ace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"],function(e,t,n){function m(e){e.$multiselectOnSessionChange||(e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),e.$multiselectOnSessionChange=t.onSessionChange.bind(e),e.$multiselectOnSessionChange(e),e.on(\"changeSession\",e.$multiselectOnSessionChange),e.on(\"mousedown\",o),e.commands.addCommands(f.defaultCommands),function(e){function r(t){n&&(e.renderer.setMouseCursor(\"\"),n=!1)}var t=e.textInput.getElement(),n=!1;u.addListener(t,\"keydown\",function(t){18!=t.keyCode||t.ctrlKey||t.shiftKey||t.metaKey?n&&r():n||(e.renderer.setMouseCursor(\"crosshair\"),n=!0)}),u.addListener(t,\"keyup\",r),u.addListener(t,\"blur\",r)}(e))}var r=e(\"./range_list\").RangeList,i=e(\"./range\").Range,s=e(\"./selection\").Selection,o=e(\"./mouse/multi_select_handler\").onMouseDown,u=e(\"./lib/event\"),a=e(\"./lib/lang\"),f=e(\"./commands/multi_select_commands\");t.commands=f.defaultCommands.concat(f.multiSelectCommands);var c=new(e(\"./search\").Search),d=e(\"./edit_session\").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(d.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(e,t){if(e){if(!this.inMultiSelectMode&&0==this.rangeCount){var r=this.toOrientedRange();if(this.rangeList.add(r),this.rangeList.add(e),2!=this.rangeList.ranges.length)return this.rangeList.removeAll(),t||this.fromOrientedRange(e);this.rangeList.removeAll(),this.rangeList.add(r),this.$onAddRange(r)}e.cursor||(e.cursor=e.end);r=this.rangeList.add(e);return this.$onAddRange(e),r.length&&this.$onRemoveRange(r),1<this.rangeCount&&!this.inMultiSelectMode&&(this._signal(\"multiSelect\"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)}},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(t){t=this.rangeList.substractPoint(t);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal(\"addRange\",{range:e})},this.$onRemoveRange=function(e){var t;this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode&&(t=this.rangeList.ranges.pop(),e.push(t),this.rangeCount=0);for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal(\"removeRange\",{ranges:e}),0==this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal(\"singleSelect\"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),(t=t||this.ranges[0])&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new r,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(1<this.rangeCount){var a=this.rangeList.ranges,s=a[a.length-1],n=i.fromPoints(a[0].start,s.end);this.toSingleRange(),this.setSelectionRange(n,s.cursor==s.start)}else{var n=this.getRange(),a=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o)return a=a?(l=n.end,n.start):(l=n.start,n.end),this.addRange(i.fromPoints(a,a)),void this.addRange(i.fromPoints(l,l));var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c<o;c++)f.push(this.getLineRange(c,!0));(l=this.getLineRange(o,!0)).end.column=n.end.column,f.push(l),f.forEach(this.addRange,this)}},this.toggleBlockSelection=function(){var r,s;1<this.rangeCount?(s=(r=this.rangeList.ranges)[r.length-1],r=i.fromPoints(r[0].start,s.end),this.toSingleRange(),this.setSelectionRange(r,s.cursor==s.start)):(r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),this.rectangularRangeBlock(r,s).forEach(this.addRange,this))},this.rectangularRangeBlock=function(e,t,n){var o,u,r=[],s=e.column<t.column;u=s?(o=e.column,t.column):(o=t.column,e.column);var f,l,a=e.row<t.row;l=a?(f=e.row,t.row):(f=t.row,e.row),o<0&&(o=0),(f=f<0?0:f)==l&&(n=!0);for(var c=f;c<=l;c++){var h=i.fromPoints(this.session.screenToDocumentPosition(c,o),this.session.screenToDocumentPosition(c,u));if(h.isEmpty()){if(p&&function(e,t){return e.row==t.row&&e.column==t.column}(h.end,p))break;var p=h.end}h.cursor=s?h.start:h.end,r.push(h)}if(a&&r.reverse(),!n){for(var d=r.length-1;r[d].isEmpty()&&0<d;)d--;if(0<d)for(var m=0;r[m].isEmpty();)m++;for(var g=d;m<=g;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);d=e(\"./editor\").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,\"ace_selection\",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(t){t.marker&&(this.session.removeMarker(t.marker),-1!=(t=this.session.$selectionMarkers.indexOf(t))&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length)},this.removeSelectionMarkers=function(e){for(var t=this.session.$selectionMarkers,n=e.length;n--;){var i=e[n];i.marker&&(this.session.removeMarker(i.marker),-1!=(i=t.indexOf(i))&&t.splice(i,1))}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle(\"ace_multiselect\"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler(\"exec\",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(e){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle(\"ace_multiselect\"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler(\"exec\",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit(\"changeSelection\"))},this.$onMultiSelectExec=function(e){var r,t=e.command,n=e.editor;if(n.multiSelect)return t.multiSelectAction?r=\"forEach\"==t.multiSelectAction?n.forEachSelection(t,e.args):\"forEachLine\"==t.multiSelectAction?n.forEachSelection(t,e.args,!0):\"single\"==t.multiSelectAction?(n.exitMultiSelectMode(),t.exec(n,e.args||{})):t.multiSelectAction(n,e.args||{}):(r=t.exec(n,e.args||{}),n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()),r},this.forEachSelection=function(e,t,n){if(!this.inVirtualSelectionMode){var u,r=this.session,h=this.selection,o=h.rangeList,a=h._eventRegistry;h._eventRegistry={};var f=new s(r);this.inVirtualSelectionMode=!0;for(var l=o.ranges.length;l--;){if(n)for(;0<l&&o.ranges[l].start.row==o.ranges[l-1].end.row;)l--;f.fromOrientedRange(o.ranges[l]),f.id=o.ranges[l].marker,this.selection=r.selection=f;var c=e.exec(this,t||{});void 0!==u&&(u=c),f.toOrientedRange(o.ranges[l])}f.detach(),this.selection=r.selection=h,this.inVirtualSelectionMode=!1,h._eventRegistry=a,h.mergeOverlappingRanges();h=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),h&&h.from==h.to&&this.renderer.animateScrolling(h.from),u}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e=\"\";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var t=this.multiSelect.rangeList.ranges,n=[],r=0;r<t.length;r++)n.push(this.session.getTextRange(t[r]));var i=this.session.getDocument().getNewLineCharacter();(e=n.join(i)).length==(n.length-1)*i.length&&(e=\"\")}else this.selection.isEmpty()||(e=this.session.getTextRange(this.getSelectionRange()));return e},this.onPaste=function(e){if(!this.$readOnly){var t={text:e};if(this._signal(\"paste\",t),e=t.text,!this.inMultiSelectMode||this.inVirtualSelectionMode)return this.insert(e);var n=e.split(/\\r\\n|\\r|\\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec(\"insertstring\",this,e);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.findAll=function(e,t,n){(t=t||{}).needle=e||t.needle,this.$search.set(t);var r=this.$search.findAll(this.session);if(!r.length)return 0;this.$blockScrolling+=1;var i=this.multiSelect;n||i.toSingleRange(r[0]);for(var s=r.length;s--;)i.addRange(r[s],!0);return--this.$blockScrolling,r.length},this.selectMoreLines=function(e,t){var n=this.selection.toOrientedRange(),r=n.cursor==n.end,s=this.session.documentToScreenPosition(n.cursor);this.selection.$desiredColumn&&(s.column=this.selection.$desiredColumn);var a,f,l,o=this.session.screenToDocumentPosition(s.row+e,s.column);a=n.isEmpty()?o:(a=this.session.documentToScreenPosition(r?n.end:n.start),this.session.screenToDocumentPosition(a.row+e,a.column)),r?(f=i.fromPoints(o,a)).cursor=f.start:(f=i.fromPoints(a,o)).cursor=f.end,f.desiredColumn=s.column,this.selection.inMultiSelectMode?t&&(l=n.cursor):this.selection.addRange(n),this.selection.addRange(f),l&&this.selection.substractPoint(l)},this.transposeSelections=function(e){for(var t=this.session,n=t.multiSelect,r=n.ranges,i=r.length;i--;)(s=r[i]).isEmpty()&&(o=t.getWordRange(s.start.row,s.start.column),s.start.row=o.start.row,s.start.column=o.start.column,s.end.row=o.end.row,s.end.column=o.end.column);n.mergeOverlappingRanges();for(var u=[],i=r.length;i--;){var s=r[i];u.unshift(t.getTextRange(s))}e<0?u.unshift(u.pop()):u.push(u.shift());for(i=r.length;i--;){var o=(s=r[i]).clone();t.replace(s,u[i]),s.start.row=o.start.row,s.start.column=o.start.column}},this.selectMore=function(e,t){var n=this.session,i=n.multiSelect.toOrientedRange();i.isEmpty()&&((i=n.getWordRange(i.start.row,i.start.column)).cursor=-1==e?i.start:i.end,this.multiSelect.addRange(i));var o=n.getTextRange(i),o=function(e,t,n){return c.$options.wrap=!0,c.$options.needle=t,c.$options.backwards=-1==n,c.find(e)}(n,o,e);o&&(o.cursor=-1==e?o.start:o.end,this.$blockScrolling+=1,this.session.unfold(o),this.multiSelect.addRange(o),--this.$blockScrolling,this.renderer.scrollCursorIntoView(null,.5)),t&&this.multiSelect.substractPoint(i.cursor)},this.alignCursors=function(){var e=this.session,u=e.multiSelect,c=u.ranges;if(c.length){var h=-1,r=c.filter(function(e){return e.cursor.row==h||void(h=e.cursor.row)});u.$onRemoveRange(r);var d=0,v=1/0,m=c.map(function(i){var n=i.cursor,i=e.getLine(n.row).substr(n.column).search(/\\S/g);return n.column>d&&(d=n.column),(i=-1==i?0:i)<v&&(v=i),i});c.forEach(function(t,o){var r=t.cursor,s=d-r.column,o=m[o]-v;o<s?e.insert(r,a.stringRepeat(\" \",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),u.fromOrientedRange(c[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var r=this.selection.getRange(),s=r.start.row,o=r.end.row,u=s==o;if(u){for(var l,f=this.session.getLength();l=this.session.getLine(o),/[=:]/.test(l)&&++o<f;);for(;l=this.session.getLine(s),/[=:]/.test(l)&&0<--s;);s<0&&(s=0),f<=o&&(o=f-1)}c=this.session.doc.removeLines(s,o),c=this.$reAlignText(c,u);this.session.doc.insert({row:s,column:0},c.join(\"\\n\")+\"\\n\"),u||(r.start.column=0,r.end.column=c[c.length-1].length),this.selection.setRange(r)}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(\" \",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\\s+/,\"$1 \"):e[0]}var i,s,o,n=!0,r=!0;return e.map(function(e){var t=e.match(/(\\s*)(.*?)(\\s*)([=:].*)/);return t?(null==i?(i=t[1].length,s=t[2].length,o=t[3].length):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),s<t[2].length&&(s=t[2].length),o>t[3].length&&(o=t[3].length)),t):[e]}).map(t?f:n?r?function(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\\s+/,\"$1 \"):e[0]}:f:function(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\\s+/,\"$1 \"):e[0]})}}).call(d.prototype),t.onSessionChange=function(n){var t=n.session;t.multiSelect||(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t.multiSelect;n=n.oldSession;n&&(n.multiSelect.removeEventListener(\"addRange\",this.$onAddRange),n.multiSelect.removeEventListener(\"removeRange\",this.$onRemoveRange),n.multiSelect.removeEventListener(\"multiSelect\",this.$onMultiSelect),n.multiSelect.removeEventListener(\"singleSelect\",this.$onSingleSelect)),t.multiSelect.on(\"addRange\",this.$onAddRange),t.multiSelect.on(\"removeRange\",this.$onRemoveRange),t.multiSelect.on(\"multiSelect\",this.$onMultiSelect),t.multiSelect.on(\"singleSelect\",this.$onSingleSelect),this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e(\"./config\").defineOptions(d.prototype,\"editor\",{enableMultiselect:{set:function(e){m(this),e?(this.on(\"changeSession\",this.$multiselectOnSessionChange),this.on(\"mousedown\",o)):(this.off(\"changeSession\",this.$multiselectOnSessionChange),this.off(\"mousedown\",o))},value:!0}})}),ace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"],function(e,t,n){function i(e,t){return e.row==t.row&&e.column==t.column}var r=e(\"../lib/event\");t.onMouseDown=function(e){var n=(p=e.domEvent).altKey,s=p.shiftKey,o=e.getAccelKey(),u=e.getButton();if(e.editor.inMultiSelectMode&&2==u)e.editor.textInput.onContextMenu(e.domEvent);else if(o||n){var E,S,a=e.editor,f=a.selection,l=a.inMultiSelectMode,c=e.getDocumentPosition(),g=f.getCursor(),p=e.inSelection()||f.isEmpty()&&i(c,g),d=e.x,v=e.y,g=function(){var e=a.renderer.pixelToScreenCoordinates(d,v),t=y.screenToDocumentPosition(e.row,e.column);i(w,e)&&i(t,f.selectionLead)||(w=e,a.selection.moveToPosition(t),a.renderer.scrollCursorIntoView(),a.removeSelectionMarkers(x),(x=f.rectangularRangeBlock(w,b)).forEach(a.addSelectionMarker,a),a.updateSelectionMarkers())},y=a.session,b=a.renderer.pixelToScreenCoordinates(d,v),w=b;if(!o||n||s||0!==u){if(n&&0===u){e.stop(),l&&!o?f.toSingleRange():!l&&o&&f.addRange();var x=[];s?(b=y.documentToScreenPosition(f.lead),g()):f.moveToPosition(c);var N=g;r.capture(a.container,function(e){d=e.clientX,v=e.clientY},function(e){clearInterval(C),a.removeSelectionMarkers(x);for(var t=0;t<x.length;t++)f.addRange(x[t])});var C=setInterval(function(){N()},20);return e.preventDefault()}}else!l&&p||(l||(E=f.toOrientedRange(),a.addSelectionMarker(E)),S=f.rangeList.rangeAtPoint(c),a.$blockScrolling++,a.once(\"mouseup\",function(){var e=f.toOrientedRange();S&&e.isEmpty()&&i(S.cursor,e.cursor)?f.substractPoint(e.cursor):(E&&(a.removeSelectionMarker(E),f.addRange(E)),f.addRange(e)),a.$blockScrolling--}))}else 0===u&&e.editor.inMultiSelectMode&&e.editor.exitMultiSelectMode()}}),ace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"],function(r,t,n){t.defaultCommands=[{name:\"addCursorAbove\",exec:function(e){e.selectMoreLines(-1)},bindKey:{win:\"Ctrl-Alt-Up\",mac:\"Ctrl-Alt-Up\"},readonly:!0},{name:\"addCursorBelow\",exec:function(e){e.selectMoreLines(1)},bindKey:{win:\"Ctrl-Alt-Down\",mac:\"Ctrl-Alt-Down\"},readonly:!0},{name:\"addCursorAboveSkipCurrent\",exec:function(e){e.selectMoreLines(-1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Up\",mac:\"Ctrl-Alt-Shift-Up\"},readonly:!0},{name:\"addCursorBelowSkipCurrent\",exec:function(e){e.selectMoreLines(1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Down\",mac:\"Ctrl-Alt-Shift-Down\"},readonly:!0},{name:\"selectMoreBefore\",exec:function(e){e.selectMore(-1)},bindKey:{win:\"Ctrl-Alt-Left\",mac:\"Ctrl-Alt-Left\"},readonly:!0},{name:\"selectMoreAfter\",exec:function(e){e.selectMore(1)},bindKey:{win:\"Ctrl-Alt-Right\",mac:\"Ctrl-Alt-Right\"},readonly:!0},{name:\"selectNextBefore\",exec:function(e){e.selectMore(-1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Left\",mac:\"Ctrl-Alt-Shift-Left\"},readonly:!0},{name:\"selectNextAfter\",exec:function(e){e.selectMore(1,!0)},bindKey:{win:\"Ctrl-Alt-Shift-Right\",mac:\"Ctrl-Alt-Shift-Right\"},readonly:!0},{name:\"splitIntoLines\",exec:function(e){e.multiSelect.splitIntoLines()},bindKey:{win:\"Ctrl-Alt-L\",mac:\"Ctrl-Alt-L\"},readonly:!0},{name:\"alignCursors\",exec:function(e){e.alignCursors()},bindKey:{win:\"Ctrl-Alt-A\",mac:\"Ctrl-Alt-A\"}}],t.multiSelectCommands=[{name:\"singleSelection\",bindKey:\"esc\",exec:function(e){e.exitMultiSelectMode()},readonly:!0,isAvailable:function(e){return e&&e.inMultiSelectMode}}];r=r(\"../keyboard/hash_handler\").HashHandler;t.keyboardHandler=new r(t.multiSelectCommands)}),ace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"],function(e,t,n){function u(c,n,r,l){var s,u;this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),o.get(\"packaged\")||!e.toUrl?l=l||o.moduleUrl(n,\"worker\"):(s=this.$normalizePath,l=l||s(e.toUrl(\"ace/worker/worker.js\",null,\"_\")),u={},c.forEach(function(t){u[t]=s(e.toUrl(t,null,\"_\").replace(/(\\.js)?(\\?.*)?$/,\"\"))}));try{this.$worker=new Worker(l)}catch(a){if(!(a instanceof window.DOMException))throw a;c=this.$workerBlob(l),l=window.URL||window.webkitURL,c=l.createObjectURL(c);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage}var r=e(\"../lib/oop\"),i=e(\"../lib/net\"),s=e(\"../lib/event_emitter\").EventEmitter,o=e(\"../config\");!function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case\"log\":window.console&&console.log&&console.log.apply(console,t.data);break;case\"event\":this._signal(t.name,{data:t.data});break;case\"call\":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id])}},this.$normalizePath=function(e){return location.host&&(e=e.replace(/^[a-z]+:\\/\\/[^\\/]+/,\"\"),e=location.protocol+\"//\"+location.host+(\"/\"==e.charAt(0)?\"\":location.pathname.replace(/\\/[^\\/]*$/,\"\"))+\"/\"+e.replace(/^[\\/]+/,\"\")),e},this.terminate=function(){this._signal(\"terminate\",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc.removeEventListener(\"change\",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){var r;n&&(r=this.callbackId++,this.callbacks[r]=n,t.push(r)),this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call(\"setValue\",[e.getValue()]),e.on(\"change\",this.changeListener)},this.changeListener=function(e){this.deltaQueue?this.deltaQueue.push(e.data):(this.deltaQueue=[e.data],setTimeout(this.$sendDeltaQueue,0))},this.$sendDeltaQueue=function(){var e=this.deltaQueue;e&&(this.deltaQueue=null,20<e.length&&e.length>this.$doc.getLength()>>1?this.call(\"setValue\",[this.$doc.getValue()]):this.emit(\"change\",{data:e}))},this.$workerBlob=function(s){var t=\"importScripts('\"+i.qualifyURL(s)+\"');\";try{return new Blob([t],{type:\"application/javascript\"})}catch(n){s=new(window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder);return s.append(t),s.getBlob(\"application/javascript\")}}}.call(u.prototype);function a(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:\"call\",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:\"event\",name:e,data:t})},o.loadModule([\"worker\",t],function(e){for(r=new e[n](u);a.messageBuffer.length;)f()})}a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),ace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"],function(o,t,n){var r=o(\"./range\").Range,i=o(\"./lib/event_emitter\").EventEmitter,s=o(\"./lib/oop\"),o=function(e,t,u,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on(\"change\",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=u;u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on(\"changeCursor\",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session,i=this.$pos;this.pos=t.createAnchor(i.row,i.column),this.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.pos.on(\"change\",function(t){n.removeMarker(e.markerId),e.markerId=n.addMarker(new r(t.value.row,t.value.column,t.value.row,t.value.column+e.length),e.mainClass,null,!1)}),this.others=[],this.$others.forEach(function(r){r=t.createAnchor(r.row,r.column);e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){var e,t;this.othersActive||(e=this.session,(t=this).othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1),n.on(\"change\",function(i){e.removeMarker(n.markerId),n.markerId=e.addMarker(new r(i.value.row,i.value.column,i.value.row,i.value.column+t.length),t.othersClass,null,!1)})}))},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var e=0;e<this.others.length;e++)this.session.removeMarker(this.others[e].markerId)}},this.onUpdate=function(e){var t=e.data,n=t.range;if(n.start.row===n.end.row&&n.start.row===this.pos.row&&!this.$updating){this.$updating=!0;var i=\"insertText\"===t.action?n.end.column-n.start.column:n.start.column-n.end.column;if(n.start.column>=this.pos.column&&n.start.column<=this.pos.column+this.length+1){var s=n.start.column-this.pos.column;if(this.length+=i,!this.session.$fromUndo){if(\"insertText\"===t.action)for(var o=this.others.length-1;0<=o;o--){var a={row:(u=this.others[o]).row,column:u.column+s};u.row===n.start.row&&n.start.column<u.column&&(a.column+=i),this.doc.insert(a,t.text)}else if(\"removeText\"===t.action)for(o=this.others.length-1;0<=o;o--){var u,a={row:(u=this.others[o]).row,column:u.column+s};u.row===n.start.row&&n.start.column<u.column&&(a.column+=i),this.doc.remove(new r(a.row,a.column,a.row,a.column-i))}n.start.column===this.pos.column&&\"insertText\"===t.action?setTimeout(function(){this.pos.setPosition(this.pos.row,this.pos.column-i);for(var e=0;e<this.others.length;e++){var t=this.others[e],r={row:t.row,column:t.column-i};t.row===n.start.row&&n.start.column<t.column&&(r.column+=i),t.setPosition(r.row,r.column)}}.bind(this),0):n.start.column===this.pos.column&&\"removeText\"===t.action&&setTimeout(function(){for(var e=0;e<this.others.length;e++){var t=this.others[e];t.row===n.start.row&&n.start.column<t.column&&t.setPosition(t.row,t.column-i)}}.bind(this),0)}this.pos._emit(\"change\",{value:this.pos});for(o=0;o<this.others.length;o++)this.others[o]._emit(\"change\",{value:this.others[o]})}this.$updating=!1}},this.onCursorChange=function(e){var t;this.$updating||((t=this.session.selection.getCursor()).row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit(\"cursorEnter\",e)):(this.hideOtherMarkers(),this._emit(\"cursorLeave\",e)))},this.detach=function(){this.session.removeMarker(this.markerId),this.hideOtherMarkers(),this.doc.removeEventListener(\"change\",this.$onUpdate),this.session.selection.removeEventListener(\"changeCursor\",this.$onCursorChange),this.pos.detach();for(var e=0;e<this.others.length;e++)this.others[e].detach();this.session.setUndoSelect(!0)},this.cancel=function(){if(-1===this.$undoStackDepth)throw Error(\"Canceling placeholders only supported with undo manager attached to session.\");for(var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth,n=0;n<t;n++)e.undo(!0)}}).call(o.prototype),t.PlaceHolder=o}),ace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"],function(e,i,n){var r=e(\"../../range\").Range,i=i.FoldMode=function(){};!function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,r){r=e.getLine(r);return this.foldingStartMarker.test(r)?\"start\":\"markbeginend\"==t&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?\"end\":\"\"},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,f){var i=/\\S/,h=e.getLine(t),o=h.search(i);if(-1!=o){for(var u=f||h.length,a=e.getLength(),f=t,l=t;++t<a;){var c=e.getLine(t).search(i);if(-1!=c){if(c<=o)break;l=t}}if(f<l){h=e.getLine(l).length;return new r(f,u,l,h)}}},this.openingBracketBlock=function(e,u,n,o,a){o={row:n,column:o+1},u=e.$findClosingBracket(u,o,a);if(u){a=e.foldWidgets[u.row];return\"start\"==(a=null==a?e.getFoldWidget(u.row):a)&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)}},this.closingBracketBlock=function(e,u,n,o,s){o={row:n,column:o},u=e.$findOpeningBracket(u,o);if(u)return u.column++,o.column--,r.fromPoints(u,o)}}.call(i.prototype)}),ace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"],function(e,t,n){t.isDark=!1,t.cssClass=\"ace-tm\",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;}',e(\"../lib/dom\").importCssString(t.cssText,t.cssClass)}),ace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"],function(e,t,n){function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(r.length){var i=function(e,t,n){for(var r=0,i=e.length-1;r<=i;){var s=r+i>>1,o=n(t,e[s]);if(0<o)r=1+s;else{if(!(o<0))return s;i=s-1}}return-(r+1)}(r,{row:t,column:-1},s.comparePoints);(i=i<0?-i-1:i)>=r.length-1?i=0<n?0:r.length-1:0===i&&n<0&&(i=r.length-1);var u=r[i];if(u&&n){if(u.row===t){for(;(u=r[i+=n])&&u.row===t;);if(!u)return r.slice()}var a=[];for(t=u.row;a[n<0?\"unshift\":\"push\"](u),(u=r[i+=n])&&u.row==t;);return a.length&&a}}}var r=e(\"ace/line_widgets\").LineWidgets,i=e(\"ace/lib/dom\"),s=e(\"ace/range\").Range;t.showErrorMarker=function(e,f){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var v=e.getCursorPosition(),o=v.row,d=n.lineWidgets&&n.lineWidgets[o];d?d.destroy():o-=f;var l,f=u(n,o,f);if(f){var p=f[0];v.column=(p.pos&&\"number\"!=typeof p.column?p.pos.sc:p.column)||0,v.row=p.row,l=e.renderer.$gutterLayer.$annotations[v.row]}else{if(d)return;l={text:[\"Looks good!\"],className:\"ace_ok\"}}e.session.unfold(v.row),e.selection.moveToPosition(v);var h={row:v.row,fixedWidth:!0,coverGutter:!0,el:i.createElement(\"div\")},p=h.el.appendChild(i.createElement(\"div\")),d=h.el.appendChild(i.createElement(\"div\"));d.className=\"error_widget_arrow \"+l.className;v=e.renderer.$cursorLayer.getPixelPosition(v).left;d.style.left=v+e.renderer.gutterWidth-5+\"px\",h.el.className=\"error_widget_wrapper\",p.className=\"error_widget \"+l.className,p.innerHTML=l.text.join(\"<br>\"),p.appendChild(i.createElement(\"div\"));function m(e,t,n){if(0===t&&(\"esc\"===n||\"return\"===n))return h.destroy(),{command:\"null\"}}h.destroy=function(){e.$mouseHandler.isMousePressed||(e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off(\"changeSelection\",h.destroy),e.off(\"changeSession\",h.destroy),e.off(\"mouseup\",h.destroy),e.off(\"change\",h.destroy))},e.keyBinding.addKeyboardHandler(m),e.on(\"changeSelection\",h.destroy),e.on(\"changeSession\",h.destroy),e.on(\"mouseup\",h.destroy),e.on(\"change\",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(\"    .error_widget_wrapper {        background: inherit;        color: inherit;        border:none    }    .error_widget {        border-top: solid 2px;        border-bottom: solid 2px;        margin: 5px 0;        padding: 10px 40px;        white-space: pre-wrap;    }    .error_widget.ace_error, .error_widget_arrow.ace_error{        border-color: #ff5a5a    }    .error_widget.ace_warning, .error_widget_arrow.ace_warning{        border-color: #F1D817    }    .error_widget.ace_info, .error_widget_arrow.ace_info{        border-color: #5a5a5a    }    .error_widget.ace_ok, .error_widget_arrow.ace_ok{        border-color: #5aaa5a    }    .error_widget_arrow {        position: absolute;        border: solid 5px;        border-top-color: transparent!important;        border-right-color: transparent!important;        border-left-color: transparent!important;        top: -5px;    }\",\"\")}),ace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"],function(e,t,n){function o(e){this.session=e,(this.session.widgetManager=this).session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.detach=this.detach.bind(this),this.session.on(\"change\",this.updateOnChange)}e(\"./lib/oop\");var i=e(\"./lib/dom\");e(\"./range\").Range;(function(){this.getRowLength=function(e){var t=this.lineWidgets&&this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&(e+=t.rowCount)}),e},this.attach=function(e){e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach(),this.editor!=e&&(this.detach(),this.editor=e,this.editor.on(\"changeSession\",this.detach),e.widgetManager=this,e.setOption(\"enableLineWidgets\",!0),e.renderer.on(\"beforeRender\",this.measureWidgets),e.renderer.on(\"afterRender\",this.renderWidgets))},this.detach=function(n){n&&n.session==this.session||(n=this.editor)&&(n.off(\"changeSession\",this.detach),this.editor=null,n.widgetManager=null,n.renderer.off(\"beforeRender\",this.measureWidgets),n.renderer.off(\"afterRender\",this.renderWidgets),(n=this.session.lineWidgets)&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))}))},this.updateOnChange=function(i){var n,u,t=this.session.lineWidgets;t&&(i=(u=(n=i.data).range).start.row,0!=(u=u.end.row-i)&&(\"removeText\"==n.action||\"removeLines\"==n.action?t.splice(i+1,u).forEach(function(e){e&&this.removeLineWidget(e)},this):((u=new Array(u)).unshift(i,0),t.splice.apply(t,u)),this.$updateRows()))},this.$updateRows=function(){var t,e=this.session.lineWidgets;e&&(t=!0,e.forEach(function(e,n){e&&(t=!1,e.row=n)}),t&&(this.session.lineWidgets=null))},this.addLineWidget=function(e){this.session.lineWidgets||(this.session.lineWidgets=new Array(this.session.getLength())),this.session.lineWidgets[e.row]=e;var t=this.editor.renderer;return e.html&&!e.el&&(e.el=i.createElement(\"div\"),e.el.innerHTML=e.html),e.el&&(i.addCssClass(e.el,\"ace_lineWidgetContainer\"),e.el.style.position=\"absolute\",e.el.style.zIndex=5,t.container.appendChild(e.el),e._inDocument=!0),e.coverGutter||(e.el.style.zIndex=3),e.pixelHeight||(e.pixelHeight=e.el.offsetHeight),null==e.rowCount&&(e.rowCount=e.pixelHeight/t.layerConfig.lineHeight),this.session._emit(\"changeFold\",{data:{start:{row:e.row}}}),this.$updateRows(),this.renderWidgets(null,t),e},this.removeLineWidget=function(e){if(e._inDocument=!1,e.el&&e.el.parentNode&&e.el.parentNode.removeChild(e.el),e.editor&&e.editor.destroy)try{e.editor.destroy()}catch(t){}this.session.lineWidgets&&(this.session.lineWidgets[e.row]=void 0),this.session._emit(\"changeFold\",{data:{start:{row:e.row}}}),this.$updateRows()},this.onWidgetChanged=function(e){this.session._changedWidgets.push(e),this.editor&&this.editor.renderer.updateFull()},this.measureWidgets=function(e,t){var n=this.session._changedWidgets,r=t.layerConfig;if(n&&n.length){for(var i=1/0,s=0;s<n.length;s++){var o=n[s];o._inDocument||(o._inDocument=!0,t.container.appendChild(o.el)),o.h=o.el.offsetHeight,o.fixedWidth||(o.w=o.el.offsetWidth,o.screenWidth=Math.ceil(o.w/r.characterWidth));var u=o.h/r.lineHeight;o.coverLine&&((u-=this.session.getRowLineCount(o.row))<0&&(u=0)),o.rowCount!=u&&(o.rowCount=u,o.row<i&&(i=o.row))}i!=1/0&&(this.session._emit(\"changeFold\",{data:{start:{row:i}}}),this.session.lineWidgetWidth=null),this.session._changedWidgets=[]}},this.renderWidgets=function(e,t){var n=t.layerConfig,r=this.session.lineWidgets;if(r){for(var i=Math.min(this.firstRow,n.firstRow),s=Math.max(this.lastRow,n.lastRow,r.length);0<i&&!r[i];)i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var f,u=r[o];u&&u.el&&(u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el)),f=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top,u.coverLine||(f+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=f-n.offset+\"px\",f=u.coverGutter?0:t.gutterWidth,u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+\"px\",u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+\"px\":u.el.style.right=\"\")}}}}).call(o.prototype),t.LineWidgets=o}),ace.require([\"ace/ace\"],function(a){for(var key in a&&a.config.init(),window.ace||(window.ace={}),a)a.hasOwnProperty(key)&&(ace[key]=a[key])});"
  },
  {
    "path": "ui/scripts/ace/modes/grafito.js",
    "content": "ace.define(\"ace/mode/grafito_highlight_rules\", [\"require\", \"exports\", \"module\", \"ace/lib/oop\", \"ace/mode/text_highlight_rules\"], function(GrafitoHighlightRules, exports, module) {\n    \"use strict\";\n    var oop = GrafitoHighlightRules(\"../lib/oop\"),\n        TextHighlightRules = GrafitoHighlightRules(\"./text_highlight_rules\").TextHighlightRules,\n        GrafitoHighlightRules = function() {\n            this.$rules = {\n                start: [{\n                    token: \"variable.parameter\",\n                    regex: \"(?:->|=>|\\\\||\\\\:\\\\:|[\\\\-]{3,})\"\n                }, {\n                    token: \"keyword.operator\",\n                    regex: \"<\\\\:|\\\\-\\\\:|ø|@|#|\\\\+|\\\\||\\\\*|\\\\$|\\\\-|\\\\%|\\\\/|\\\\.\\\\.|\\\\^|~|=|<|>|\\\\\\\\|(?<!\\\\w)\\\\?\"\n                }, {\n                    token: \"string\",\n                    regex: /\"/,\n                    next: \"string\"\n                }, {\n                    token: \"string.other\",\n                    regex: \"{\",\n                    next: \"string.other\"\n                }, {\n                    token: \"comment\",\n                    regex: /;.+$/\n                }, {\n                    token: \"paren.map-start\",\n                    regex: \"#\\\\(\"\n                }, {\n                    token: \"paren.block-start\",\n                    regex: \"[\\\\[]\"\n                }, {\n                    token: \"paren.block-end\",\n                    regex: \"[\\\\]]\"\n                }, {\n                    token: \"paren.parens-start\",\n                    regex: \"[(]\"\n                }, {\n                    token: \"paren.parens-end\",\n                    regex: \"\\\\)\"\n                }, {\n                    token: \"support.constant\",\n                    regex: \"\\\\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|set|some|sorted|standalone|string|subset|suffix|superset|symbol|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\\\\?(?!:)\"\n                }, {\n                    token: \"support.constant\",\n                    regex: \"\\\\b(abs|acos|acosh|acsec|acsech|actan|actanh|add|after|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|builtins1|builtins2|call|capitalize|case|ceil|chop|clear|close|color|combine|conj|continue|copy|cos|cosh|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|false|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|help|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|maybe|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|panic|path|pause|permissions|permutate|pi|pop|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|to|true|truncate|try|type|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\\\\b(?!:)\"\n                }, {\n                    token: \"support.constant.bold\",\n                    regex: \"\\\\b(fetch|put|unput|link)\\\\b\"\n                }, {\n                    token: \"support.constant.bold\",\n                    regex: \"\\\\b(CUSTOM_HELPERS)\\\\b\"\n                }, {\n                    token: \"constant.other\",\n                    regex: /\\:\\w[-\\w'*.?!]*/\n                }, {\n                    token: \"variable\",\n                    regex: /\\w[-\\w'*.?!]*\\:/\n                }, {\n                    token: \"constant.other\",\n                    regex: /'\\w[-\\w'*.?!]*/\n                }, {\n                    caseInsensitive: !1\n                }],\n                string: [{\n                    token: \"string\",\n                    regex: /\"/,\n                    next: \"start\"\n                }, {\n                    defaultToken: \"string\"\n                }],\n                \"string.other\": [{\n                    token: \"string.other\",\n                    regex: /}/,\n                    next: \"start\"\n                }, {\n                    defaultToken: \"string.other\"\n                }],\n                tag: [{\n                    token: \"string.tag\",\n                    regex: />/,\n                    next: \"start\"\n                }, {\n                    defaultToken: \"string.tag\"\n                }],\n                comment: [{\n                    token: \"comment\",\n                    regex: /}/,\n                    next: \"start\"\n                }, {\n                    defaultToken: \"comment\"\n                }]\n            }\n        };\n    oop.inherits(GrafitoHighlightRules, TextHighlightRules), exports.GrafitoHighlightRules = GrafitoHighlightRules\n}), ace.define(\"ace/mode/folding/cstyle\", [\"require\", \"exports\", \"module\", \"ace/lib/oop\", \"ace/range\", \"ace/mode/folding/fold_mode\"], function(BaseFoldMode, FoldMode, module) {\n    \"use strict\";\n    var oop = BaseFoldMode(\"../../lib/oop\"),\n        Range = BaseFoldMode(\"../../range\").Range,\n        BaseFoldMode = BaseFoldMode(\"./fold_mode\").FoldMode,\n        FoldMode = FoldMode.FoldMode = function(commentRegex) {\n            commentRegex && (this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)), this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)))\n        };\n    oop.inherits(FoldMode, BaseFoldMode),\n        function() {\n            this.foldingStartMarker = /([\\{\\[\\(])[^\\}\\]\\)]*$|^\\s*(\\/\\*)/, this.foldingStopMarker = /^[^\\[\\{\\(]*([\\}\\]\\)])|^[\\s\\*]*(\\*\\/)/, this.singleLineBlockCommentRe = /^\\s*(\\/\\*).*\\*\\/\\s*$/, this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/, this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/, this._getFoldWidgetBase = this.getFoldWidget, this.getFoldWidget = function(session, foldStyle, fw) {\n                var line = session.getLine(fw);\n                if (this.singleLineBlockCommentRe.test(line) && !this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) return \"\";\n                fw = this._getFoldWidgetBase(session, foldStyle, fw);\n                return !fw && this.startRegionRe.test(line) ? \"start\" : fw\n            }, this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n                var line = session.getLine(row);\n                if (this.startRegionRe.test(line)) return this.getCommentRegionBlock(session, line, row);\n                var match = line.match(this.foldingStartMarker);\n                if (match) {\n                    var i = match.index;\n                    if (match[1]) return this.openingBracketBlock(session, match[1], row, i);\n                    var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n                    return range && !range.isMultiLine() && (forceMultiline ? range = this.getSectionRange(session, row) : \"all\" != foldStyle && (range = null)), range\n                }\n                if (\"markbegin\" !== foldStyle && (match = line.match(this.foldingStopMarker))) {\n                    i = match.index + match[0].length;\n                    return match[1] ? this.closingBracketBlock(session, match[1], row, i) : session.getCommentFoldRange(row, i, -1)\n                }\n            }, this.getSectionRange = function(session, row) {\n                for (var startIndent = (line = session.getLine(row)).search(/\\S/), startRow = row, startColumn = line.length, endRow = row += 1, maxRow = session.getLength(); ++row < maxRow;) {\n                    var line, indent = (line = session.getLine(row)).search(/\\S/);\n                    if (-1 !== indent) {\n                        if (indent < startIndent) break;\n                        var subRange = this.getFoldWidgetRange(session, \"all\", row);\n                        if (subRange) {\n                            if (subRange.start.row <= startRow) break;\n                            if (subRange.isMultiLine()) row = subRange.end.row;\n                            else if (startIndent == indent) break\n                        }\n                        endRow = row\n                    }\n                }\n                return new Range(startRow, startColumn, endRow, session.getLine(endRow).length)\n            }, this.getCommentRegionBlock = function(session, line, row) {\n                for (var startColumn = line.search(/\\s*$/), maxRow = session.getLength(), startRow = row, re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/, depth = 1; ++row < maxRow;) {\n                    line = session.getLine(row);\n                    var m = re.exec(line);\n                    if (m && (m[1] ? depth-- : depth++, !depth)) break\n                }\n                if (startRow < row) return new Range(startRow, startColumn, row, line.length)\n            }\n        }.call(FoldMode.prototype)\n}), ace.define(\"ace/mode/matching_brace_outdent\", [\"require\", \"exports\", \"module\", \"ace/range\"], function(MatchingBraceOutdent, exports, module) {\n    \"use strict\";\n    var Range = MatchingBraceOutdent(\"../range\").Range,\n        MatchingBraceOutdent = function() {};\n    ! function() {\n        this.checkOutdent = function(line, input) {\n            return !!/^\\s+$/.test(line) && /^\\s*\\}/.test(input)\n        }, this.autoOutdent = function(doc, row) {\n            var indent = doc.getLine(row).match(/^(\\s*\\})/);\n            if (!indent) return 0;\n            var column = indent[1].length,\n                indent = doc.findMatchingBracket({\n                    row: row,\n                    column: column\n                });\n            if (!indent || indent.row == row) return 0;\n            indent = this.$getIndent(doc.getLine(indent.row));\n            doc.replace(new Range(row, 0, row, column - 1), indent)\n        }, this.$getIndent = function(line) {\n            return line.match(/^\\s*/)[0]\n        }\n    }.call(MatchingBraceOutdent.prototype), exports.MatchingBraceOutdent = MatchingBraceOutdent\n}), ace.define(\"ace/mode/grafito\", [\"require\", \"exports\", \"module\", \"ace/lib/oop\", \"ace/mode/text\", \"ace/mode/grafito_highlight_rules\", \"ace/mode/folding/cstyle\", \"ace/mode/matching_brace_outdent\", \"ace/range\"], function(Mode, exports, module) {\n    \"use strict\";\n    var oop = Mode(\"../lib/oop\"),\n        TextMode = Mode(\"./text\").Mode,\n        GrafitoHighlightRules = Mode(\"./grafito_highlight_rules\").GrafitoHighlightRules,\n        GrafitoFoldMode = Mode(\"./folding/cstyle\").FoldMode,\n        MatchingBraceOutdent = Mode(\"./matching_brace_outdent\").MatchingBraceOutdent,\n        Mode = (Mode(\"../range\").Range, function() {\n            this.HighlightRules = GrafitoHighlightRules, this.foldingRules = new GrafitoFoldMode, this.$outdent = new MatchingBraceOutdent, this.$behaviour = this.$defaultBehaviour\n        });\n    oop.inherits(Mode, TextMode),\n        function() {\n            this.lineCommentStart = \";\", this.blockComment = {\n                start: \"comment {\",\n                end: \"}\"\n            }, this.getNextLineIndent = function(state, line, tab) {\n                var match, indent = this.$getIndent(line),\n                    endState = this.getTokenizer().getLineTokens(line, state),\n                    tokens = endState.tokens,\n                    endState = endState.state;\n                if (tokens.length && \"comment\" == tokens[tokens.length - 1].type) return indent;\n                if (\"start\" == state)(match = line.match(/^.*[\\{\\[\\(]\\s*$/)) && (indent += tab);\n                else if (\"doc-start\" == state) {\n                    if (\"start\" == endState) return \"\";\n                    (match = line.match(/^\\s*(\\/?)\\*/)) && (match[1] && (indent += \" \"), indent += \"* \")\n                }\n                return indent\n            }, this.checkOutdent = function(state, line, input) {\n                return this.$outdent.checkOutdent(line, input)\n            }, this.autoOutdent = function(state, doc, row) {\n                this.$outdent.autoOutdent(doc, row)\n            }, this.$id = \"ace/mode/grafito\"\n        }.call(Mode.prototype), exports.Mode = Mode\n}), ace.require([\"ace/mode/grafito\"], function(m) {\n    \"object\" == typeof module && \"object\" == typeof exports && module && (module.exports = m)\n});"
  },
  {
    "path": "ui/scripts/ace/themes/monokai.js",
    "content": "ace.define(\"ace/theme/monokai\", [\"require\", \"exports\", \"module\", \"ace/lib/dom\"], function(e, t, n) {\n    t.isDark = !0, \n    t.cssClass = \"ace-monokai\", \n    t.cssText = `\n        .ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}\n        .ace-monokai .ace_print-margin {width: 1px;background: #555651}\n        .ace-monokai {background-color: #272822;color: #F8F8F2}\n        .ace-monokai .ace_cursor {color: #F8F8F0}\n        .ace-monokai .ace_marker-layer .ace_selection {background: #49483E}\n        .ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;border-radius: 2px}\n        .ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}\n        .ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}\n        .ace-monokai .ace_marker-layer .ace_active-line {background: #202020}\n        .ace-monokai .ace_gutter-active-line {background-color: #272727}\n        .ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}\n        .ace-monokai .ace_invisible {color: #52524d}\n        .ace-monokai .ace_entity.ace_name.ace_tag,\n        .ace-monokai .ace_keyword,\n        .ace-monokai .ace_meta.ace_tag,\n        .ace-monokai .ace_storage {color: #F92672}\n        .ace-monokai .ace_punctuation,\n        .ace-monokai .ace_punctuation.ace_tag {color: #fff}\n        .ace-monokai .ace_constant.ace_character,\n        .ace-monokai .ace_constant.ace_language,\n        .ace-monokai .ace_constant.ace_numeric,\n        .ace-monokai .ace_constant.ace_other {color: #AE81FF}\n        .ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}\n        .ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}\n        .ace-monokai .ace_support.ace_constant,\n        .ace-monokai .ace_support.ace_function {color: #66D9EF}\n        .ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}\n        .ace-monokai .ace_storage.ace_type,\n        .ace-monokai .ace_support.ace_class,\n        .ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}\n        .ace-monokai .ace_entity.ace_name.ace_function,\n        .ace-monokai .ace_entity.ace_other,\n        .ace-monokai .ace_entity.ace_other.ace_attribute-name,\n        .ace-monokai .ace_variable {color: #A6E22E}\n        .ace-monokai .ace_helper {color: #FD971F}\n        .ace-monokai .ace_variable.ace_parameter {color: #FD971F}\n        .ace-monokai .ace_string {color: #E6DB74}\n        .ace-monokai .ace_comment {color: #75715E}\n        .ace-monokai .bold {font-weight: bold}\n        .ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}`, \n    e(\"../lib/dom\").importCssString(t.cssText, t.cssClass)\n});"
  },
  {
    "path": "ui/scripts/app.js",
    "content": "\nconst toastSuccess = (msg)=>{ iziToast.success({title: 'OK', message: msg})};\nconst toastWarning = (msg)=>{ iziToast.warning({title: 'Hmm', message: msg})};\nconst toastError   = (msg)=>{ iziToast.error({title: 'Ooops', message: msg})};\nconst toastInfo    = (msg)=>{ iziToast.info({title: '', message: msg})};\n\nconst Grafito = {\n    data() {\n        return {\n            performInitialSetup: false,\n            config: {\n                versions: {},\n                general: {\n                    darkTheme: {value: false, description: \"Enable dark theme\"},\n                    askForConfirmation: {value: true, description: \"Always request confirmation before deleting elements\"}\n                },\n                engine: {\n                    caseSensitive: {value: false, description: \"Queries should be case-sensitive\"}\n                },\n                graphView: {\n                    showNodesOnDrag: {value: true, description: \"Keep showing nodes when dragging\"},\n                    showEdgesOnDrag: {value: true, description: \"Keep showing edges when dragging\"},\n                    showEdgesOnZoom: {value: false, description: \"Keep showing edges when zooming\"},\n                    showEdgeLabels: {value: true, description: \"Show edge labels\"},\n                    showDashedEdges: {value: false, description: \"Show edges as dashed lines\"}\n                },\n                tableView: {\n                    prettifyJson: {value: true, description: \"Prettify exported JSON data\"}\n                }\n            },\n            working: false,\n            multilineMode: false,\n            editor: null,\n            graph: {\n                palettes: {\n                    active: \"\",\n                    list: []\n                },\n                dataset: {},\n                dataview: {\n                    nodes: [],\n                    edges: []\n                },\n                hovered: {\n                    node: null,\n                    edge: null\n                },\n                linkMode: false,\n                linker: {\n                    source: 0,\n                    target: 0\n                },\n                editOptions: {\n                    main: {\n                        visualization: [\n                            {icon: \"funnel-bold\", tip: \"Filter visible elements\", action: this.showFilterDialog},\n                            {icon: \"arrows-clockwise-bold\", tip: \"Refresh view\", action: this.refreshGraph}\n                        ],\n                        database: [\n                            {icon: \"plus-bold\", tip: \"Add new node\", effect: \"modifying\", action: this.showAddNodeDialog},\n                            {icon: \"palette-bold\", tip: \"Color palette\", effect: \"modifying\", action: this.showPaletteDialog}\n                        ]\n                    },\n                    node: {\n                        visualization: [\n                            {icon: \"arrows-out-fill\", tip: \"Expand neighboring nodes\", action: this.expandNodeNeighbors},\n                            {icon: \"eye-slash-bold\", tip: \"Hide node from graph view\", action: this.removeNode}\n                        ],\n                        database: [\n                            {icon: \"pencil-fill\", tip: \"Edit selected node\", effect: \"modifying\", action: this.showEditNodeDialog},\n                            {icon: \"link-bold\", tip: \"Link selected node\", effect: \"modifying\", action: this.linkNodeMode},\n                            {icon: \"trash-fill\", tip: \"Delete selected node\", effect: \"destructive\", action: this.deleteNode}\n                        ]\n                    },\n                    nodes: {\n                        visualization: [\n                            {icon: \"arrows-out-fill\", tip: \"Expand neighboring nodes\", action: this.expandNodeNeighbors},\n                            {icon: \"eye-slash-bold\", tip: \"Hide nodes from graph view\", action: this.removeNode}\n                        ],\n                        database: [\n                            {icon: \"trash-fill\", tip: \"Delete selected nodes\", effect: \"destructive\", action: this.deleteNode}\n                        ]\n                    },\n                    edge: {\n                        visualization: [\n                            {icon: \"eye-slash-bold\", tip: \"Hide edge from graph view\", action: this.removeEdge}\n                        ],\n                        database: [\n                            {icon: \"pencil-fill\", tip: \"Edit selected edge\", effect: \"modifying\", action: this.showEditEdgeDialog},\n                            {icon: \"trash-fill\", tip: \"Delete selected edge\", effect: \"destructive\", action: this.deleteEdge}\n                        ]\n                    },\n                    edges: {\n                        visualization: [\n                            {icon: \"eye-slash-bold\", tip: \"Hide edges from graph view\", action: this.removeEdge}\n                        ],\n                        database: [\n                            {icon: \"trash-fill\", tip: \"Delete selected edges\", effect: \"destructive\", action: this.deleteEdge}\n                        ]\n                    },\n                    all: {\n                        visualization: [\n                            {icon: \"eye-slash-bold\", tip: \"Hide elements from graph view\", action: this.removeElement}\n                        ],\n                        database: [\n                            {icon: \"trash-fill\", tip: \"Delete selected elements\", effect: \"destructive\", action: this.deleteElement}\n                        ]\n                    }\n                },\n                view: {},\n                filter: {\n                    edges: {},\n                    nodes: {}\n                },\n                selected: {\n                    node: [],\n                    edge: []\n                },\n                data: {\n                    nodes: [],\n                    edges: []\n                },\n                initialized: false,\n                config: {\n                    nodes: {\n                        shape: \"circle\",\n                        font: {\n                            face: \"Source Sans Pro\",\n                            align: \"center\"\n                        },\n                        widthConstraint: 70,\n                        borderWidthSelected: 5\n                    },\n                    edges:{\n                        arrows: {\n                            to: {\n                                enabled: true,\n                                scaleFactor: 0.5,\n                                type: \"arrow\"\n                            }\n                        },\n                        dashes: false,\n                        font: {\n                            background: '#FFFFFF',\n                            face: \"Source Sans Pro\",\n                            size: 12,\n                            color: '#343434',\n                            strokeColor: '#f5f5f5'\n                        },\n                        smooth: {\n                            type: 'dynamic'\n                        },\n                        length: 3.0\n                    },\n                    interaction: {\n                        hover: true,\n                        hideEdgesOnZoom: true,\n                        hoverConnectedEdges: true,\n                        selectConnectedEdges: false,\n                        navigationButtons: true,\n                        multiselect: true\n                    },\n                    layout: {\n\n                    },\n                    manipulation: {\n                        enabled: false\n                    },\n                    physics: {\n                        barnesHut: {\n                            springConstant: 0.03,\n                            avoidOverlap: 0.2\n                        }\n                    }\n                }\n            },\n            table: {\n                showSearchBuilder: false,\n                datarows: [],\n                keys: [],\n                rows: []\n            },\n            history: {\n                queries: []\n            },\n            analytics: {\n                disk: {\n                    path: \"\",\n                    size: {\n                        number: 0,\n                        units: \"\"\n                    }\n                },\n                memory: {\n                    number: 0,\n                    units: \"\"\n                },\n                database: {\n                    nodes: 0,\n                    edges: 0,\n                    degree: 0\n                }\n            },\n            command: {\n                focused: false\n            },\n            sidebar: {\n                hovered: \"\",\n                active: \"graph\",\n                items: {\n                    \"graph\":                    { tip: \"Graph View\", action: null },\n                    \"table\":                    { tip: \"Table View\", action: null },\n                    \"clock-counter-clockwise\":  { tip: \"Query History\", action: null },\n                    \"database\":                 { tip: \"Database Analytics\", action: this.getAnalytics },                   \n                    \"sliders\":                  { tip: \"Global Settings\", action: null }\n                }\n            },\n            modal: {\n                active: false,\n                title: \"Some title\",\n                icon: \"\",\n                mode: null,\n                dropdownShowing: false,\n                selectedPalette: \"\",\n                accept: {\n                    button: \"Yes, I accept it\",\n                    style: \"\",\n                    action: ()=> {console.log(\"modal action clicked!\");}\n                },\n                fields: {},\n                tagOptions: [],\n                showAdd: false,\n                addField: \"\",\n                addFieldType: \"String\",\n                showAddActive: false,\n                showCancel: true\n            }\n        }\n    },\n    methods: {\n        getInputTypeForValue(val){\n            if (typeof val == \"boolean\") return \"text\";\n            if (typeof val == \"string\") return \"text\";\n\n            return \"number\";\n        },\n\n        getInputIconForValue(key,val){\n            if (key == \"tag\") return \"tag-bold\";\n\n            if (typeof val == \"boolean\") return \"question-bold\";\n            if (typeof val == \"string\") return \"text-aa-bold\";\n\n            return \"hash-bold\";\n        },\n\n        processCommand(){\n            console.log(\"Grafito:: Processing command...\");\n\n            this.working = true;\n            let currentQuery = $(\".command input\").val();\n            var currentdate = new Date(); \n            var datetime = currentdate.getDate() + \"/\"\n                         + (currentdate.getMonth()+1)  + \"/\" \n                         + currentdate.getFullYear() + \" @ \"  \n                         + currentdate.getHours() + \":\"  \n                         + currentdate.getMinutes() + \":\" \n                         + currentdate.getSeconds();\n\n            $.post( \"/exec\", {command: currentQuery}, (data)=>{\n                if (data!=\"empty\"){\n                    if (data==\"error\"){\n                        this.history.queries.unshift({\n                            query: currentQuery,\n                            time: 0,\n                            last: datetime,\n                            worked: false\n                        });\n                        toastError(\"Something went wrong. Check your syntax!\");\n                    }\n                    else {\n                        try {\n                            dd = JSON.parse(data);\n\n                            this.drawGraph(dd[\"data\"], clean=true, firstDraw=true);\n                            this.drawTable(dd[\"rows\"]);\n\n                            let timeTaken = dd[\"timeTaken\"].toFixed(2);\n                            \n                            this.history.queries.unshift({\n                                query: currentQuery,\n                                time: timeTaken,\n                                last: datetime,\n                                worked: true\n                            });\n                            toastSuccess(`Query executed in ${timeTaken} ms`);\n                        }\n                        catch (e) {\n                            this.history.queries.unshift({\n                                query: currentQuery,\n                                time: 0,\n                                last: datetime,\n                                worked: false\n                            });\n                            console.log(e);\n                            toastError(\"Something went wrong!\");\n                        }\n                    }\n                }\n                else {\n                    toastSuccess(\"Query performed\");\n                }\n                this.working = false;\n            });\n        },\n\n        copyQueryToClipboard(queryId){\n            navigator.clipboard.writeText(this.history.queries[queryId].query).then(\n                ()=>toastInfo('The query has been copied to the clipboard!')\n            );\n        },\n\n        rerunQuery(queryId){\n            this.sidebar.active = 'graph';\n            $(\".command input\").val(this.history.queries[queryId].query);\n            this.processCommand();\n        },\n\n        toggleMultilineMode(){\n            this.multilineMode = !this.multilineMode;\n\n            if (this.multilineMode){\n                this.modal.title = \"New query\";\n                this.modal.mode = \"query\";\n                this.modal.accept.button = \"Execute\";\n\n                this.modal.accept.action = ()=>{\n                    $(\".command input\").val(this.editor.getValue().replaceAll(/\\n[\\s\\t]+/g,\" \"));\n                    this.processCommand();\n                    this.multilineMode = false;\n                };\n                this.modal.accept.style = \"is-modifying\";\n                this.modal.showAdd = false;\n                this.modal.showCancel = true;\n                this.modal.icon = \"arrow-circle-right\";\n                this.modal.dropdownShowing = false;\n\n                this.modal.active = true;\n                if (this.editor==null){\n                    setTimeout(()=>{\n                        this.editor = ace.edit(\"editor\");\n                        this.editor.setTheme(\"ace/theme/monokai\");\n                        this.editor.session.setMode(\"ace/mode/grafito\", ()=>{\n                            \n                        });\n                    }, 500);\n                }\n            }\n            else {\n                this.modal.active = false;\n            }\n        },\n\n        expandNodeNeighbors(nodeId=null){\n            let list = [nodeId];\n\n            if (nodeId==null) \n                list = this.graph.selected.node.map((x)=> x.id);\n\n            for (let node of list)\n                $.post(\"/nodeFromId\", {ndid: node }, (data)=>{\n                    let dt = JSON.parse(data);\n                    console.log(dt);\n                    for (let subnode of dt.nodes){\n                        this.graph.data.nodes.update(subnode);\n                    }\n                    for (let subedge of dt.edges){\n                        this.graph.data.edges.update(subedge);\n                    }\n                    // FIX: Something weird going on with \n                    // graph.data & graph.dataview synchronization\n\n                    this.resetFilterData(nomatterwhat=false);\n                    // this.graph.dataview.nodes.refresh();\n                    // this.graph.dataview.edges.refresh();\n                });\n        },\n\n        removeNode(nodeId=null){\n            let list = [nodeId];\n\n            if (nodeId==null) \n                list = this.graph.selected.node.map((x)=> x.id);\n\n            for (let node of list)\n                this.graph.data.nodes.remove(node);\n\n            this.graph.selected.node = this.graph.selected.node.filter((x)=> !list.includes(x.id));\n        },\n\n        deleteNode(nodeId=null, message=\"Delete selected node\", andThen=null){\n            let doDelete = ()=>{\n                let list = [nodeId];\n\n                if (nodeId==null) \n                    list = this.graph.selected.node.map((x)=> x.id);\n\n                let nodeCounter = 0\n                for (let node of list){\n                    $.post(\"/deleteNode\", {ndid: node }, ()=>{\n                        this.removeNode(node);\n                        nodeCounter += 1;\n                        if (nodeCounter == list.length && andThen != null)\n                            andThen();\n                    });\n                }\n            }\n\n            if ((this.graph.selected.node.length > 1) && (andThen==null))\n                message += \"s\";\n            \n            if (this.config.general.askForConfirmation.value) \n                this.showConfirmationDialog(message, doDelete);\n            else\n                doDelete();\n        },\n\n        removeEdge(edgeId=null){\n            let list = [edgeId];\n\n            if (edgeId==null) \n                list = this.graph.selected.edge.map((x)=> x.id);\n\n            for (let edge of list)\n                this.graph.data.edges.remove(edge);\n\n            this.graph.selected.edge = this.graph.selected.edge.filter((x)=> !list.includes(x.id));\n        },\n\n        deleteEdge(edgeId=null, message=\"Delete selected edge\", showConfirmation=true){\n            let doDelete = ()=>{\n                let list = [edgeId];\n\n                if (edgeId==null) \n                    list = this.graph.selected.edge.map((x)=> x.id);\n\n                for (let edge of list)\n                    $.post(\"/deleteEdge\", {egid: edge }, ()=>{\n                        this.removeEdge(edge);\n                    });\n            }\n\n            if (this.graph.selected.edge.length > 1)\n                message += \"s\";\n            \n            if (this.config.general.askForConfirmation.value && showConfirmation) \n                this.showConfirmationDialog(message, doDelete);\n            else\n                doDelete();\n        },\n\n        removeElement(){\n            this.removeNode();\n            this.removeEdge();\n        },\n\n        deleteElement(){\n            this.deleteNode(null, message=\"Delete selected elements\", andThen=()=>{\n                this.deleteEdge(null, message=\"\", showConfirmation=false);\n            });\n        },\n\n        linkNodeMode(nodeId=null){\n            this.graph.linkMode = true;\n            toastInfo(\"Now, select the target node or click anywhere else to cancel the operation\");\n        },\n\n        addEdgeHandler(data, callback){\n            console.log('add edge', data);\n            if (data.from == data.to) {\n                var r = confirm(\"Do you want to connect the node to itself?\");\n                if (r === true) {\n                    callback(data);\n                }\n            }\n            else {\n                callback(data);\n            }\n            // after each adding you will be back to addEdge mode\n            //this.graph.view.disableEdgeMode();\n            //network.addEdgeMode();\n        },\n\n        showConfirmationDialog(title, callback, button=\"Delete\", style=\"is-destructive\"){\n            this.modal.title = title;\n            this.modal.mode = \"confirmation\";\n            this.modal.accept.button = button;\n            this.modal.accept.style = style;\n            this.modal.accept.action = callback;\n            this.modal.showAdd = false;\n            this.modal.showCancel = true;\n            this.modal.icon = \"trash-fill\";\n\n            this.modal.active = true;\n        },\n\n        showFilterDialog(){\n            this.modal.title = \"Filter elements\";\n            this.modal.mode = \"filter\";\n            this.modal.accept.button = \"Done\"\n            this.modal.accept.style = \"\";\n            this.modal.accept.action = ()=>{};\n            this.modal.showAdd = false;\n            this.modal.showCancel = false;\n            this.modal.icon = \"funnel-bold\";\n\n            this.modal.active = true;\n        },\n\n        showAddNodeDialog(){\n            this.modal.title = \"Add node\";\n            this.modal.mode = \"edit\";\n            this.modal.accept.button = \"Create\";\n\n            this.modal.accept.action = ()=>{\n                let nodeTag = this.modal.fields.tag;\n                delete this.modal.fields.tag;\n                let props = this.modal.fields;\n\n                $.post(\"/createNode\", {\n                    newtag: nodeTag,\n                    props: JSON.stringify(props) \n                }, (data)=>{\n                    console.log(data);\n                    console.log(\"DONE ;-)\");//this.graph.data.nodes.update(node);\n                });\n            };\n            this.modal.accept.style = \"is-modifying\";\n            this.modal.showAdd = true;\n            this.modal.addField = \"\";\n            this.modal.addFieldType = \"String\";\n            this.modal.showCancel = true;\n            this.modal.dropdownShowing = false;\n            this.modal.icon = \"plus-bold\";\n\n            this.modal.tagOptions = [...new Set(VM.graph.data.nodes.map((x)=>x.tag))].sort();\n\n            this.modal.fields = {\n                tag: this.modal.tagOptions[0]\n            };\n\n            this.modal.active = true;\n        },\n\n        showPaletteDialog(){\n            this.modal.title = \"Color palette\";\n            this.modal.mode = \"palette\";\n            this.modal.accept.button = \"Apply\";\n            this.modal.selectedPalette = this.graph.palettes.active;\n            this.modal.accept.action = ()=>{\n                console.log(\"Applying palette:\", this.modal.selectedPalette);\n                this.graph.palettes.active = this.modal.selectedPalette;\n\n                $.post(\"/changePalette\", {\n                    newpalette: this.graph.palettes.active,\n                    ndids: this.graph.data.nodes.map((x)=>x.id).join(\",\")\n                }, (data)=>{\n                    let dt = JSON.parse(data);\n                    for (let subnode of dt.nodes){\n                        this.graph.data.nodes.update(subnode);\n                    }\n                });\n            };\n            this.modal.accept.style = \"is-modifying\";\n            this.modal.showAdd = false;\n            this.modal.showCancel = true;\n            this.modal.dropdownShowing = false;\n            this.modal.icon = \"palette-bold\";\n\n            this.modal.active = true;\n        },\n\n        addNewNodeField(){\n            if (this.modal.addFieldType=='String') \n                this.modal.fields[this.modal.addField]=''; \n            else if (this.modal.addFieldType=='Number') \n                this.modal.fields[this.modal.addField]=0;\n            else\n                this.modal.fields[this.modal.addField]=false; \n\n            this.modal.showAddActive=false;\n            this.modal.addField = '';\n            this.modal.addFieldType = 'String';\n        },\n\n        showEditNodeDialog(){\n            let nodeId = this.graph.selected.node[0].id;\n            let node = this.graph.data.nodes.get(nodeId);\n\n            this.modal.title = \"Edit node\";\n            this.modal.mode = \"edit\";\n            this.modal.accept.button = \"Save\";\n\n            // TODO(edit node) Fields appearing empty after closing modal\n            //  mainly the Name field; weird...\n            //  labels: bug, ui \n\n            this.modal.accept.action = ()=>{\n                node.tag = this.modal.fields.tag;\n                delete this.modal.fields.tag;\n                node.properties = this.modal.fields;\n\n                $.post(\"/updateNode\", {\n                    ndid: nodeId, \n                    newtag: node.tag,\n                    props: JSON.stringify(node.properties) \n                }, ()=>{\n                    this.graph.data.nodes.update(node);\n                });\n            };\n            this.modal.accept.style = \"is-modifying\";\n            this.modal.showAdd = true;\n            this.modal.addField = \"\";\n            this.modal.addFieldType = \"String\";\n            this.modal.showCancel = true;\n            this.modal.dropdownShowing = false;\n            this.modal.icon = \"pencil-fill\";\n\n            this.modal.tagOptions = [...new Set(VM.graph.data.nodes.map((x)=>x.tag))].sort();\n\n            this.modal.fields = Object.assign({\n                tag: node.tag,\n            }, node.properties);\n\n            this.modal.active = true;\n        },\n\n        showAddEdgeDialog(){\n            this.modal.title = \"Link selected node\";\n            this.modal.mode = \"edit\";\n            this.modal.accept.button = \"Create\";\n            \n            this.modal.accept.action = ()=>{\n                $.post(\"/linkNodes\", {\n                    newtag: this.modal.fields.tag,\n                    src: this.graph.linker.source,\n                    tgt: this.graph.linker.target\n                }, ()=>{\n                    // this.graph.data.edges.update(edge);\n                });\n            };\n            this.modal.accept.style = \"is-modifying\";\n            this.modal.showAdd = false;\n            this.modal.showCancel = true;\n            this.modal.dropdownShowing = false;\n            this.modal.icon = \"pencil-fill\";\n\n            this.modal.tagOptions = [...new Set(VM.graph.data.edges.map((x)=>x.label))].sort();\n\n            this.modal.fields = {\n                tag: \"\"\n            }\n\n            this.modal.active = true;\n        },\n\n        showEditEdgeDialog(){\n            let edgeId = this.graph.selected.edge[0].id;\n            let edge = this.graph.data.edges.get(edgeId);\n\n            console.log(edge);\n\n            this.modal.title = \"Edit edge\";\n            this.modal.mode = \"edit\";\n            this.modal.accept.button = \"Save\";\n            \n            this.modal.accept.action = ()=>{\n                edge.label = this.modal.fields.tag;\n\n                $.post(\"/updateEdge\", {\n                    egid: edge.dbId, \n                    newtag: edge.label,\n                }, ()=>{\n                    this.graph.data.edges.update(edge);\n                });\n            };\n            this.modal.accept.style = \"is-modifying\";\n            this.modal.showAdd = false;\n            this.modal.showCancel = true;\n            this.modal.dropdownShowing = false;\n            this.modal.icon = \"pencil-fill\";\n\n            this.modal.tagOptions = [...new Set(VM.graph.data.edges.map((x)=>x.label))].sort();\n\n            this.modal.fields = {\n                tag: edge.label\n            }\n\n            this.modal.active = true;\n        },\n\n        resetFilterData(nomatterwhat=false){\n            if (nomatterwhat) this.graph.filter.nodes = {};\n\n            for (var node of [...new Set(VM.graph.dataset.nodes.map((x) => x.tag))].sort()){\n                if (nomatterwhat)\n                    this.graph.filter.nodes[node] = true; \n                else {\n                    if (!(node in this.graph.filter.nodes))\n                    this.graph.filter.nodes[node] = true; \n                }\n            }\n\n            if (nomatterwhat) this.graph.filter.edges = {};\n\n            for (var edge of [...new Set(VM.graph.dataset.edges.map((x) => x.label))].sort()){\n                if (nomatterwhat)\n                    this.graph.filter.edges[edge] = true; \n                else {\n                    if (!(edge in this.graph.filter.edges))\n                    this.graph.filter.edges[edge] = true; \n                }\n            }\n        },\n\n        getAnalytics(){\n            $.post(\"/analytics\", {}, (data)=>{\n                this.analytics = JSON.parse(data);\n\n                $(\".counter-number\").counterUp({\n                    delay: 10,\n                    time: 1000\n                });\n            });\n        },\n\n        drawGraph(dataset, clean=false, firstDraw=false){\n            // if we're re-drawing the graph,\n            // let's first delete all previous data\n            if (clean && this.graph.initialized){\n                this.graph.data.nodes.clear();\n                this.graph.data.edges.clear();\n                this.graph.view.destroy();\n            }\n\n            // store dataset \n            this.graph.dataset = dataset;\n\n            // set filter data\n            if (clean && firstDraw){\n                this.resetFilterData();\n            }\n\n            // create an array with nodes\n            let nodes = new vis.DataSet(dataset.nodes);\n\n            // create an array with edges\n            let edges = new vis.DataSet(dataset.edges);\n\n            // create the graph\n            let container = document.getElementById(\"graph\");\n            this.graph.data = {\n                nodes: nodes,\n                edges: edges,\n            };\n\n            // setup filter for nodes\n            const nodeFilter = (node)=>{\n                if (typeof this.graph.filter.nodes === 'object')\n                    if (node.tag in this.graph.filter.nodes)\n                        return this.graph.filter.nodes[node.tag];\n                    else\n                        return true;\n                else\n                    return this.graph.filter.nodes;\n            }\n\n            // setup filter for edges\n            const edgeFilter = (edge)=>{\n                if (typeof this.graph.filter.edges === 'object')\n                    if (edge.label in this.graph.filter.edges)\n                        return this.graph.filter.edges[edge.label];\n                    else\n                        return true;\n                else\n                    return this.graph.filter.edges;\n            }\n\n            this.graph.dataview = {\n                nodes: new vis.DataView(nodes, { filter: nodeFilter }),\n                edges: new vis.DataView(edges, { filter: edgeFilter })\n            };\n\n            this.graph.view = new vis.Network(container, this.graph.dataview, this.graph.config);\n\n            const updateSelected = (x)=>{\n                if (this.graph.linkMode && !(\"previousSelection\" in Object.keys(x)) && x.nodes.length ==1){\n                    this.graph.linker.source = this.graph.selected.node[0].id;\n                    this.graph.linker.target = x.nodes[0];\n\n                    this.showAddEdgeDialog();\n                }\n                this.graph.selected.node = x.nodes.map((e) => this.graph.data.nodes.get(e));\n                this.graph.selected.edge = x.edges.map((e) => this.graph.data.edges.get(e));\n\n                this.graph.linkMode = false;\n            }\n\n            this.graph.view.on(\"selectNode\", updateSelected);\n            this.graph.view.on(\"deselectNode\", updateSelected);\n            this.graph.view.on(\"selectEdge\", updateSelected);\n            this.graph.view.on(\"deselectEdge\", updateSelected);\n\n            this.graph.view.on(\"doubleClick\", (x)=>{\n                this.expandNodeNeighbors(x.nodes[0]);\n            });\n\n            this.graph.view.on(\"hoverNode\", (x)=>{\n                this.graph.hovered.node = nodes.get(x.node);\n                this.graph.hovered.edge = null;\n            });\n\n            this.graph.view.on(\"hoverEdge\", (x)=>{\n                this.graph.hovered.edge = edges.get(x.edge);\n                this.graph.hovered.node = null;\n            });\n\n            this.graph.view.on(\"blurNode\", ()=>{\n                this.graph.hovered.node = null;\n            });\n\n            this.graph.view.on(\"blurEdge\", ()=>{\n                this.graph.hovered.edge = null;\n            });\n        },\n\n        drawTable(rows){\n            // store datarows\n            this.table.datarows = rows;\n\n            // get common property keys as table headers\n            var keys = Object.keys(rows[0].properties);\n            for (var row of rows){\n                keys = keys.filter(value => Object.keys(row.properties).includes(value));\n            }\n\n            // add the missing ones\n            for (var row of rows){\n                for (var prop of Object.keys(row.properties)){\n                    if (!keys.includes(prop)){\n                        keys.push(prop);\n                    }\n                }\n            }\n\n            // let's remove \"id\" and \"tag\"\n            // we do want them, but with our own preferred order\n            keys.unshift(\"id\");\n            keys.unshift(\"tag\");\n\n            // set table header\n            this.table.keys = keys;\n\n            // set table rows\n            this.table.rows = rows.map(row=>\n                Object.assign({\n                    tag: row.tag,\n                    id: row.id\n                }, row.properties)\n            );\n        },\n\n        refreshGraph() {\n            this.drawGraph(this.graph.dataset, clean=true);\n        },\n\n        updateGraphView() {\n            console.log(\"Grafito:: updating graph view...\");\n        \n            this.graph.config.interaction.hideNodesOnDrag = !this.config.graphView.showNodesOnDrag.value;\n            this.graph.config.interaction.hideEdgesOnDrag = !this.config.graphView.showEdgesOnDrag.value;\n            this.graph.config.interaction.hideEdgesOnZoom = !this.config.graphView.showEdgesOnZoom.value;\n\n            this.graph.config.edges.dashes = this.config.graphView.showDashedEdges.value;\n\n            if (this.config.general.darkTheme.value){\n                this.graph.config.edges.font.background = '#2A2C33';\n                this.graph.config.edges.font.color = '#DDDDDD';\n                this.graph.config.edges.font.strokeColor = '#222222';\n            }\n            else {\n                this.graph.config.edges.font.background = '#ffffff';\n                this.graph.config.edges.font.color = '#343434';\n                this.graph.config.edges.font.strokeColor = '#F5F5F5';\n            }\n            \n            this.graph.config.edges.font.size = (this.config.graphView.showEdgeLabels.value) ? 12 : 0;\n\n            this.graph.view.setOptions(this.graph.config);\n        },\n\n        updateEngineSettings() {\n            console.log(\"Grafito:: updating enging settings\");\n\n            $.post(\"/updateEngine\", {\n                caseSensitive: this.config.engine.caseSensitive.value \n            }, ()=>{\n                console.log(\"Grafito:: done\")\n            });\n        }\n    },\n\n    mounted(){\n        console.log(\"Grafito:: App started\");\n\n        $.post(\"/startup\", {}, (dd)=>{\n            let obj = JSON.parse(dd);\n\n            document.title = `Grafito @ ${obj.title}`;\n            this.drawGraph(obj.data, clean=true, firstDraw=true);\n            this.drawTable(obj.rows);\n            this.config.versions = obj.versions;\n            this.config.helpers = obj.helperEntities;\n            this.performInitialSetup = true;\n            this.config.engine.caseSensitive.value = obj.caseSensitive;\n            this.graph.initialized = true;\n            this.graph.palettes.list = obj.palettes\n            this.graph.palettes.active = obj.activePalette\n        });\n\n        // window.onbeforeunload = ()=>{\n        //     $.post( \"/exit\", {}, ()=>{});\n        //     return true;\n        // };\n    },\n\n    updated(){\n        if (this.performInitialSetup){\n            let table = $(\"#table table\").DataTable({\n                language: {\n                    lengthMenu: \n                        'Display <select>'+\n                            '<option value=\"10\">10</option>'+\n                            '<option value=\"25\">25</option>'+\n                            '<option value=\"50\">50</option>'+\n                            '<option value=\"100\">100</option>'+\n                            '<option value=\"-1\">All</option>'+\n                        '</select> results',\n                },\n                searchBuilder: true,\n                buttons: [\n                    {\n                        text: '<i class=\"ph-brackets-curly\"></i>',\n                        action: function ( e, dt, button, config ) {\n                            let bl = null;\n                            if (VM.config.tableView.prettifyJson.value)\n                                bl = JSON.stringify(VM.table.datarows, null, 4);\n                            else\n                                bl = JSON.stringify(VM.table.datarows);\n\n                            $.fn.dataTable.fileSave(\n                                new Blob([bl]),\n                                'Export.json'\n                            );\n                        }\n                    },\n                    {\n                        extend:    'csvHtml5',\n                        text:      '<i class=\"ph-file-csv\"></i>'\n                    },\n                    {\n                        extend:    'excelHtml5',\n                        text:      '<i class=\"ph-file-xls\"></i>'\n                    },\n                    {\n                        extend:    'pdfHtml5',\n                        text:      '<i class=\"ph-file-pdf\"></i>'\n                    }\n                ],\n                dom: \"fltip\"\n            });\n\n            table.buttons().container().appendTo($(\".table-info\"));\n            table.searchBuilder.container().insertBefore($(\"table.dataTable\"));\n            let tooltips = [\"Export as JSON\", \"Export as CSV spreadsheet\", \"Export as Excel spreadsheet\", \"Export as PDF\"];\n            for (let [idx,elem] of $(\".dt-button\").toArray().entries()){\n                $(elem).attr({\n                    \"data-tippy-content\": tooltips[idx],\n                    \"data-tippy-placement\": \"top\",\n                    \"data-tippy-theme\": \"light\"\n                });\n            }\n\n            $(\".dtsb-searchBuilder\").addClass(\"hidden\");\n            let filterButton = $(`\n                <input id=\"filterSwitch\" type=\"checkbox\" class=\"switch is-small is-info\">\n                <label id=\"filterLabel\" for=\"filterSwitch\">Additional filters</label>\n            `);\n            filterButton.change(()=>{\n                if ($(\"#filterSwitch\").is(\":checked\"))\n                    $(\".dtsb-searchBuilder\").removeClass(\"hidden\");\n                else {\n                    $(\".dtsb-searchBuilder\").addClass(\"hidden\");\n                }\n            });\n            filterButton.appendTo($(\".dataTables_filter label\"));\n\n            tippy(\"[data-tippy-content]\",{\n                offset: [0, 20],\n                delay: [500, 0]\n            });\n\n            this.performInitialSetup = false;\n        }\n    }\n}\n\nconst App = Vue.createApp(Grafito);\nconst VM = App.mount('#app');"
  },
  {
    "path": "ui/styles/app.less",
    "content": "/****************************************************\n Global variables\n ****************************************************/\n\n// Measurements\n\n@mainTop: 50px;\n@mainPushDown: 89px;\n@sidebarWidth: 60px;\n@sidebarBorder: 1px;\n@infobarHeight: 39px;\n\n// Colors\n\n@grafitoPurple: #683A8F;\n@switchableBg: #06842C;\n@modifyingColor: green;\n@destructiveColor: #AA0000;\n\n@darkFg: #DDDDDD;\n@darkFgDarker: #BBB;\n@darkBg: #2A2C33;\n@darkBgDarker: #222222;\n@darkGrafitoPurple: mediumvioletred;//lighten(@grafitoPurple, 30%);\n\n/****************************************************\n Global mixins\n ****************************************************/\n\n.stretched {\n    width: 100%;\n    height: 100%;\n    margin: 0px;\n    padding: 0px;\n    overflow: hidden;\n}\n\n.noselect {\n    -webkit-touch-callout: none; /* iOS Safari */\n      -webkit-user-select: none; /* Safari */\n       -khtml-user-select: none; /* Konqueror HTML */\n         -moz-user-select: none; /* Old versions of Firefox */\n          -ms-user-select: none; /* Internet Explorer/Edge */\n              user-select: none; /* Non-prefixed version, currently\n                                    supported by Chrome, Edge, Opera and Firefox */\n}\n\n/****************************************************\n Global styles\n ****************************************************/\n\n* {\n    font-family: 'Source Sans Pro', sans-serif !important;\n}\n\nhtml, body {\n    margin: 0px;\n    padding: 0px;\n    overflow-x: hidden;\n    overflow-y: hidden;\n}\n\n:focus, input:focus{\n    outline: none !important;\n}\n\n.switchable {\n    position: relative;\n    width: 1.8em;\n    height: 1.8em;\n    color: black;\n    border: 1px solid gray;\n    border-radius: 4px;\n    appearance: none;\n    outline: 0;\n    cursor: pointer;\n    transition: background 175ms cubic-bezier(0.1, 0.1, 0.25, 1);\n    box-sizing: border-box;\n    transform: scale(0.8);\n\n    &::before {\n        position: absolute;\n        content: '';\n        display: block;\n        top: 2px;\n        left: 7px;\n        width: 8px;\n        height: 14px;\n        border-style: solid;\n        border-color: white;\n        border-width: 0 2px 2px 0;\n        transform: rotate(45deg);\n        opacity: 0;\n        box-sizing: border-box;\n    }\n    &:checked {\n        color: white;\n        border-color: @switchableBg;\n        background: @switchableBg;\n        &::before {\n            opacity: 1;\n        }\n    }\n\n    & + label {\n        cursor: pointer;\n\n        &.inactive {\n            color: darkgray;\n        }\n    }\n}\n\n.dark .switchable {\n    & + label {\n        color: @darkFg;\n\n        &.inactive {\n            color: #666;\n        }\n    }\n}\n\n.switchable-wrapper {\n    display: flex;\n    flex-direction: row;\n\n    label {\n        margin-left: 0.5rem;\n    }\n}\n\n.inline-switchable-container {\n\n    pointer-events: auto !important;\n\n    .switchable {\n        border: 1px solid #dbdbdb !important;\n        box-shadow: inset 0 0.0625em 0.125em rgb(10 10 10 / 5%) !important;\n        border-radius: 4px;\n\n        &:hover {\n            border-color: #b5b5b5 !important;\n        }\n\n        &::before {\n            border-color: #363636 !important;\n        }\n\n        &:checked {\n            background: transparent !important;\n        }\n    }\n}\n\n.dark .inline-switchable-container {\n    .switchable {\n        border: 1px solid black !important;\n\n        &::before {\n            border-color: @darkFg !important;\n        }\n\n        &:checked {\n            background: @darkBgDarker !important;\n        }\n    }\n}\n\n/****************************************************\n Global animations\n ****************************************************/\n\n@-webkit-keyframes rotating {\n    from {\n        -webkit-transform: rotate(0deg);\n        -o-transform: rotate(0deg);\n        transform: rotate(0deg);\n    }\n    to {\n        -webkit-transform: rotate(360deg);\n        -o-transform: rotate(360deg);\n        transform: rotate(360deg);\n    }\n}\n\n@keyframes rotating {\n    from {\n        -ms-transform: rotate(0deg);\n        -moz-transform: rotate(0deg);\n        -webkit-transform: rotate(0deg);\n        -o-transform: rotate(0deg);\n        transform: rotate(0deg);\n    }\n    to {\n        -ms-transform: rotate(360deg);\n        -moz-transform: rotate(360deg);\n        -webkit-transform: rotate(360deg);\n        -o-transform: rotate(360deg);\n        transform: rotate(360deg);\n    }\n}\n\n.rotating {\n    -webkit-animation: rotating 2s linear infinite;\n    -moz-animation: rotating 2s linear infinite;\n    -ms-animation: rotating 2s linear infinite;\n    -o-animation: rotating 2s linear infinite;\n    animation: rotating 2s linear infinite;\n}\n\n.slide-left-enter-active {\n    transition: all 0.3s ease-out;\n}\n  \n.slide-left-leave-active {\n    transition: all 0.25s cubic-bezier(1, 0.5, 0.8, 1);\n}\n  \n.slide-left-enter-from,\n.slide-left-leave-to {\n    transform: translateX(50px);\n    opacity: 0;\n}\n\n/****************************************************\n Header\n ****************************************************/\n\n.command {    \n    .prompt {\n        position: fixed;\n        left: 15px;\n        top: 7px;\n        font-size: 1.8rem;\n        color: #888;\n        cursor: pointer;\n    }\n\n    .multiline {\n        position: fixed;\n        right: 140px;\n        top: 13px;\n        font-size: 1rem;\n        color: #888;\n        cursor: pointer;\n\n        &:hover {\n            color: #666;\n        }\n    }\n\n    input {\n        left: 20px;\n        top: 0px;\n        right:0px;\n        bottom: 52px;\n        width:100%;\n        font-size: 20px;\n        border-top: 0;\n        font-family: 'Fira Code' !important;\n        border-bottom: 4px solid #AAA;\n        border-left: 0;\n        border-right: 0;\n        padding: 10px;\n        background-image: url('data:image/png;base64,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AAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADFCaUAAAAAAAAoTigFAAAAAABAcUIpAAAAAAAAihNKAQAAAAAAUJxQCgAAAAAAgOKEUgAAAAAAABQnlAIAAAAAAKA4oRQAAAAAAADF/eAWQ3Hna7zFn/06AQAAAACoTq/X+/+2RMjpgGOqHgAAAABJRU5ErkJggg==');\n        background-size: contain;\n        background-repeat: no-repeat;\n        background-position: calc(100% - 20px) center;\n        padding-left: 65px;\n        padding-right: 185px;\n        color: #888;\n\n        &:focus {\n            border-bottom: 4px solid @grafitoPurple;\n            outline: none;\n        }\n\n        &::selection {\n            background: @grafitoPurple !important;\n            color: white !important;\n        }\n    }\n\n    &.focused {\n        filter: drop-shadow(1px 2px 4px #D5D5D5);\n\n        .prompt, input {\n            color: black;\n        }\n    }\n}\n\n.dark .command {\n\n    input {\n        background-color: @darkBg;\n        color: @darkFgDarker;\n        border-color: @darkBgDarker;\n        background-image: url('data:image/png;base64,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AAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQnVAKAAAAAACA6oRSAAAAAAAAVCeUAgAAAAAAoDqhFAAAAAAAANUJpQAAAAAAAKhOKAUAAAAAAEB1QikAAAAAAACqE0oBAAAAAABQ3V/cYqjubI23+ItfJwAAAAAAzZlMJv8fRE+pgFGeHiEAAAAASUVORK5CYII=');\n\n        &:focus {\n            border-color: @darkGrafitoPurple;\n        }\n\n        &::selection {\n            background: @darkGrafitoPurple !important;\n        }\n    }\n\n    &.focused {\n        .prompt, input {\n            color: @darkFg;\n        }\n    }\n}\n\n/****************************************************\n Multi-line Editor\n ****************************************************/\n\n#editor {\n    height: 400px;\n    font-family: 'Fira Code' !important;\n    text-shadow: 0 1px rgba(0,0,0,.3);\n    line-height: 1.5;\n    font-size: 1em;\n\n    * {\n        font-family: 'Fira Code' !important;\n    }\n}\n\n/****************************************************\n Sidebar\n ****************************************************/\n\nul.sidebar {\n    position: fixed;\n    left: 0px;\n    width: @sidebarWidth;\n    height: calc(100vh - @mainPushDown);\n    top: @mainTop;\n    background: #5a6169;\n    border-right: @sidebarBorder solid #EEE;\n    display: flex;\n    flex-direction: column;\n    justify-content: flex-start;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    box-shadow: -200px -141px 30px -200px rgba(0,0,0,0.39) inset;\n    -webkit-box-shadow: -200px -141px 30px -200px rgba(0,0,0,0.39) inset;\n    -moz-box-shadow: -200px -141px 30px -200px rgba(0,0,0,0.39) inset;\n\n    li {\n        padding: 0.3rem;\n        font-size: 2.5rem;\n        margin: 0.3rem;\n        margin-bottom: 1rem;\n        border-radius: 1rem;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        height: 3rem;\n        color: #AAA;\n        text-shadow: 0px 1px 0px rgba(255,255,255,.3), 0px -1px 0px rgba(0,0,0,.7);\n\n        &:nth-child(4) {\n            margin-top: auto;\n        }\n\n        &.active {\n            color: #5fbff9;\n        }\n\n        &:not(.active):hover {\n            color: #CCC;\n            border-color: #EEE;\n        }\n    }\n}\n\n/****************************************************\n Main content window\n ****************************************************/\n\n#content {\n    position: fixed;\n    left: (@sidebarWidth+@sidebarBorder) - 2px;\n    top: @mainTop;\n    right: 0;\n    width: calc(100vw - (@sidebarWidth+@sidebarBorder) + 1px);\n    height: calc(100vh - @mainPushDown);\n    background: white;\n    margin: 0px;\n    padding: 0px;\n    overflow-x: hidden;\n    overflow-y: hidden;\n\n    &:focus {\n        outline: none;\n    }\n}\n\n/****************************************************\n Slide-in edit options\n ****************************************************/\n\n.editOptions {\n    position: absolute;\n    top: 15px;\n    right: 15px;\n    z-index: 10;\n\n    .editOption {\n        background: white;\n        border: 3px solid lightgray;\n        border-radius: 50%;\n        font-size: 2rem;\n        margin-bottom: 1rem;\n        width: 3rem;\n        height: 3rem;\n        color: lightgray;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        cursor: pointer;\n\n        &:hover {\n            border-color: gray;\n            color: gray;\n        }\n\n        &.modifying {\n            &:hover {\n                border-color: @modifyingColor;\n                color: @modifyingColor;\n            }\n        }\n\n        &.destructive {\n            &:hover {\n                border-color: @destructiveColor;\n                color: @destructiveColor;\n            }\n        }\n    }\n\n    .editOption-separator {\n        height: 1.4rem;\n        padding-top: 0.4rem;\n        padding-bottom: 0.4rem;\n        width: 50%;\n        border-top: 3px dotted #EEEEEE;\n        text-align: center;\n        left: 0.7rem;\n        position: relative;\n    }\n}\n\n.dark .editOptions {\n    .editOption {\n        background: @darkBgDarker;\n        border-color: #999;\n        color: #999;\n\n        &:not(.modifying):not(.destructive):hover {\n            border-color: @darkFgDarker;\n            color: @darkFg;\n        }\n    }\n\n    .editOption-separator {\n        border-color: @darkFgDarker;\n    }\n}\n\n/****************************************************\n Graph view\n ****************************************************/\n\n#graph {\n    .stretched();\n\n    .vis-network, .vis-network:focus, canvas, canvas:focus {\n        outline: none !important;\n    }\n\n    .vis-network {\n        .vis-navigation {\n            .vis-button {\n                filter: opacity(0.3) grayscale(1);\n\n                &:hover {\n                    filter: opacity(1) grayscale(1); //hue-rotate(-213deg) saturate(5);\n                    box-shadow: none !important;\n                }\n            }\n        }\n    }\n}\n\n.dark #graph {\n    background: @darkBg;\n\n    .vis-network {\n        .vis-navigation {\n            .vis-button {\n                filter: opacity(0.3) invert(1) grayscale(1);\n\n                &:hover {\n                    filter: opacity(1) invert(1) grayscale(1);\n                }\n            }\n        }\n    }\n}\n\n/****************************************************\n Table view\n ****************************************************/\n\n#table {\n    .stretched();\n    .noselect();\n\n    padding: 2rem;\n    overflow-y: auto;\n\n    .dataTables_wrapper {\n        table.dataTable {\n            &>thead .sorting:before, \n            &>thead .sorting_asc:before, \n            &>thead .sorting_desc:before, \n            &>thead .sorting_asc_disabled:before, \n            &>thead .sorting_desc_disabled:before {\n                right: 1.1em;\n                top: 0.7rem;\n            }\n\n            &>thead .sorting:after, \n            &>thead .sorting_asc:after, \n            &>thead .sorting_desc:after, \n            &>thead .sorting_asc_disabled:after, \n            &>thead .sorting_desc_disabled:after {\n                right: 0.5em;\n                top: 0.7rem;\n            }\n\n            thead {\n                .sorting_asc, .sorting_desc, .sorting {\n                    background-image: none !important;\n                }\n            }\n\n            tbody {\n                th, td {\n                    padding: .5em 1em !important;\n                }\n            }\n\n            &.stripe tbody tr.odd, &.display tbody tr.odd {\n                background-color: inherit;\n            }\n        }\n\n        .dtsb-searchBuilder {\n            .dtsb-titleRow {\n                display: none !important;\n            }\n\n            div.dtsb-group div.dtsb-criteria {\n\n                select.dtsb-value, input.dtsb-value {\n                    border: 1px solid black;\n                    height: 2.4rem;\n                    border-radius: .375em;\n                    background-color: #fff;\n                    padding-right: 2.5em;\n                }\n\n                select.dtsb-data, select.dtsb-condition {\n                    border-color: inherit !important;\n                }\n            }\n\n            &.hidden {\n                display: none;\n            }\n        }\n\n        .dataTables_filter {\n            padding-bottom: 1rem;\n            text-align: center !important;\n            float: left;\n\n            input {\n                margin-left: 10px;\n                font-size: 1rem;\n                width: 15rem;\n                vertical-align: inherit !important;\n            }\n\n            #filterLabel {\n                margin-left: 1rem;\n            }\n        }\n\n        .dataTables_length {\n            padding-bottom: 1rem;\n            float: right;\n\n            select {\n                margin-left: 5px;\n                margin-right: 5px;\n                font-size: 1rem;\n                width: 5rem;\n                vertical-align: inherit !important;\n            }\n        }\n\n        .dataTables_info {\n            padding-top: 1.6rem;\n        }\n\n        .dataTables_paginate {\n            padding-top: 1rem;\n\n            .paginate_button {\n                border-radius: 50% !important;\n            }\n        }\n\n        input, select {\n            &:focus-visible {\n                outline: none;\n                border-color: #5fbff9;\n            }\n        }\n\n        select {\n            -webkit-appearance: none;\n            appearance: none;\n            -webkit-appearance: none;\n            -moz-appearance: none;\n            background: transparent;\n            background-image: url(\"data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");\n            background-repeat: no-repeat;\n            background-position-x: 100%;\n            border: 1px solid #dfdfdf;\n        }\n    }\n}\n\n.dark #table {\n    background: @darkBg;\n\n    .dataTables_wrapper {\n        table.dataTable {\n            color: @darkFg;\n            background: @darkBgDarker;\n\n            thead td, thead th {\n                color: @darkFg;\n            }\n\n            td, th {\n                border-color: black !important;\n            }\n\n            *:not(.sorting_1):not(.sorting_2):not(.sorting_3) {\n                td, th {\n                    border-color: @darkBg !important;\n                }\n            }\n\n            .sorting_1, .sorting_2, .sorting_3 {\n                background: black !important;\n            }\n\n            tbody tr:not(.is-selected):nth-child(even) {\n                background: @darkBg !important;\n            }\n        }\n\n        .dtsb-searchBuilder {\n            button {\n                background-color: black;\n                border-color: black;\n                color: @darkFg;\n\n                &.is-hovered, &:hover {\n                    background-color: @darkBgDarker;\n                    color: white;\n                }\n            }\n        }\n\n        .dataTables_length, .dataTables_filter, .dataTables_info, \n        .dataTables_processing, .dataTables_paginate {\n            color: @darkFgDarker;\n        }\n\n        .dataTables_paginate {\n            .paginate_button {\n                background: black;\n                color: @darkFgDarker;\n\n                &:hover {\n                    color: @darkFg;\n                }\n\n                &.current {\n                    color: @darkFg !important;\n                }\n            }\n        }\n\n        input, select {\n            color: @darkFg;\n\n            &.dtsb-value {\n                background: @darkBg !important;\n                color: @darkFg !important;\n                border-color: @darkFg !important;\n            }\n        }\n\n        .switch[type=checkbox].is-small+label::before, \n        .switch[type=checkbox].is-small+label:before {\n            background: @darkBgDarker !important;\n        }\n\n        .switch[type=checkbox].is-info:checked+label::before,\n        .switch[type=checkbox].is-info:checked+label:before {\n            background: #209cee !important;\n        }\n\n        select {\n            color: @darkFg;\n            background-image: url(\"data:image/svg+xml;utf8,<svg fill='white' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");\n        }\n    }\n}\n\n/****************************************************\n Query history page\n ****************************************************/\n\n#query-history {\n    .stretched();\n    .noselect();\n\n    padding: 2rem;\n    overflow-y: auto;\n\n    table {\n        table-layout: fixed;\n\n        .query-cell {\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            font-family: 'Fira Code' !important;\n        }\n\n        .query-ok {\n            color: green;\n        }\n\n        .query-wrong {\n            color: red;\n        }\n\n        th, td {\n            &:last-child {\n                text-align: right;\n            }\n        }\n    }\n\n    .no-queries {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        height: 15rem;\n        flex-direction: column;\n        color: #888;\n\n        .error-icon {\n            font-size: 3rem;\n        }\n\n        .error-message {\n            margin-top: 1rem;\n            font-size: 1.2rem;\n        }\n    }\n}\n\n.dark #query-history {\n    background: @darkBg;\n\n    table {\n        color: @darkFg;\n        background: @darkBgDarker;\n\n        thead td, thead th {\n            color: @darkFg;\n        }\n\n        td, th {\n            border-color: black !important;\n        }\n\n        *:not(.sorting_1):not(.sorting_2):not(.sorting_3) {\n            td, th {\n                border-color: @darkBg !important;\n            }\n        }\n\n        tbody tr:not(.is-selected):nth-child(even) {\n            background: @darkBg !important;\n        }\n\n        a.button {\n            background: black;\n            color: @darkFgDarker;\n            border-color: #666;\n\n            &:hover {\n                color: @darkGrafitoPurple;\n                border-color: @darkGrafitoPurple;\n            }\n        }\n    }\n}\n\n/****************************************************\n Analytics page\n ****************************************************/\n\n#database {\n    .stretched();\n    .noselect();\n\n    padding: 2rem;\n    overflow-y: auto;\n    background: #F6F6F6;\n\n    .hero {\n        .title {\n            color: @grafitoPurple;\n            font-weight: 700;\n            font-size: 3rem;\n\n            .vernum {\n                font-size: 1.3rem !important;\n                padding-left: 0.35em;\n                padding-right: 0.35em;\n                color: #AAA;\n                background-color: #EEE;\n                height: inherit !important;\n                margin-left: 0.5rem;\n            }\n        }\n\n        .subtitle {\n            color: #999;\n            font-size: 0.8rem;\n            display: flex;\n            align-items: center;\n            font-weight: bold;\n\n            i {\n                color: mediumseagreen;\n                font-size: 1.2rem;\n            }\n        }\n\n        .hero-body {\n            padding: 1.5rem;\n            padding-left: 1rem;\n            padding-right: 1rem;\n\n            .columns {\n                padding-left: 1rem;\n                padding-right: 1rem;\n            }\n\n            .right-column {\n                display: flex;\n                align-items: center;\n                justify-content: flex-end;\n                text-align: right;\n                color: #999;\n\n                b {\n                    font-weight: 600;\n                }\n            }\n        }\n    }\n\n    .card {\n        margin-top: 1.8rem;\n        box-shadow: 0 0.2em 0.4em -0.1em rgb(10 10 10 / 10%), \n                    0 0 0 1px rgb(10 10 10 / 2%);\n\n        .card-header {\n            box-shadow: none;\n            border-bottom: 1px solid #EEE;\n\n            .sideinfo {\n                align-items: center;\n                display: flex;\n                padding: .75rem 1rem;\n                color: #999;\n            }\n        }\n\n        .card-content {\n            padding: 1rem;\n        }\n    }\n\n    .counters {\n        .counter-column {\n            display: flex;\n            flex-direction: column;\n            //border: 1px solid #EEE;\n\n            &:not(:first-child) {\n                border-left: 1px solid #EEE;\n            }\n\n            .counter {\n                font-size: 3rem;\n                font-weight: 600;\n            }\n\n            .counter-label {\n                display: inline-flex;\n                justify-content: center;\n                align-items: center;\n                font-size: 1.3rem;\n                text-transform: uppercase;\n                color: #AAA;\n                font-weight: 700;\n                text-shadow: rgb(255 255 255 / 50%) 0px 3px 3px;\n\n                i {\n                    margin-right: 0.5rem;\n                }\n            }\n\n            .counter-units {\n                font-size: 1.5rem;\n            }\n\n            &:hover {\n                .counter {\n                    color: darkgreen;\n                }\n\n                .counter-label {\n                    color: #666;\n                }\n            }\n        }\n    }\n}\n\n.dark #database {\n    background: @darkBg;\n\n    .hero {\n        .title {\n            color: @darkGrafitoPurple;\n\n            .vernum {\n                color: #888;\n                background-color: @darkBgDarker;\n            }\n        }\n    }\n\n    .card {\n        background: @darkBgDarker;\n        color: @darkFg;\n\n        .card-header {\n            background: black;\n            border-bottom: 1px solid #444;\n\n            .card-header-title {\n                color: white;\n            }\n\n            .sideinfo {\n                color: @darkFgDarker;\n            }\n        }\n\n        .card-content {\n            //padding: 1rem;\n        }\n    }\n\n    .counters {\n        .counter-column {\n            &:not(:first-child) {\n                border-left: 1px solid #444;\n            }\n\n            .counter-label {\n                color: @darkFgDarker;\n\n                text-shadow: rgb(0 0 0 / 50%) 0px 3px 3px;\n            }\n\n            &:hover {\n                .counter {\n                    color: greenyellow;\n                }\n\n                .counter-label {\n                    color: @darkFg;\n                }\n            }\n        }\n    }\n}\n\n/****************************************************\n Global settings page\n ****************************************************/\n\n#settings {\n    .stretched();\n    .noselect();\n\n    padding: 2rem;\n    overflow-y: auto;\n\n    .panel {\n        box-shadow: 0 0.2em 1em -0.125em rgb(10 10 10 / 3%), \n                    0 0 0 1px rgb(10 10 10 / 3%);\n\n        .panel-block {\n            padding: 0.5rem 1rem;\n        }\n    }\n}\n\n.dark #settings {\n    background: @darkBg;\n\n    .panel {\n        box-shadow: 0 0.2em 1em -0.125em rgb(250 250 250 / 3%), 0 0 0 1px rgb(250 250 250 / 3%);\n\n        .panel-heading {\n            background-color: @darkBgDarker;\n            color: @darkFgDarker;\n        }\n\n        .panel-block {\n            &:not(:last-child) {\n                border-bottom: 1px solid @darkBgDarker;\n            }\n        }\n    }\n}\n\n/****************************************************\n Modals\n ****************************************************/\n\n.modal {\n    .modal-background {\n        bottom: @infobarHeight !important;\n        background-color: rgba(10,10,10,.5) !important;\n    }\n\n    .modal-card {\n        .modal-card-title {\n            display: inline-flex;\n            font-size: 1.3rem;\n\n            i {\n                margin-right: 0.5rem;\n            }\n        }\n\n        .modal-card-body {\n            .palette-container {\n                display: flex;\n                margin-top: 1rem;\n                margin-bottom: 1rem;\n            }\n\n            select {\n                border-radius: 5px;\n                padding: 0.3rem;\n            }\n\n            &.query-mode {\n                padding: 0 !important;\n            }\n\n            .field-label {\n                align-self: center;\n\n                label {\n                    //font-variant: small-caps;\n                    //font-size: 1.2rem;\n                }\n            }\n\n            button {\n                &.is-hovered, &:hover {\n                    border-color: #dbdbdb !important;\n                    background: #F6F6F6;\n                }\n\n                &:not(.simple-dropdown).is-hovered, &:not(.simple-dropdown):hover {\n                    color: @destructiveColor;\n                }\n            }\n\n            .control.has-icons-left .input, \n            .control.has-icons-right .input {\n                &~.icon {\n                    color: #AAA;\n\n                    .switchable {\n                        border-color: #AAA !important;\n                    }\n                }\n\n                &:focus~.icon {\n                    color: #333;\n\n                    .switchable {\n                        border-color: #333 !important;\n                    }\n                }\n            }\n        }\n\n        .modal-card-foot {\n            justify-content: flex-end !important;\n            padding-top: 8px;\n            padding-bottom: 8px;\n\n            .leftmost {\n                margin-right: auto;\n\n                .field {\n                    display: inline-flex !important;\n                }\n            }\n\n            button {\n                &.is-modifying {\n                    border-color: @modifyingColor;\n                    color: @modifyingColor;\n\n                    &:hover, &:focus {\n                        background-color: @modifyingColor;\n                        border-color: @modifyingColor;\n                        color: #fff;\n                    }\n                }\n\n                &.is-destructive {\n                    border-color: @destructiveColor;\n                    color: @destructiveColor;\n\n                    &:hover, &:focus {\n                        background-color: @destructiveColor;\n                        border-color: @destructiveColor;\n                        color: #fff;\n                    }\n                }\n            }\n        }\n    }\n\n    // TODO(UI style) Check if dropdowns in modal dialogs work properly\n    //  there is an issue with Bulma & overflows for modal dialogs\n    //  labels: ui,bug\n    &.with-dropdown {\n        overflow: visible !important;\n\n        .modal-card {\n            overflow: visible !important;\n\n            .modal-card-body {\n                overflow: visible !important;\n            }\n        }\n    }\n}\n\n.dark .modal {\n    .modal-background {\n        background-color: rgba(10,10,10,.7) !important;\n    }\n\n    .modal-card {\n        .modal-card-head {\n            border-color: black !important;\n            background: @darkBgDarker;\n            .modal-card-title {\n                color: @darkFg !important;\n            }\n\n            .delete {\n                filter: invert(1);\n\n                &:hover {\n                    filter: none;\n                }\n            }\n        }\n\n        .modal-card-body {\n            background: lighten(@darkBg, 5%);\n            color: @darkFgDarker !important;\n\n            .field-label, .field-label label {\n                color: @darkFg !important;\n            }\n\n            select {\n                background: @darkBgDarker;\n                color: @darkFgDarker;\n            }\n\n            input {\n                background-color: @darkBgDarker;\n                color: @darkFgDarker;\n                border-color: black;\n            }\n\n            .control.has-icons-left .input, \n            .control.has-icons-right .input {\n                &~.icon {\n                    color: #666;\n\n                    .switchable {\n                        border-color: #666 !important;\n                    }\n                }\n\n                &:focus~.icon {\n                    color: @darkGrafitoPurple;\n\n                    .switchable {\n                        border-color: @darkFg !important;\n                    }\n                }\n            }\n\n            button {\n                background-color: black;\n                border-color: black;\n                color: @darkFg;\n\n                &.is-hovered, &:hover {\n                    background-color: lighten(black, 7%);\n                    border-color: black !important;\n                }\n\n                &:not(.simple-dropdown).is-hovered, &:not(.simple-dropdown):hover {\n                    color: @destructiveColor;\n                }\n            }\n        }\n\n        .modal-card-foot {\n            border-color: black !important;\n            background: @darkBg;\n            color: @darkFg !important;\n\n            .leftmost {\n                input {\n                    background: @darkBgDarker;\n                    border-color: black;\n                }\n\n                button {\n                    border-color: black;\n                }\n\n                select {\n                    background: @darkBg;\n                    border-color: black;\n                    color: @darkFgDarker;\n                }\n            }\n\n            button {\n                background: transparent;\n                color: @darkFgDarker;\n\n                &:not(.is-destructive):not(.is-modifying):hover {\n                    color: @darkFg;\n                }\n            }\n        }\n    }\n}\n\n/****************************************************\n Footer\n ****************************************************/\n\n.infobar {\n    .noselect();\n\n    position: fixed;\n    left: 0px;\n    right: 0px;\n    top: calc(100vh - @infobarHeight);\n    bottom: 0px;\n    background: #F3F3F3;\n    padding: 7px;\n    padding-left: 68px;\n    color: #666;\n    font-size: 0.9em;\n    border-top: 1px solid #DDD;\n    z-index: 3000;\n\n    .graph-info {\n        .tag {\n            font-weight: 600;\n            font-size: 0.75rem;\n            //text-transform: uppercase;\n        }    \n\n        .breadcrumb {\n            font-size: inherit;\n            display: inline-block; \n            margin-left: 0.6em;\n        \n            a {\n                padding: 0 .5em;\n                color: #666;\n            }\n        \n            b {\n                font-weight: 600;\n                margin-right: 0.3rem;\n                font-size: small;\n                //font-variant: small-caps;\n            }\n\n            i {\n                //font-variant: all-small-caps;\n                font-style: normal;\n            }\n\n            li+li::before {\n                content: '\\205E';\n                color: @darkFgDarker;\n            }\n        \n            li.edged+li.edged::before {\n                content: '\\2192' !important;\n                color: @darkBgDarker;\n            }\n        }\n    }\n\n    .table-info {\n\n        .dt-buttons {\n            display: flex;\n            justify-content: center;\n\n            .dt-button {\n                border: 0;\n                font-size: 1.4rem;\n                cursor: pointer;\n                background: transparent;\n\n                &:hover {\n                    color: @grafitoPurple;\n                }\n            }\n        } \n    }\n}\n\n.dark .infobar {\n    color: @darkFgDarker;\n    background: @darkBgDarker;\n    border-color: black;\n\n    .graph-info {\n        .breadcrumb {\n            a {\n                color: @darkFgDarker;\n            }\n\n            li+li::before {\n                color: #666;\n            }\n\n            li.edged+li.edged::before {\n                color: @darkFg;\n            }\n        }\n    }\n\n    .table-info {\n        .dt-buttons {\n            .dt-button {\n                color: @darkFg;\n                &:hover {\n                    color: @darkGrafitoPurple;\n                }\n            }\n        }\n    }\n}"
  }
]