From 4683f8be229c36aad65847d890683e7ea4749fca Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 15 Nov 2017 08:03:44 -0800 Subject: [PATCH 01/63] Update BACKERS.md Need to investigate why backers aren't showing up correctly from OpenCollective... --- BACKERS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BACKERS.md b/BACKERS.md index 9042def241..01183beee8 100644 --- a/BACKERS.md +++ b/BACKERS.md @@ -30,4 +30,8 @@ Thanks you to all our backers for making Oni possible! ## Backers via OpenCollective +- @TalAmuyal + +## Backers via OpenCollective + From e8e40130c3d631447d32bf804e524f1eb821102b Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 15 Nov 2017 08:05:35 -0800 Subject: [PATCH 02/63] Update backer and sponsor links in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d68a1f418..67ec1c0f2d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### IDE powered by Neovim + React + Electron [![Build Status](https://travis-ci.org/onivim/oni.svg?branch=master)](https://travis-ci.org/onivim/oni) [![Build Status](https://ci.appveyor.com/api/projects/status/gum9hty9hm65o7ae/branch/master?svg=true)](https://ci.appveyor.com/project/onivim/oni/branch/master) -[![Join the chat at https://gitter.im/extr0py/Lobby](https://badges.gitter.im/onivim/Lobby.svg)](https://gitter.im/onivim/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Backers on Open Collective](https://opencollective.com/oni/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/oni/sponsors/badge.svg)](#sponsors) [![BountySource Active Bounties](https://api.bountysource.com/badge/tracker?tracker_id=48462304)](https://www.bountysource.com/teams/oni) +[![Join the chat at https://gitter.im/extr0py/Lobby](https://badges.gitter.im/onivim/Lobby.svg)](https://gitter.im/onivim/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Backers on Open Collective](https://opencollective.com/oni/backers/badge.svg)](https://opencollective.com/oni#backer) [![Sponsors on Open Collective](https://opencollective.com/oni/sponsors/badge.svg)](https://opencollective.com/oni#sponsor) [![BountySource Active Bounties](https://api.bountysource.com/badge/tracker?tracker_id=48462304)](https://www.bountysource.com/teams/oni) [![Total Downloads](https://img.shields.io/github/downloads/onivim/oni/total.svg)](https://github.com/onivim/oni/releases)

Supporting Oni

@@ -15,7 +15,7 @@ Oni is an MIT-licensed open source project. Please consider supporting Oni by:

Sponsors via OpenCollective

-Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/oni#sponsor)] +Support this project by [becoming a sponsor](https://opencollective.com/oni#sponsor). Your logo will show up here with a link to your website. From 8c2efb45a532ca680c1342382a2c4bbbad8a6917 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 15 Nov 2017 09:24:13 -0800 Subject: [PATCH 03/63] Add option to use named pipes as the transport for the msgpack-rpc API (#940) * Switch to socket transport * Start factoring out options * Add option for named-pipe transport * Fix lint issues --- browser/src/Editor/NeovimEditor.tsx | 10 ++++- .../Configuration/DefaultConfiguration.ts | 4 ++ .../Configuration/IConfigurationValues.ts | 4 ++ browser/src/neovim/NeovimInstance.ts | 15 ++----- browser/src/neovim/NeovimProcessSpawner.ts | 45 ++++++++++++++++++- 5 files changed, 62 insertions(+), 16 deletions(-) diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index a7cd4c254d..cd6d2ef1c2 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -14,7 +14,7 @@ import { Observable } from "rxjs/Observable" import { clipboard, ipcRenderer, remote } from "electron" -import { NeovimInstance, NeovimWindowManager } from "./../neovim" +import { INeovimStartOptions, NeovimInstance, NeovimWindowManager } from "./../neovim" import { CanvasRenderer, INeovimRenderer } from "./../Renderer" import { NeovimScreen } from "./../Screen" @@ -281,7 +281,13 @@ export class NeovimEditor implements IEditor { } public init(filesToOpen: string[]): void { - this._neovimInstance.start(filesToOpen, { runtimePaths: pluginManager.getAllRuntimePaths() }) + const startOptions: INeovimStartOptions = { + args: filesToOpen, + runtimePaths: pluginManager.getAllRuntimePaths(), + transport: configuration.getValue("experimental.neovim.transport"), + } + + this._neovimInstance.start(startOptions) .then(() => { this._hasLoaded = true VimConfigurationSynchronizer.synchronizeConfiguration(this._neovimInstance, this._config.getValues()) diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index d7a6421599..81a099b6d2 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -37,6 +37,10 @@ const BaseConfiguration: IConfigurationValues = { { "open": "(", "close": ")" }, ], + "experimental.neovim.transport": "stdio", + // TODO: Enable pipe transport for Windows + // "experimental.neovim.transport": Platform.isWindows() ? "pipe" : "stdio", + "oni.audio.bellUrl": null, "oni.useDefaultConfig": true, diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index 2d586d5784..b17699a257 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -30,6 +30,10 @@ export interface IConfigurationValues { "experimental.autoClosingPairs.enabled": boolean "experimental.autoClosingPairs.default": any + // The transport to use for Neovim + // Valid values are "stdio" and "pipe" + "experimental.neovim.transport": string + // Production settings // Bell sound effect to use diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 2aa2ad2e87..17dc7eb185 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -14,7 +14,7 @@ import { configuration } from "./../Services/Configuration" import { NeovimBufferReference } from "./MsgPack" import { INeovimAutoCommands, NeovimAutoCommands } from "./NeovimAutoCommands" -import { startNeovim } from "./NeovimProcessSpawner" +import { INeovimStartOptions, startNeovim } from "./NeovimProcessSpawner" import { IQuickFixList, QuickFixList } from "./QuickFix" import { Session } from "./Session" @@ -129,10 +129,6 @@ export interface INeovimInstance { openInitVim(): Promise } -export interface INeovimStartOptions { - runtimePaths?: string[] -} - /** * Integration with NeoVim API */ @@ -255,13 +251,8 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this.callFunction("OniGetContext", []) } - public start(filesToOpen?: string[], startOptions?: INeovimStartOptions): Promise { - filesToOpen = filesToOpen || [] - - startOptions = startOptions || { } - const runtimePaths = startOptions.runtimePaths || [] - - this._initPromise = Promise.resolve(startNeovim(runtimePaths, filesToOpen)) + public start(startOptions?: INeovimStartOptions): Promise { + this._initPromise = startNeovim(startOptions) .then((nv) => { Log.info("NeovimInstance: Neovim started") diff --git a/browser/src/neovim/NeovimProcessSpawner.ts b/browser/src/neovim/NeovimProcessSpawner.ts index 2dfe7eb08f..a07994b6f5 100644 --- a/browser/src/neovim/NeovimProcessSpawner.ts +++ b/browser/src/neovim/NeovimProcessSpawner.ts @@ -1,3 +1,5 @@ +import { ChildProcess } from "child_process" +import * as net from "net" import * as path from "path" import * as Platform from "./../Platform" @@ -6,6 +8,8 @@ import { configuration } from "./../Services/Configuration" import { Session } from "./Session" +import * as Log from "./../Log" + // Most of the paths coming in the packaged binary reference the `app.asar`, // but the binaries (Neovim) as well as the .vim files are unpacked, // so these need to be mapped to the `app.asar.unpacked` directory @@ -13,7 +17,43 @@ const remapPathToUnpackedAsar = (originalPath: string) => { return originalPath.split("app.asar").join("app.asar.unpacked") } -export const startNeovim = (runtimePaths: string[], args: string[]): Session => { +export type MsgPackTransport = "stdio" | "pipe" + +export interface INeovimStartOptions { + args: string[] + runtimePaths?: string[] + transport?: MsgPackTransport +} + +const DefaultStartOptions: INeovimStartOptions = { + args: [], + runtimePaths: [], + transport: "stdio", +} + +const getSessionFromProcess = async (neovimProcess: ChildProcess, transport: MsgPackTransport = "stdio"): Promise => { + + Log.info("Initializing neovim process using transport: " + transport) + + const stdioSession = new Session(neovimProcess.stdin, neovimProcess.stdout) + + if (transport === "stdio") { + return stdioSession + } + + const namedPipe = await stdioSession.request("nvim_eval", ["v:servername"]) + + const client = net.createConnection(namedPipe, () => { + Log.info("NeovimProcess - connected via named pipe: " + namedPipe) + }) + + return new Session(client, client) +} + +export const startNeovim = async (options: INeovimStartOptions = DefaultStartOptions): Promise => { + + const runtimePaths = options.runtimePaths || [] + const args = options.args || [] const noopInitVimPath = remapPathToUnpackedAsar(path.join(__dirname, "vim", "noop.vim")) @@ -55,5 +95,6 @@ export const startNeovim = (runtimePaths: string[], args: string[]): Session => console.log(`Starting Neovim - process: ${nvimProc.pid}`) // tslint:disable-line no-console - return new Session(nvimProc.stdin, nvimProc.stdout) + return getSessionFromProcess(nvimProc, options.transport) + } From 22f4f4cc9046b1b169e3e5f583d49e109a439a40 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 15 Nov 2017 12:26:08 -0800 Subject: [PATCH 04/63] Bump version in README from 0.2.16->0.217, and in package.json from 0.2.17 -> 0.2.18 --- README.md | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 67ec1c0f2d..f2ff6a6692 100644 --- a/README.md +++ b/README.md @@ -59,17 +59,17 @@ Oni is cross-platform and supports Windows, OS X, and Linux. ### Windows -- Download the [Oni installer](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-ia32-win.exe) for Windows +- Download the [Oni installer](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-ia32-win.exe) for Windows - Once it is downloaded, run the installer. This will only take a minute. - By default, Oni is installed under `C:\Program Files (x86)\Oni` for a 64-bit machine. -You can also find install via a [zip archive](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-ia32-win.zip) +You can also find install via a [zip archive](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-ia32-win.zip) > You may want to add Oni to your `%PATH%`, so that from the console, you can open Oni via `oni` ### Mac -- Download [Oni](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-osx.dmg) for Mac +- Download [Oni](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-osx.dmg) for Mac - Double-click on the archive to expand - Drag `Oni.app` to the `Applications` folder @@ -79,26 +79,26 @@ You can also find install via a [zip archive](https://github.com/onivim/oni/rele > If you do not have Neovim, follow the instructions to [Install Neovim](https://github.com/neovim/neovim/wiki/Installing-Neovim) and ensure the 'nvim' binary is available. Version `0.2.1` is required.. -- Download the [.deb package (64-bit)](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-amd64-linux.deb) +- Download the [.deb package (64-bit)](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-amd64-linux.deb) - Install the package with `sudo dpkg -i .deb` -A [tar.gz](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-linux.tar.gz) is also available. +A [tar.gz](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-linux.tar.gz) is also available. #### Red Hat based distributions (Fedora, CentOS) > If you do not have Neovim, follow the instructions to [Install Neovim](https://github.com/neovim/neovim/wiki/Installing-Neovim) and ensure the 'nvim' binary is available. Version `0.2.1` is required.. -- Download the [.rpm package](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-x86_64-linux.rpm) +- Download the [.rpm package](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-x86_64-linux.rpm) - Install the package with `sudo dnf install .rpm` -A [tar.gz](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-linux.tar.gz) is also available. +A [tar.gz](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-linux.tar.gz) is also available. #### Arch based distributions - Available via the [AUR](https://aur.archlinux.org/packages/oni/) - Install the package with `yaourt -S oni` -A [tar.gz](https://github.com/onivim/oni/releases/download/v0.2.16/Oni-0.2.16-linux.tar.gz) is also available. +A [tar.gz](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-linux.tar.gz) is also available. ## Goals diff --git a/package.json b/package.json index 0145b7714f..1fb65821c8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "author": "", "email": "bryphe@outlook.com", "homepage": "https://www.onivim.io", - "version": "0.2.17", + "version": "0.2.18", "description": "NeoVim front-end with IDE-style extensibility", "keywords": [ "vim", From 8ec57ebbf56ba48d105ab837dc0fddad1762cd25 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 15 Nov 2017 16:20:42 -0800 Subject: [PATCH 05/63] Investigate using `yarn` for more reliable installs on CI machines (#954) * Try using yarn for more reliably dependency installation * Bump react-redux types * Fix some compile issues due to different versions of typings * Fix lint issue * Add yarn cache for appveyor * Add yarn cache for travis --- .travis.yml | 6 +- appveyor.yml | 7 +- browser/src/Editor/KeyboardInput.tsx | 4 +- browser/src/Services/Menu/MenuComponent.tsx | 2 + package.json | 4 +- yarn.lock | 6537 +++++++++++++++++++ 6 files changed, 6551 insertions(+), 9 deletions(-) create mode 100644 yarn.lock diff --git a/.travis.yml b/.travis.yml index 987f1a640e..868df71b7d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,7 @@ branches: - /^release.*/ cache: - directories: - - node_modules + yarn: true matrix: include: @@ -33,7 +32,8 @@ addons: - bsdtar install: - - npm install + - npm install -g yarn + - yarn install script: - ./build/script/travis-build.sh diff --git a/appveyor.yml b/appveyor.yml index 15c279b63f..dd69523914 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,6 +9,9 @@ branches: - master - /^release.*/ +cache: + - "%LOCALAPPDATA%\\Yarn" + platform: - x86 - x64 @@ -18,11 +21,11 @@ install: # Get the latest stable version of Node.js or io.js - ps: Install-Product node $env:nodejs_version # Workaround https://github.com/npm/npm/issues/18380 - - npm install npm@5.3 -g + - npm install -g yarn - node --version - npm --version # install modules - - npm install + - yarn install artifacts: - path: dist/*.exe diff --git a/browser/src/Editor/KeyboardInput.tsx b/browser/src/Editor/KeyboardInput.tsx index 81b15c1512..a953c492c4 100644 --- a/browser/src/Editor/KeyboardInput.tsx +++ b/browser/src/Editor/KeyboardInput.tsx @@ -54,8 +54,8 @@ export interface IKeyboardInputProps { class KeyboardInputView extends React.PureComponent { private _keyboardElement: HTMLInputElement - constructor() { - super() + constructor(props: IKeyboardInputViewProps) { + super(props) this.state = { isComposing: false, diff --git a/browser/src/Services/Menu/MenuComponent.tsx b/browser/src/Services/Menu/MenuComponent.tsx index aed3062df9..7f265303f4 100644 --- a/browser/src/Services/Menu/MenuComponent.tsx +++ b/browser/src/Services/Menu/MenuComponent.tsx @@ -97,6 +97,7 @@ export class MenuView extends React.PureComponent { } const EmptyArray: any[] = [] +const noop = () => { } // tslint:disable-line const mapStateToProps = (state: State.IMenus) => { if (!state.menu) { @@ -107,6 +108,7 @@ const mapStateToProps = (state: State.IMenus=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archiver-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" + dependencies: + glob "^7.0.0" + graceful-fs "^4.1.0" + lazystream "^1.0.0" + lodash "^4.8.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +archiver@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + walkdir "^0.0.11" + zip-stream "^1.1.0" + +archiver@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.0.tgz#d2df2e8d5773a82c1dcce925ccc41450ea999afd" + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + zip-stream "^1.2.0" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asar-integrity@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.1.2.tgz#461248c63c24b13d4a11a70c378f8f59dba2b4af" + dependencies: + bluebird-lst "^1.0.2" + fs-extra-p "^4.4.0" + +asn1.js@^4.0.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + +async@2.6.0, async@^2.0.0, async@^2.1.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" + +autoprefixer@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.4.0.tgz#4db60af585a303616bb896b50b30bbdd5858d2e3" + dependencies: + browserslist "~1.3.5" + caniuse-db "^1.0.30000515" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.1.1" + postcss-value-parser "^3.2.3" + +autoprefixer@^6.0.0, autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.24.1, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helper-evaluate-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz#95d98c4ea36150483db2e7d3ec9e1954a72629cb" + +babel-helper-flip-expressions@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz#77f6652f9de9c42401d827bd46ebd2109e3ef18a" + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + +babel-helper-is-void-0@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz#72f21a3abba0bef3837f9174fca731aed9a02888" + +babel-helper-mark-eval-scopes@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz#4554345edf9f2549427bd2098e530253f8af2992" + +babel-helper-remove-or-void@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7" + +babel-helper-to-multiple-sequence-expressions@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz#5f1b832b39e4acf954e9137f0251395c71196b35" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-minify-builtins@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz#4f21a7dcb51f91a04ea71d47ff0e8e3b05fec021" + dependencies: + babel-helper-evaluate-path "^0.1.0" + +babel-plugin-minify-constant-folding@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz#57bd172adf8b8d74ad7c99612eb950414ebea3ca" + dependencies: + babel-helper-evaluate-path "^0.1.0" + +babel-plugin-minify-dead-code-elimination@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz#774f536f347b98393a27baa717872968813c342c" + dependencies: + babel-helper-mark-eval-scopes "^0.1.1" + babel-helper-remove-or-void "^0.1.1" + lodash.some "^4.6.0" + +babel-plugin-minify-flip-comparisons@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz#e286b40b7599b18dfea195071e4279465cfc1884" + dependencies: + babel-helper-is-void-0 "^0.1.1" + +babel-plugin-minify-guarded-expressions@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz#dfc3d473b0362d9605d3ce0ac1e22328c60d1007" + dependencies: + babel-helper-flip-expressions "^0.1.2" + +babel-plugin-minify-infinity@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz#5f1cf67ddedcba13c8a00da832542df0091a1cd4" + +babel-plugin-minify-mangle-names@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz#bfa24661a6794fb03833587e55828b65449e06fe" + dependencies: + babel-helper-mark-eval-scopes "^0.1.1" + +babel-plugin-minify-numeric-literals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz#d4b8b0c925f874714ee33ee4b26678583d7ce7fb" + +babel-plugin-minify-replace@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz#b90b9e71ab4d3b36325629a91beabe13b0b16ac1" + +babel-plugin-minify-simplify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz#a968f1658fdeb2fc759e81fe331d89829df0f6b9" + dependencies: + babel-helper-flip-expressions "^0.1.2" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.1.1" + +babel-plugin-minify-type-constructors@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz#db53c5b76cb8e2fcd45d862f17104c78761337ee" + dependencies: + babel-helper-is-void-0 "^0.1.1" + +babel-plugin-transform-inline-consecutive-adds@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz#5442e9f1c19c78a7899f8a4dee6fd481f61001f5" + +babel-plugin-transform-member-expression-literals@^6.8.4: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz#e06ae305cf48d819822e93a70d79269f04d89eec" + +babel-plugin-transform-merge-sibling-variables@^6.8.5: + version "6.8.6" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz#6d21efa5ee4981f71657fae716f9594bb2622aef" + +babel-plugin-transform-minify-booleans@^6.8.2: + version "6.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz#5906ed776d3718250519abf1bace44b0b613ddf9" + +babel-plugin-transform-property-literals@^6.8.4: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz#67ed5930b34805443452c8b9690c7ebe1e206c40" + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-regexp-constructors@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz#312ab7487cc88a1c62ee25ea1b6087e89b87799c" + +babel-plugin-transform-remove-console@^6.8.4: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz#fde9d2d3d725530b0fadd8d31078402410386810" + +babel-plugin-transform-remove-debugger@^6.8.4: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz#809584d412bf918f071fdf41e1fdb15ea89cdcd5" + +babel-plugin-transform-remove-undefined@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz#e1ebf51110f6b1e0665f28382ef73f95e5023652" + +babel-plugin-transform-simplify-comparison-operators@^6.8.4: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz#a838786baf40cc33a93b95ae09e05591227e43bf" + +babel-plugin-transform-undefined-to-void@^6.8.2: + version "6.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz#fc52707f6ee1ddc71bb91b0d314fbefdeef9beb4" + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-babili@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz#ad9d6651002f5bc3f07cab300781167f54724bf2" + dependencies: + babel-plugin-minify-builtins "^0.1.3" + babel-plugin-minify-constant-folding "^0.1.3" + babel-plugin-minify-dead-code-elimination "^0.1.7" + babel-plugin-minify-flip-comparisons "^0.1.2" + babel-plugin-minify-guarded-expressions "^0.1.2" + babel-plugin-minify-infinity "^0.1.2" + babel-plugin-minify-mangle-names "^0.1.3" + babel-plugin-minify-numeric-literals "^0.1.1" + babel-plugin-minify-replace "^0.1.2" + babel-plugin-minify-simplify "^0.1.2" + babel-plugin-minify-type-constructors "^0.1.2" + babel-plugin-transform-inline-consecutive-adds "^0.1.2" + babel-plugin-transform-member-expression-literals "^6.8.4" + babel-plugin-transform-merge-sibling-variables "^6.8.5" + babel-plugin-transform-minify-booleans "^6.8.2" + babel-plugin-transform-property-literals "^6.8.4" + babel-plugin-transform-regexp-constructors "^0.1.1" + babel-plugin-transform-remove-console "^6.8.4" + babel-plugin-transform-remove-debugger "^6.8.4" + babel-plugin-transform-remove-undefined "^0.1.2" + babel-plugin-transform-simplify-comparison-operators "^6.8.4" + babel-plugin-transform-undefined-to-void "^6.8.2" + lodash.isplainobject "^4.0.6" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-runtime@~6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babili-webpack-plugin@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babili-webpack-plugin/-/babili-webpack-plugin-0.1.2.tgz#164ac03d5932f6a52143e7ffc06f2711c651b6f2" + dependencies: + babel-core "^6.24.1" + babel-preset-babili "^0.1.4" + webpack-sources "^1.0.1" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +base64-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +binary-extensions@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + +bl@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + dependencies: + readable-stream "^2.0.5" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird-lst@^1.0.2, bluebird-lst@^1.0.3, bluebird-lst@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9" + dependencies: + bluebird "^3.5.1" + +bluebird@2.9.6: + version "2.9.6" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.9.6.tgz#1fc3a6b1685267dc121b5ec89b32ce069d81ab7d" + +bluebird@^3.5.0, bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +boxen@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.2.tgz#3f1d4032c30ffea9d4b02c322eaf2ea741dcbce5" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^1.0.0" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +browserslist@~1.3.5: + version "1.3.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.3.6.tgz#952ff48d56463d3b538f85ef2f8eaddfd284b133" + dependencies: + caniuse-db "^1.0.30000525" + +bs-platform@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/bs-platform/-/bs-platform-1.8.0.tgz#d376f5fa2ebfe04451930633f0733f82ea39fbde" + +buffer-crc32@^0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builder-util@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-1.0.1.tgz#e47e82be0ab3ae5ebff4bb361b91b94e49e27a8b" + dependencies: + "7zip-bin" "^2.2.3" + bluebird-lst "^1.0.3" + chalk "^2.1.0" + debug "^3.0.1" + electron-builder-http "~19.23.0" + fcopy-pre-bundled "0.3.4" + fs-extra-p "^4.4.0" + ini "^1.3.4" + is-ci "^1.0.10" + js-yaml "^3.9.1" + lazy-val "^1.0.2" + node-emoji "^1.8.1" + semver "^5.4.1" + source-map-support "^0.4.16" + stat-mode "^0.2.2" + temp-file "^2.0.2" + tunnel-agent "^0.6.0" + +builder-util@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-1.0.2.tgz#93a4aadd8adf67d663717629eb6cd4b0666bea32" + dependencies: + "7zip-bin" "^2.2.3" + bluebird-lst "^1.0.3" + chalk "^2.1.0" + debug "^3.0.1" + electron-builder-http "^19.27.4" + fcopy-pre-bundled "0.3.4" + fs-extra-p "^4.4.0" + ini "^1.3.4" + is-ci "^1.0.10" + js-yaml "^3.9.1" + lazy-val "^1.0.2" + node-emoji "^1.8.1" + semver "^5.4.1" + source-map-support "^0.4.16" + stat-mode "^0.2.2" + temp-file "^2.0.3" + tunnel-agent "^0.6.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000515, caniuse-db@^1.0.30000525, caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000764" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000764.tgz#d73ab11ae62f6a9e2f69867d6d9c23ae3f2e5d8d" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chain-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" + +chalk@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@^1.6.0, chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + +ci-info@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +clap@^1.0.9: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + dependencies: + chalk "^1.1.3" + +classnames@2.2.5, classnames@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.3.0, color-convert@^1.8.2, color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-convert@~0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" + +color-name@^1.0.0, color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color-string@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9" + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-2.0.0.tgz#e0c9972d1e969857004b101eaa55ceab5961d67d" + dependencies: + color-convert "^1.8.2" + color-string "^1.4.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@^1.1.2, colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + +compress-commons@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" + dependencies: + buffer-crc32 "^0.2.1" + crc32-stream "^2.0.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +compressible@~2.0.11: + version "2.0.12" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" + dependencies: + mime-db ">= 1.30.0 < 2" + +compression@^1.5.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + dependencies: + accepts "~1.3.4" + bytes "3.0.0" + compressible "~2.0.11" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +concat-stream@1.6.0, concat-stream@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concurrently@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.1.0.tgz#dc5ef0459090012604756668894c04b434ef90d1" + dependencies: + bluebird "2.9.6" + chalk "0.5.1" + commander "2.6.0" + lodash "^4.5.1" + moment "^2.11.2" + rx "2.3.24" + spawn-default-shell "^1.1.0" + tree-kill "^1.1.0" + +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type-parser@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +crc32-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" + dependencies: + crc "^3.4.4" + readable-stream "^2.0.0" + +crc@^3.4.4: + version "3.5.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-env@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-3.1.3.tgz#58cd8231808f50089708b091f7dd37275a8e8154" + dependencies: + cross-spawn "^3.0.1" + +cross-spawn@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-unzip@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css-language-server@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/css-language-server/-/css-language-server-0.0.2.tgz#9cce79c6e97a67b3442a46aaa45788bec9515ed3" + dependencies: + vscode-css-languageservice "^3.0.0" + vscode-languageserver "^3.5.0" + +css-loader@0.28.4: + version "0.28.4" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.4.tgz#6cf3579192ce355e8b38d5f42dd7a1f2ec898d0f" + dependencies: + babel-code-frame "^6.11.0" + css-selector-tokenizer "^0.7.0" + cssnano ">=2.6.1 <4" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + object-assign "^4.0.1" + postcss "^5.0.6" + postcss-modules-extract-imports "^1.0.0" + postcss-modules-local-by-default "^1.0.1" + postcss-modules-scope "^1.0.0" + postcss-modules-values "^1.1.0" + postcss-value-parser "^3.3.0" + source-list-map "^0.1.7" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + dependencies: + css "^2.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-value@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" + +css@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.3.0" + urix "^0.1.0" + +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + +"cssnano@>=2.6.1 <4": + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.5.1, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +deepmerge@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050" + +deepmerge@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1, depd@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + +dev-null@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +diff@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dmg-builder@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-1.0.1.tgz#8a5d319ce29b2de99ed2d687aee3cece2549f2cc" + dependencies: + bluebird-lst "^1.0.3" + builder-util "^1.0.0" + fs-extra-p "^4.4.0" + parse-color "^1.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + +dom-helpers@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +dotenv-expand@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.0.1.tgz#68fddc1561814e0a10964111057ff138ced7d7a8" + +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@^2.5.7, ejs@~2.5.6: + version "2.5.7" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" + +electron-builder-http@19.23.0, electron-builder-http@~19.23.0: + version "19.23.0" + resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-19.23.0.tgz#a7ec01bd1ca97b9e3a00d4799faa9ff1d52a4893" + dependencies: + bluebird-lst "^1.0.3" + debug "^3.0.0" + fs-extra-p "^4.4.0" + +electron-builder-http@^19.27.4: + version "19.27.5" + resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-19.27.5.tgz#800865df2e618ffab9e5b3b895c15b4ce7fd7f17" + dependencies: + bluebird-lst "^1.0.3" + debug "^3.0.1" + fs-extra-p "^4.4.0" + +electron-builder@19.26.0: + version "19.26.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.26.0.tgz#92a98aa915d91e75da6e32b0da8f4e58d0b03e70" + dependencies: + "7zip-bin" "^2.2.3" + ajv "^5.2.2" + ajv-keywords "^2.1.0" + asar-integrity "0.1.2" + bluebird-lst "^1.0.3" + builder-util "1.0.1" + chalk "^2.1.0" + chromium-pickle-js "^0.2.0" + cuint "^0.2.2" + debug "^3.0.1" + dmg-builder "1.0.1" + dotenv "^4.0.0" + dotenv-expand "^4.0.1" + ejs "^2.5.7" + electron-builder-http "19.23.0" + electron-download-tf "4.3.4" + electron-osx-sign "0.4.7" + electron-publish "19.25.0" + fs-extra-p "^4.4.0" + hosted-git-info "^2.5.0" + is-ci "^1.0.10" + isbinaryfile "^3.0.2" + js-yaml "^3.9.1" + lazy-val "^1.0.2" + minimatch "^3.0.4" + normalize-package-data "^2.4.0" + plist "^2.1.0" + read-config-file "^1.0.5" + sanitize-filename "^1.6.1" + semver "^5.4.1" + temp-file "^2.0.2" + update-notifier "^2.2.0" + uuid-1345 "^0.99.6" + yargs "^8.0.2" + +electron-chromedriver@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-1.6.0.tgz#6eabdaa5cf9c75e43501e2593b528e8cfd97d7c7" + dependencies: + electron-download "^3.1.0" + extract-zip "^1.6.0" + +electron-devtools-installer@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz#9813e6811afcd69ddca3cae5416db72ea7ecfb6a" + dependencies: + "7zip" "0.0.6" + cross-unzip "0.0.2" + rimraf "^2.5.2" + semver "^5.3.0" + +electron-download-tf@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/electron-download-tf/-/electron-download-tf-4.3.4.tgz#b03740b2885aa2ad3f8784fae74df427f66d5165" + dependencies: + debug "^3.0.0" + env-paths "^1.0.0" + fs-extra "^4.0.1" + minimist "^1.2.0" + nugget "^2.0.1" + path-exists "^3.0.0" + rc "^1.2.1" + semver "^5.4.1" + sumchecker "^2.0.2" + +electron-download@^3.0.1, electron-download@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" + dependencies: + debug "^2.2.0" + fs-extra "^0.30.0" + home-path "^1.0.1" + minimist "^1.2.0" + nugget "^2.0.0" + path-exists "^2.1.0" + rc "^1.1.2" + semver "^5.3.0" + sumchecker "^1.2.0" + +electron-osx-sign@0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.7.tgz#1d75647a82748eacd48bea70616ec83ffade3ee5" + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^2.1.0" + +electron-publish@19.25.0: + version "19.25.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.25.0.tgz#e8954fd64093ea9d8f287a0c34292d67de8f302e" + dependencies: + bluebird-lst "^1.0.3" + builder-util "^1.0.0" + chalk "^2.1.0" + electron-builder-http "~19.23.0" + fs-extra-p "^4.4.0" + mime "^1.3.6" + +electron-rebuild@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-1.6.0.tgz#e8d26f4d8e9fe5388df35864b3658e5cfd4dcb7e" + dependencies: + colors "^1.1.2" + debug "^2.6.3" + fs-extra "^3.0.1" + node-abi "^2.0.0" + node-gyp "^3.6.0" + ora "^1.2.0" + rimraf "^2.6.1" + spawn-rx "^2.0.10" + yargs "^7.0.2" + +electron-to-chromium@^1.2.7: + version "1.3.27" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" + +electron@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.1.tgz#19b6f39f2013e204a91a60bc3086dc7a4a07ed88" + dependencies: + "@types/node" "^8.0.24" + electron-download "^3.0.1" + extract-zip "^1.0.3" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + dependencies: + once "^1.4.0" + +enhanced-resolve@^3.0.0, enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +env-paths@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" + +errno@^0.1.1, errno@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.35" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f" + dependencies: + es6-iterator "~2.0.1" + es6-symbol "~3.1.1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@^4.0.5: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estree-walker@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-kit@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/event-kit/-/event-kit-2.4.0.tgz#718aaf22df76670024ad66922483e1bba0544f33" + +event-lite@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.1.tgz#47cf08a8d37d0b694cdb7b3b17b51faac6576086" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express@^4.13.3: + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + dependencies: + accepts "~1.3.4" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.2" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.1, external-editor@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-zip@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.0.tgz#7f400c9607ea866ecab7aa6d54fb978eeb11621a" + dependencies: + concat-stream "1.5.0" + debug "0.7.4" + mkdirp "0.5.0" + yauzl "2.4.1" + +extract-zip@^1.0.3, extract-zip@^1.6.0: + version "1.6.6" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" + dependencies: + concat-stream "1.6.0" + debug "2.6.9" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +fcopy-pre-bundled@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/fcopy-pre-bundled/-/fcopy-pre-bundled-0.3.4.tgz#7ff1a1c339e877baa86b0856bebb33621cd5620b" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-up@2.1.0, find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +fs-extra-p@^4.4.0, fs-extra-p@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.4.tgz#396ad6f914eb2954e1700fd0e18288301ed45f04" + dependencies: + bluebird-lst "^1.0.4" + fs-extra "^4.0.2" + +fs-extra@4.0.2, fs-extra@^4.0.1, fs-extra@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +fuse.js@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-2.6.2.tgz#d5d994fda96f543b5a51df38b72cec9cc60d9dea" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +github-releases@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/github-releases/-/github-releases-0.4.1.tgz#4a13bdf85c4161344271db3d81db08e7379102ff" + dependencies: + minimatch "3.0.4" + optimist "0.6.1" + prettyjson "1.2.1" + request "2.81.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" + dependencies: + ini "^1.3.4" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" + dependencies: + glob "~7.1.1" + lodash "~4.17.4" + minimatch "~3.0.2" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +hoist-non-react-statics@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +home-path@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" + +hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +html-encoding-sniffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + +http-errors@1.6.2, http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-parser-js@>=0.4.0: + version "0.4.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + +http-proxy-middleware@~0.17.4: + version "0.17.4" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + +http-proxy@^1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4, ieee754@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +innosetup-compiler@5.5.9: + version "5.5.9" + resolved "https://registry.yarnpkg.com/innosetup-compiler/-/innosetup-compiler-5.5.9.tgz#fff561a1bb49ce5d3b133ee8b788b5a868f5ee21" + +inquirer@3.0.6, inquirer@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +int64-buffer@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.9.tgz#9e039da043b24f78b196b283e04653ef5e990f61" + +internal-ip@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + +interpret@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" + +invariant@^2.0.0, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-arrayish@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.1.tgz#c2dfc386abaa0c3e33c48db3fe87059e69065efd" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +js-base64@^2.1.9: + version "2.3.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.10.0, js-yaml@^3.9.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" + +jsdom@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.0.0.tgz#1ee507cb2c0b16c875002476b1a8557d951353e5" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^3.0.2" + pn "^1.0.0" + request "^2.79.0" + request-promise-native "^1.0.3" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2, json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +keyboard-layout@2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/keyboard-layout/-/keyboard-layout-2.0.13.tgz#5b4f5c25835e5d221a7b9da897663100d897487d" + dependencies: + event-kit "^2.0.0" + nan "^2.0.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-val@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.2.tgz#d9b07fb1fce54cbc99b3c611de431b83249369b6" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +less-loader@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.0.5.tgz#ae155a7406cac6acd293d785587fcff0f478c4dd" + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^2.3.0" + +less-plugin-autoprefix@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/less-plugin-autoprefix/-/less-plugin-autoprefix-1.5.1.tgz#bca4e5b2e48cac6965a1783142e3b32c3c00ce07" + dependencies: + autoprefixer "^6.0.0" + postcss "^5.0.0" + +less@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/less/-/less-2.7.1.tgz#6cbfea22b3b830304e9a5fb371d54fa480c9d7cf" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.2.11" + mkdirp "^0.5.0" + promise "^7.1.1" + source-map "^0.5.3" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash-es@^4.2.0, lodash-es@^4.2.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + +lodash.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash@4.17.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.0.tgz#93f4466e5ab73e5a1f1216c34eea11535f0a8df5" + +lodash@4.17.4, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.8.0, lodash@~4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +loglevel@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.0.tgz#ae0caa561111498c5ba13723d6fb631d24003934" + +lokijs@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.1.tgz#7e1b20217142ec2a68ecc5476cbb6c80fc3ffa56" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +macaddress@^0.2.7, macaddress@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + +magic-string@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" + dependencies: + vlq "^0.2.1" + +make-dir@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + dependencies: + pify "^3.0.0" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.1.0, meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.30.0 < 2": + version "1.31.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mime@1.4.1, mime@^1.2.11, mime@^1.3.4, mime@^1.3.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.1.2.tgz#51f93b432bf7e1b175ffc22883ccd0be32dba6b5" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +moment@^2.11.2: + version "2.19.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.2.tgz#8a7f774c95a64550b4c7ebd496683908f9419dbe" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +msgpack-lite@0.1.26: + version "0.1.26" + resolved "https://registry.yarnpkg.com/msgpack-lite/-/msgpack-lite-0.1.26.tgz#dd3c50b26f059f25e7edee3644418358e2a9ad89" + dependencies: + event-lite "^0.1.1" + ieee754 "^1.1.8" + int64-buffer "^0.1.9" + isarray "^1.0.0" + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" + dependencies: + dns-packet "^1.0.1" + thunky "^0.1.0" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.0.0, nan@^2.3.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-abi@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.2.tgz#4da6caceb6685fcd31e7dd1994ef6bb7d0a9c0b2" + dependencies: + semver "^5.4.1" + +node-emoji@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" + dependencies: + lodash.toarray "^4.4.0" + +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@0.6.33: + version "0.6.33" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" + +node-gyp@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-install-package@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nugget@^2.0.0, nugget@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" + dependencies: + debug "^2.1.3" + minimist "^1.1.0" + pretty-bytes "^1.0.2" + progress-stream "^1.1.0" + request "^2.45.0" + single-line-log "^1.1.2" + throttleit "0.0.2" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + +ocaml-language-server@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/ocaml-language-server/-/ocaml-language-server-1.0.12.tgz#5af38c8f6355b7074006586627472122ac24fd2e" + dependencies: + async "2.6.0" + glob "7.1.2" + lodash "4.17.4" + lokijs "1.5.1" + pegjs "0.10.0" + vscode-jsonrpc "3.5.0" + vscode-languageclient "3.5.0" + vscode-languageserver "3.5.0" + vscode-languageserver-types "3.5.0" + vscode-uri "1.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +oni-neovim-binaries@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/oni-neovim-binaries/-/oni-neovim-binaries-0.0.7.tgz#a6a23a4dbdf4300c86961e1e270beb051d6e5596" + dependencies: + oni-release-downloader "^0.0.5" + +oni-release-downloader@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/oni-release-downloader/-/oni-release-downloader-0.0.5.tgz#fb91ad3b5649f388c475baf4397bfda7ccf92500" + +oni-release-downloader@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/oni-release-downloader/-/oni-release-downloader-0.0.7.tgz#3852036c539489e1d89fbe5cbb2af7f1339c25bc" + +oni-ripgrep@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/oni-ripgrep/-/oni-ripgrep-0.0.3.tgz#fce3ae21f41b587e09827cb3c6e4dce91928c6a7" + +opencollective@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +optimist@0.6.1, optimist@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimize-js-plugin@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/optimize-js-plugin/-/optimize-js-plugin-0.0.4.tgz#69e7a67e0f66c69f7fc0c7b25c5d33b2db6c2817" + dependencies: + optimize-js "^1.0.0" + webpack-sources "^0.1.2" + +optimize-js@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/optimize-js/-/optimize-js-1.0.3.tgz#4326af8657c4a5ff32daf726631754f72ab7fdbc" + dependencies: + acorn "^3.3.0" + concat-stream "^1.5.1" + estree-walker "^0.3.0" + magic-string "^0.16.0" + yargs "^4.8.1" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +ora@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a" + dependencies: + chalk "^1.1.1" + cli-cursor "^2.1.0" + cli-spinners "^1.0.0" + log-symbols "^1.0.2" + +original@>=0.0.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-color@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" + dependencies: + color-convert "~0.5.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + dependencies: + "@types/node" "*" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^2.0.0, path-exists@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pegjs@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +plist@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025" + dependencies: + base64-js "1.2.0" + xmlbuilder "8.2.2" + xmldom "0.1.x" + +pn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.0.0.tgz#1cf5a30b0d806cd18f88fc41a6b5d4ad615b3ba9" + +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + dependencies: + postcss "^5.0.4" + uniqid "^4.0.0" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-modules-extract-imports@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.0, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.1.1, postcss@^5.2.16: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885" + dependencies: + chalk "^2.3.0" + source-map "^0.6.1" + supports-color "^4.4.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-bytes@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" + dependencies: + get-stdin "^4.0.1" + meow "^3.1.0" + +prettyjson@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + dependencies: + colors "^1.1.2" + minimist "^1.2.0" + +private@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress-stream@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" + dependencies: + speedometer "~0.1.2" + through2 "~0.2.3" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.5.2" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@^1.1.2, q@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + +qs@6.5.1, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + +querystringify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" + +raf@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + dependencies: + performance-now "^2.1.0" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7, rc@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.0.0.tgz#9cc3079c3dcd70d4c6e01b84aab2a7e34c303f58" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +react-hot-api@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/react-hot-api/-/react-hot-api-0.4.7.tgz#a7e22a56d252e11abd9366b61264cf4492c58171" + +react-hot-loader@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-1.3.1.tgz#c95647ae78b73dfceff6ec71ffcb04182ff6daf9" + dependencies: + react-hot-api "^0.4.5" + source-map "^0.4.4" + +react-motion@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316" + dependencies: + performance-now "^0.2.0" + prop-types "^15.5.8" + raf "^3.1.0" + +react-redux@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.6.tgz#23ed3a4f986359d68b5212eaaa681e60d6574946" + dependencies: + hoist-non-react-statics "^2.2.1" + invariant "^2.0.0" + lodash "^4.2.0" + lodash-es "^4.2.0" + loose-envify "^1.1.0" + prop-types "^15.5.10" + +react-transition-group@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.1.tgz#e9fb677b79e6455fd391b03823afe84849df4a10" + dependencies: + chain-function "^1.0.0" + classnames "^2.2.5" + dom-helpers "^3.2.0" + loose-envify "^1.3.1" + prop-types "^15.5.8" + warning "^3.0.0" + +react@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.0.0.tgz#ce7df8f1941b036f02b2cca9dbd0cb1f0e855e2d" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +read-config-file@^1.0.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-1.2.0.tgz#1fd7dc8ccdad838cac9f686182625290fc94f456" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + bluebird-lst "^1.0.4" + dotenv "^4.0.0" + dotenv-expand "^4.0.1" + fs-extra-p "^4.4.4" + js-yaml "^3.10.0" + json5 "^0.5.1" + lazy-val "^1.0.2" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9, readable-stream@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +redux-thunk@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" + +redux@3.7.2, redux@^3.6.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2, request@^2.45.0, request@^2.65.0, request@^2.79.0, request@~2.83.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.81.0, request@~2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +reselect@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + +resolve-url@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6, resolve@^1.3.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rgb2hex@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.0.tgz#ccd55f860ae0c5c4ea37504b958e442d8d12325b" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rx@2.3.24: + version "2.3.24" + resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +rxjs@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.0.tgz#26d8f3866eb700e247e0728a147c3d628993d812" + dependencies: + symbol-observable "^1.0.1" + +rxjs@^5.1.1: + version "5.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3" + dependencies: + symbol-observable "^1.0.1" + +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +samsam@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + +sanitize-filename@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@^1.2.1, sax@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" + dependencies: + node-forge "0.6.33" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + dependencies: + debug "2.6.9" + depd "~1.1.1" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.9" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@0.7.7: + version "0.7.7" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + dependencies: + is-arrayish "^0.3.1" + +single-line-log@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + dependencies: + string-width "^1.0.1" + +sinon@1.17.6: + version "1.17.6" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +sockjs-client@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.18: + version "0.3.18" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" + dependencies: + faye-websocket "^0.10.0" + uuid "^2.0.2" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^0.1.7, source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" + dependencies: + atob "~1.1.0" + resolve-url "~0.2.1" + source-map-url "~0.3.0" + urix "~0.1.0" + +source-map-support@^0.4.15, source-map-support@^0.4.16: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + +source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3, source-map@~0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spawn-default-shell@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/spawn-default-shell/-/spawn-default-shell-1.1.0.tgz#095439d44c4b7c0aff56a53929fbaab87878e7c6" + +spawn-rx@^2.0.10: + version "2.0.12" + resolved "https://registry.yarnpkg.com/spawn-rx/-/spawn-rx-2.0.12.tgz#b6285294499426089beea0c3c1ec32d7fc57a376" + dependencies: + debug "^2.5.1" + lodash.assign "^4.2.0" + rxjs "^5.1.1" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +spdy-transport@^2.0.18: + version "2.0.20" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +spectron@3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/spectron/-/spectron-3.6.2.tgz#e7583cee7e78d72ded0195943ff2834e23cd9e0a" + dependencies: + dev-null "^0.1.1" + electron-chromedriver "~1.6.0" + request "^2.65.0" + split "^1.0.0" + webdriverio "^4.0.4" + +speedometer@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stat-mode@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.2.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.3.0" + +sudo-prompt@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-7.1.1.tgz#3e1e025920b085dfc0d072193cca2867fa9c51b2" + +sumchecker@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" + dependencies: + debug "^2.2.0" + es6-promise "^4.0.5" + +sumchecker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" + dependencies: + debug "^2.2.0" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.1, supports-color@^3.2.3, supports-color@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +supports-color@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.0.0.tgz#1db26229f6ae02f9acdb5410907c36ce2e362b13" + dependencies: + has-flag "^2.0.0" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +symbol-observable@^1.0.1, symbol-observable@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar-stream@^1.5.0: + version "1.5.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar@^2.0.0, tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp-file@^2.0.2, temp-file@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.0.3.tgz#0de2540629fc77a6406ca56f50214d1f224947ac" + dependencies: + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.3" + fs-extra-p "^4.4.0" + lazy-val "^1.0.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +throttleit@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" + +through2@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" + dependencies: + readable-stream "~1.1.9" + xtend "~2.1.1" + +through@2, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +thunky@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" + +time-stamp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +timers-browserify@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" + dependencies: + setimmediate "^1.0.4" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +tree-kill@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + dependencies: + utf8-byte-length "^1.0.1" + +ts-loader@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.3.2.tgz#b71b9f0d0062c791a654d462140718f9f7817665" + dependencies: + chalk "^2.0.1" + enhanced-resolve "^3.0.0" + loader-utils "^1.0.2" + semver "^5.0.1" + +tslib@^1.7.1: + version "1.8.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6" + +tslint@5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.7.0.tgz#c25e0d0c92fa1201c2bc30e844e08e682b4f3552" + dependencies: + babel-code-frame "^6.22.0" + colors "^1.1.2" + commander "^2.9.0" + diff "^3.2.0" + glob "^7.1.1" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.7.1" + tsutils "^2.8.1" + +tsutils@^2.8.1: + version "2.12.2" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.12.2.tgz#ad58a4865d17ec3ddb6631b6ca53be14a5656ff3" + dependencies: + tslib "^1.7.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" + +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + +uglify-js@^2.8.29: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqid@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" + dependencies: + macaddress "^0.2.8" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +update-notifier@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +urix@^0.1.0, urix@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url-parse@^1.1.8: + version "1.2.0" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" + dependencies: + querystringify "~1.0.0" + requires-port "~1.0.0" + +url@^0.11.0, url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, "util@>=0.10.3 <1", util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid-1345@^0.99.6: + version "0.99.6" + resolved "https://registry.yarnpkg.com/uuid-1345/-/uuid-1345-0.99.6.tgz#b1270ae015a7721c7adec6c46ec169c6098aed40" + dependencies: + macaddress "^0.2.7" + +uuid@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +validator@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-7.0.0.tgz#c74deb8063512fac35547938e6f0b1504a282fd2" + +validator@~9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.1.1.tgz#3bdd1065cbd28f9d96ac806dee01030d32fd97ef" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +vendors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vlq@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +vscode-css-languageservice@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.1.tgz#2fb8f33d959d289289154142e8c22ad501a0139b" + dependencies: + vscode-languageserver-types "3.5.0" + vscode-nls "^2.0.1" + +vscode-jsonrpc@3.5.0, vscode-jsonrpc@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa" + +vscode-languageclient@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.0.tgz#36d02cc186a8365a4467719a290fb200a9ae490a" + dependencies: + vscode-languageserver-protocol "^3.5.0" + +vscode-languageserver-protocol@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.0.tgz#067c5cbe27709795398d119692c97ebba1452209" + dependencies: + vscode-jsonrpc "^3.5.0" + vscode-languageserver-types "^3.5.0" + +vscode-languageserver-types@3.5.0, vscode-languageserver-types@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374" + +vscode-languageserver@3.5.0, vscode-languageserver@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-3.5.0.tgz#d28099bc6ddda8c1dd16b707e454e1b1ddae0dba" + dependencies: + vscode-languageserver-protocol "^3.5.0" + vscode-uri "^1.0.1" + +vscode-nls@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-2.0.2.tgz#808522380844b8ad153499af5c3b03921aea02da" + +vscode-uri@1.0.1, vscode-uri@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.1.tgz#11a86befeac3c4aa3ec08623651a3c81a6d0bbc8" + +walkdir@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + dependencies: + async "^2.1.2" + chokidar "^1.7.0" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + +wdio-dot-reporter@~0.0.8: + version "0.0.9" + resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz#929b2adafd49d6b0534fda068e87319b47e38fe5" + +webdriverio@4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.8.0.tgz#d52929b749080f89967f6e1614051cbc8172d132" + dependencies: + archiver "~1.3.0" + babel-runtime "~6.23.0" + css-parse "~2.0.0" + css-value "~0.0.1" + deepmerge "~1.3.2" + ejs "~2.5.6" + gaze "~1.1.2" + glob "~7.1.1" + inquirer "~3.0.6" + json-stringify-safe "~5.0.1" + mkdirp "~0.5.1" + npm-install-package "~2.1.0" + optimist "~0.6.1" + q "~1.5.0" + request "~2.81.0" + rgb2hex "~0.1.0" + safe-buffer "~5.0.1" + supports-color "~3.2.3" + url "~0.11.0" + validator "~7.0.0" + wdio-dot-reporter "~0.0.8" + wgxpath "~1.0.0" + +webdriverio@^4.0.4: + version "4.9.8" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.9.8.tgz#907180e715d3b9e16cabe20bad59854bec1e44fa" + dependencies: + archiver "~2.1.0" + babel-runtime "^6.26.0" + css-parse "~2.0.0" + css-value "~0.0.1" + deepmerge "~2.0.1" + ejs "~2.5.6" + gaze "~1.1.2" + glob "~7.1.1" + inquirer "~3.3.0" + json-stringify-safe "~5.0.1" + mkdirp "~0.5.1" + npm-install-package "~2.1.0" + optimist "~0.6.1" + q "~1.5.0" + request "~2.83.0" + rgb2hex "~0.1.0" + safe-buffer "~5.1.1" + supports-color "~5.0.0" + url "~0.11.0" + validator "~9.1.1" + wdio-dot-reporter "~0.0.8" + wgxpath "~1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +webpack-dev-middleware@^1.11.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + time-stamp "^2.0.0" + +webpack-dev-server@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.7.1.tgz#21580f5a08cd065c71144cf6f61c345bca59a8b8" + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^1.6.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + del "^3.0.0" + express "^4.13.3" + html-entities "^1.2.0" + http-proxy-middleware "~0.17.4" + internal-ip "^1.2.0" + ip "^1.1.5" + loglevel "^1.4.1" + opn "4.0.2" + portfinder "^1.0.9" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.18" + sockjs-client "1.1.4" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^3.1.1" + webpack-dev-middleware "^1.11.0" + yargs "^6.0.0" + +webpack-sources@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" + dependencies: + source-list-map "~0.1.7" + source-map "~0.5.3" + +webpack-sources@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.2.tgz#d0148ec083b3b5ccef1035a6b3ec16442983b27a" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.5.3.tgz#e68653963bda146e212832c04a4d8041d2b4b8c8" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^5.1.5" + ajv-keywords "^2.0.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + +wgxpath@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" + +whatwg-encoding@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xmlbuilder@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" + +xmldom@0.1.x: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + +xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + +yargs@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +zip-stream@^1.1.0, zip-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" + dependencies: + archiver-utils "^1.3.0" + compress-commons "^1.2.0" + lodash "^4.8.0" + readable-stream "^2.0.0" From 651bd399b8d3d544cf78860ecaf2fda3ffb67bb2 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 15 Nov 2017 17:45:35 -0800 Subject: [PATCH 06/63] Add setValues API, so that automation can set the recording path (#952) --- .../Services/Configuration/Configuration.ts | 20 ++++++++++++++++--- definitions/Oni.d.ts | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/browser/src/Services/Configuration/Configuration.ts b/browser/src/Services/Configuration/Configuration.ts index 129efe0bfb..6502314bfd 100644 --- a/browser/src/Services/Configuration/Configuration.ts +++ b/browser/src/Services/Configuration/Configuration.ts @@ -20,6 +20,8 @@ export class Configuration implements Oni.Configuration { private _oniApi: Oni.Plugin.Api = null private _config: IConfigurationValues = null + private _setValues: { [configValue: string]: any } = { } + public get userJsConfig(): string { return path.join(this.getUserFolder(), "config.js") } @@ -60,6 +62,18 @@ export class Configuration implements Oni.Configuration { return !!this.getValue(configValue) } + public setValues(configValues: { [configValue: string]: any }): void { + + this._setValues = configValues + + this._config = { + ...this._config, + ...configValues, + } + + this._onConfigurationChangedEvent.dispatch(configValues) + } + public getValue(configValue: K, defaultValue?: any) { if (typeof this._config[configValue] === "undefined") { return defaultValue @@ -90,15 +104,15 @@ export class Configuration implements Oni.Configuration { this._activateIfOniObjectIsAvailable() } - private applyConfig(): void { + private applyConfig(shouldReactivate: boolean = true): void { const previousConfig = this._config const userRuntimeConfigOrError = this.getUserRuntimeConfig() if (isError(userRuntimeConfigOrError)) { Log.error(userRuntimeConfigOrError) - this._config = { ...DefaultConfiguration } + this._config = { ...DefaultConfiguration, ...this._setValues } } else { - this._config = { ...DefaultConfiguration, ...userRuntimeConfigOrError} + this._config = { ...DefaultConfiguration, ...this._setValues, ...userRuntimeConfigOrError} } this._deactivate() diff --git a/definitions/Oni.d.ts b/definitions/Oni.d.ts index 032b139e04..35dc16b9bb 100644 --- a/definitions/Oni.d.ts +++ b/definitions/Oni.d.ts @@ -31,6 +31,7 @@ declare namespace Oni { export interface Configuration { onConfigurationChanged: Event getValue(configValue: string, defaultValue?: T): T + setValues(configurationValues: { [configValue: string]: any }): void } export interface Workspace { From 5f6237996558c68ea631a813e6f3b35d72ddfbda Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 16 Nov 2017 07:08:45 -0800 Subject: [PATCH 07/63] Fix default configuration for css-language-server to pick up .scss files (#960) --- browser/src/Services/Configuration/DefaultConfiguration.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index 81a099b6d2..53d11c2d36 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -101,8 +101,8 @@ const BaseConfiguration: IConfigurationValues = { "language.less.languageServer.command": cssLanguageServerPath, "language.less.languageServer.arguments": ["--stdio"], - "language.sass.languageServer.command": cssLanguageServerPath, - "language.sass.languageServer.arguments": ["--stdio"], + "language.scss.languageServer.command": cssLanguageServerPath, + "language.scss.languageServer.arguments": ["--stdio"], "language.reason.languageServer.command": ocamlLanguageServerPath, "language.reason.languageServer.arguments": ["--stdio"], From 26e6c00590ed701b01f65f031404080f42085d0a Mon Sep 17 00:00:00 2001 From: Akin Date: Thu, 16 Nov 2017 21:12:04 +0000 Subject: [PATCH 08/63] Add minimise keybinding to default key bindings (#964) --- browser/src/Input/KeyBindings.ts | 1 + browser/src/Services/Commands.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/browser/src/Input/KeyBindings.ts b/browser/src/Input/KeyBindings.ts index 0182d09ebb..c63ddab5dc 100644 --- a/browser/src/Input/KeyBindings.ts +++ b/browser/src/Input/KeyBindings.ts @@ -25,6 +25,7 @@ export const applyDefaultKeyBindings = (oni: Oni.Plugin.Api, config: Configurati input.bind("", "language.codeAction.expand") input.bind("", "language.symbols.workspace", () => !menu.isMenuOpen()) input.bind("", "language.symbols.document") + input.bind("", "oni.editor.minimize") if (config.getValue("editor.clipboard.enabled")) { input.bind("", "editor.clipboard.yank", isVisualMode) diff --git a/browser/src/Services/Commands.ts b/browser/src/Services/Commands.ts index 9718289d6f..566f9658f0 100644 --- a/browser/src/Services/Commands.ts +++ b/browser/src/Services/Commands.ts @@ -47,6 +47,8 @@ export const registerBuiltInCommands = (commandManager: CommandManager, neovimIn new CallbackCommand("oni.editor.maximize", "Maximize Window", "Maximize the current window", () => remote.getCurrentWindow().maximize()), + new CallbackCommand("oni.editor.minimize", "Minimize Window", "Minimize the current window", () => remote.getCurrentWindow().minimize()), + // Language service // TODO: Deprecate new CallbackCommand("oni.editor.gotoDefinition", null, null, () => gotoDefinitionUnderCursor()), From d2a84fc666d222c10afecdf228b172a53a1d971f Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 16 Nov 2017 16:26:14 -0800 Subject: [PATCH 09/63] Remove results-caching logic (#965) --- browser/src/Services/Menu/MenuReducer.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/browser/src/Services/Menu/MenuReducer.ts b/browser/src/Services/Menu/MenuReducer.ts index 4094f7599c..2d39eb9c81 100644 --- a/browser/src/Services/Menu/MenuReducer.ts +++ b/browser/src/Services/Menu/MenuReducer.ts @@ -96,10 +96,8 @@ export function createReducer(filterFunc: MenuFilterFunc if (!s) { return s } - // If we already had search results, and this search is a superset of the previous, - // just filter the already-pruned subset - const optionsToSearch = a.payload.filter.indexOf(s.filter) === 0 ? s.filteredOptions : s.options - const filteredOptionsSorted = filterFunc(optionsToSearch, a.payload.filter) + + const filteredOptionsSorted = filterFunc(s.options, a.payload.filter) return {...s, filter: a.payload.filter, From 374c476d90c68b6e3aa9b398aa90fa9da005ec4f Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 16 Nov 2017 16:27:00 -0800 Subject: [PATCH 10/63] Handle 'scoping' of language servers, so that sub-filetype selectors get mapped to the root (#966) --- browser/src/Services/Language/LanguageManager.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/browser/src/Services/Language/LanguageManager.ts b/browser/src/Services/Language/LanguageManager.ts index 1184cf9fd2..77ba5f00c9 100644 --- a/browser/src/Services/Language/LanguageManager.ts +++ b/browser/src/Services/Language/LanguageManager.ts @@ -254,7 +254,15 @@ export class LanguageManager { } private _getLanguageClient(language: string): ILanguageClient { - return this._languageServerInfo[language] + if (!language) { + return null + } + + // Fix for #882 - handle cases like `javascript.jsx` where there is + // some scoping to the filetype / language name + const normalizedLanguage = language.split(".")[0] + + return this._languageServerInfo[normalizedLanguage] } private _setStatus(protocolMessage: string, status: LanguageClientState): void { From c66972e55bea36afe1b07613a47b73ba0cd15f38 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 16 Nov 2017 18:55:42 -0800 Subject: [PATCH 11/63] If no language server is available, set status to 'not available' (#967) --- .../src/Services/Language/LanguageManager.ts | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/browser/src/Services/Language/LanguageManager.ts b/browser/src/Services/Language/LanguageManager.ts index 77ba5f00c9..72ff38e2e6 100644 --- a/browser/src/Services/Language/LanguageManager.ts +++ b/browser/src/Services/Language/LanguageManager.ts @@ -37,7 +37,7 @@ export interface ILanguageServerNotificationResponse { export class LanguageManager { private _languageServerInfo: { [language: string]: ILanguageClient } = {} - private _notificationSubscriptions: { [notificationMessage: string]: Event } = {} + private _notificationSubscriptions: { [notificationMessage: string]: Event } = {} private _requestHandlers: { [request: string]: LanguageClientTypes.RequestHandler } = {} private _statusBar = new LanguageClientStatusBar() @@ -47,9 +47,12 @@ export class LanguageManager { if (language) { this._statusBar.show(language) - this._statusBar.setStatus(LanguageClientState.Initializing) - } else { - this._statusBar.hide() + + if (this._hasLanguageClient(language)) { + this._statusBar.setStatus(LanguageClientState.Initializing) + } else { + this._statusBar.setStatus(LanguageClientState.NotAvailable) + } } return this.sendLanguageServerNotification(language, filePath, "textDocument/didOpen", async () => { @@ -82,7 +85,7 @@ export class LanguageManager { textDocument, contentChanges: change.contentChanges, } - // Otherwise, get the whole buffer and send it up + // Otherwise, get the whole buffer and send it up } else { const allBufferLines = await change.buffer.getLines() @@ -97,7 +100,7 @@ export class LanguageManager { }) editorManager.allEditors.onBufferSaved.subscribe((bufferInfo: Oni.EditorBufferEventArgs) => { - const { language, filePath} = bufferInfo + const { language, filePath } = bufferInfo return this.sendLanguageServerNotification(language, filePath, "textDocument/didSave", Helpers.pathToTextDocumentIdentifierParms(filePath)) }) @@ -179,15 +182,15 @@ export class LanguageManager { if (languageClient) { try { - const result = await languageClient.sendRequest(filePath, protocolMessage, protocolPayload) - this._setStatus(protocolMessage, LanguageClientState.Active) - return result + const result = await languageClient.sendRequest(filePath, protocolMessage, protocolPayload) + this._setStatus(protocolMessage, LanguageClientState.Active) + return result } catch (ex) { this._setStatus(protocolMessage, LanguageClientState.Error) throw ex } } else { - this._setStatus(protocolMessage, LanguageClientState.Error) + this._setStatus(protocolMessage, LanguageClientState.NotAvailable) return Promise.reject("No language server registered") } } @@ -250,7 +253,7 @@ export class LanguageManager { languageClient.handleRequest(request, this._requestHandlers[request]) }) - this._languageServerInfo[language] = languageClient + this._languageServerInfo[language] = languageClient } private _getLanguageClient(language: string): ILanguageClient { @@ -265,6 +268,10 @@ export class LanguageManager { return this._languageServerInfo[normalizedLanguage] } + private _hasLanguageClient(language: string): boolean { + return !!this._languageServerInfo[language] + } + private _setStatus(protocolMessage: string, status: LanguageClientState): void { switch (protocolMessage) { From 42754adf39fdc34f835bfd4dcc86f7703b8d7226 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 16 Nov 2017 19:17:57 -0800 Subject: [PATCH 12/63] Fix issue with 'Rename' dialog disappearing (#968) * Fix missed 'key' property, causing rename view to unmount * Add missed key to bufferscrollbar * Add missing key to statusbar * Fix a few more React warnings around CSS properties * Remove debug logging --- browser/src/UI/components/BufferScrollBar.tsx | 2 +- browser/src/UI/components/StatusBar.tsx | 4 ++-- browser/src/UI/components/ToolTip.tsx | 5 +++-- browser/src/UI/components/WindowSplits.tsx | 4 ++-- vim/core/oni-core-statusbar/index.js | 8 ++++---- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/browser/src/UI/components/BufferScrollBar.tsx b/browser/src/UI/components/BufferScrollBar.tsx index 05d41d3a99..1bf20a7f5b 100644 --- a/browser/src/UI/components/BufferScrollBar.tsx +++ b/browser/src/UI/components/BufferScrollBar.tsx @@ -52,7 +52,7 @@ export class BufferScrollBar extends React.PureComponent + return
}) return
diff --git a/browser/src/UI/components/StatusBar.tsx b/browser/src/UI/components/StatusBar.tsx index 0ae05f0377..998c4a615b 100644 --- a/browser/src/UI/components/StatusBar.tsx +++ b/browser/src/UI/components/StatusBar.tsx @@ -48,12 +48,12 @@ export class StatusBar extends React.PureComponent { return
- {leftItems.map((item) => )} + {leftItems.map((item) => )}
- {rightItems.map((item) => )} + {rightItems.map((item) => )}
this._openGithub()}>
diff --git a/browser/src/UI/components/ToolTip.tsx b/browser/src/UI/components/ToolTip.tsx index e6ee5ab2a2..13847e4421 100644 --- a/browser/src/UI/components/ToolTip.tsx +++ b/browser/src/UI/components/ToolTip.tsx @@ -26,8 +26,9 @@ export class ToolTipsView extends React.PureComponent { classNames="fade" unmountOnExit={true} exit={false} + key={toolTip.id} > - + }) @@ -83,7 +84,7 @@ export class ToolTipView extends React.PureComponent { padding, } - return + return
this._setContainer(elem)}> {this.props.element}
diff --git a/browser/src/UI/components/WindowSplits.tsx b/browser/src/UI/components/WindowSplits.tsx index a204f1febf..cfee971b3b 100644 --- a/browser/src/UI/components/WindowSplits.tsx +++ b/browser/src/UI/components/WindowSplits.tsx @@ -42,9 +42,9 @@ export class WindowSplits extends React.PureComponent { width: "100%", height: "100%", display: "flex", - "align-items": "center", - "padding-left": "8px", - "padding-right": "8px", - "text-transform": "uppercase", + "alignItems": "center", + "paddingLeft": "8px", + "paddingRight": "8px", + "textTransform": "uppercase", color: rgb(220, 220, 220), backgroundColor: getColorForMode(mode) } From 30f773fd086715533a3985b8f780f4272bc8c674 Mon Sep 17 00:00:00 2001 From: Ryan C Date: Fri, 17 Nov 2017 21:42:22 +0000 Subject: [PATCH 13/63] Fix "Edit NeoVim config" command. (#969) * Fixed path for Windows init.vim. * Disable lint check for new line. --- browser/src/neovim/NeovimInstance.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 17dc7eb185..b4c53340c1 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -380,7 +380,8 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this.open(loadInitVim) } else { // Use path from: https://github.com/neovim/neovim/wiki/FAQ - const rootFolder = Platform.isWindows() ? path.join(Platform.getUserHome(), "AppData", "Local", "nvim") : path.join(Platform.getUserHome(), ".config", "nvim") + const rootFolder = Platform.isWindows() ? path.join(process.env["LOCALAPPDATA"], "nvim") : // tslint:disable-line no-string-literal + path.join(Platform.getUserHome(), ".config", "nvim") mkdirp.sync(rootFolder) const initVimPath = path.join(rootFolder, "init.vim") From f36afb0bc331aea939d91b388c1ccabb59e34ac2 Mon Sep 17 00:00:00 2001 From: Ryan C Date: Fri, 17 Nov 2017 23:13:35 +0000 Subject: [PATCH 14/63] [WIP] Swap Bundled plugins to Submodules (#944) * Remove plugin files, so submodules may be added. * Added link to submodules. * Update AppVeyor config to pull in submodules. --- .gitmodules | 12 + appveyor.yml | 2 + vim/core/typescript-vim | 1 + vim/core/typescript-vim/README.md | 73 - .../typescript-vim/compiler/typescript.vim | 16 - .../typescript-vim/ftdetect/typescript.vim | 1 - .../typescript-vim/ftplugin/typescript.vim | 19 - vim/core/typescript-vim/indent/typescript.vim | 501 -- vim/core/typescript-vim/syntax/typescript.vim | 328 - vim/core/typescript-vim/vimshot01.png | Bin 19299 -> 0 bytes vim/default/bundle/targets.vim | 1 + vim/default/bundle/targets.vim/.gitignore | 2 - vim/default/bundle/targets.vim/LICENSE | 20 - vim/default/bundle/targets.vim/README.md | 735 -- .../bundle/targets.vim/autoload/targets.vim | 1313 ---- .../targets.vim/autoload/targets/state.vim | 54 - .../targets.vim/autoload/targets/target.vim | 183 - vim/default/bundle/targets.vim/cheatsheet.md | 270 - .../bundle/targets.vim/doc/targets.txt | 752 -- .../bundle/targets.vim/plugin/targets.vim | 276 - vim/default/bundle/targets.vim/test/Makefile | 9 - vim/default/bundle/targets.vim/test/test.vim | 210 - vim/default/bundle/targets.vim/test/test1.in | 28 - vim/default/bundle/targets.vim/test/test1.ok | 6316 ----------------- vim/default/bundle/targets.vim/test/test1.out | 6316 ----------------- vim/default/bundle/targets.vim/test/test2.in | 25 - vim/default/bundle/targets.vim/test/test2.ok | 20 - vim/default/bundle/targets.vim/test/test2.out | 20 - vim/default/bundle/targets.vim/test/test3.in | 42 - vim/default/bundle/targets.vim/test/test3.ok | 38 - vim/default/bundle/targets.vim/test/test3.out | 38 - vim/default/bundle/targets.vim/test/test4.in | 6 - vim/default/bundle/targets.vim/test/test4.ok | 28 - vim/default/bundle/targets.vim/test/test4.out | 28 - vim/default/bundle/targets.vim/test/test5.in | 1 - vim/default/bundle/targets.vim/test/test5.ok | 1 - vim/default/bundle/targets.vim/test/test5.out | 1 - vim/default/bundle/targets.vim/test/test6.in | 3 - vim/default/bundle/targets.vim/test/test6.ok | 3 - vim/default/bundle/targets.vim/test/test6.out | 3 - vim/default/bundle/vim-commentary | 1 + vim/default/bundle/vim-commentary/.gitignore | 1 - .../vim-commentary/CONTRIBUTING.markdown | 1 - .../bundle/vim-commentary/README.markdown | 51 - .../bundle/vim-commentary/doc/commentary.txt | 32 - .../vim-commentary/plugin/commentary.vim | 103 - vim/default/bundle/vim-unimpaired | 1 + vim/default/bundle/vim-unimpaired/.gitignore | 1 - .../bundle/vim-unimpaired/README.markdown | 82 - .../bundle/vim-unimpaired/doc/unimpaired.txt | 152 - .../vim-unimpaired/plugin/unimpaired.vim | 465 -- 51 files changed, 18 insertions(+), 18567 deletions(-) create mode 100644 .gitmodules create mode 160000 vim/core/typescript-vim delete mode 100644 vim/core/typescript-vim/README.md delete mode 100644 vim/core/typescript-vim/compiler/typescript.vim delete mode 100644 vim/core/typescript-vim/ftdetect/typescript.vim delete mode 100644 vim/core/typescript-vim/ftplugin/typescript.vim delete mode 100644 vim/core/typescript-vim/indent/typescript.vim delete mode 100644 vim/core/typescript-vim/syntax/typescript.vim delete mode 100644 vim/core/typescript-vim/vimshot01.png create mode 160000 vim/default/bundle/targets.vim delete mode 100644 vim/default/bundle/targets.vim/.gitignore delete mode 100644 vim/default/bundle/targets.vim/LICENSE delete mode 100644 vim/default/bundle/targets.vim/README.md delete mode 100644 vim/default/bundle/targets.vim/autoload/targets.vim delete mode 100644 vim/default/bundle/targets.vim/autoload/targets/state.vim delete mode 100644 vim/default/bundle/targets.vim/autoload/targets/target.vim delete mode 100644 vim/default/bundle/targets.vim/cheatsheet.md delete mode 100644 vim/default/bundle/targets.vim/doc/targets.txt delete mode 100644 vim/default/bundle/targets.vim/plugin/targets.vim delete mode 100644 vim/default/bundle/targets.vim/test/Makefile delete mode 100644 vim/default/bundle/targets.vim/test/test.vim delete mode 100644 vim/default/bundle/targets.vim/test/test1.in delete mode 100644 vim/default/bundle/targets.vim/test/test1.ok delete mode 100644 vim/default/bundle/targets.vim/test/test1.out delete mode 100644 vim/default/bundle/targets.vim/test/test2.in delete mode 100644 vim/default/bundle/targets.vim/test/test2.ok delete mode 100644 vim/default/bundle/targets.vim/test/test2.out delete mode 100644 vim/default/bundle/targets.vim/test/test3.in delete mode 100644 vim/default/bundle/targets.vim/test/test3.ok delete mode 100644 vim/default/bundle/targets.vim/test/test3.out delete mode 100644 vim/default/bundle/targets.vim/test/test4.in delete mode 100644 vim/default/bundle/targets.vim/test/test4.ok delete mode 100644 vim/default/bundle/targets.vim/test/test4.out delete mode 100644 vim/default/bundle/targets.vim/test/test5.in delete mode 100644 vim/default/bundle/targets.vim/test/test5.ok delete mode 100644 vim/default/bundle/targets.vim/test/test5.out delete mode 100644 vim/default/bundle/targets.vim/test/test6.in delete mode 100644 vim/default/bundle/targets.vim/test/test6.ok delete mode 100644 vim/default/bundle/targets.vim/test/test6.out create mode 160000 vim/default/bundle/vim-commentary delete mode 100644 vim/default/bundle/vim-commentary/.gitignore delete mode 100644 vim/default/bundle/vim-commentary/CONTRIBUTING.markdown delete mode 100644 vim/default/bundle/vim-commentary/README.markdown delete mode 100644 vim/default/bundle/vim-commentary/doc/commentary.txt delete mode 100644 vim/default/bundle/vim-commentary/plugin/commentary.vim create mode 160000 vim/default/bundle/vim-unimpaired delete mode 100644 vim/default/bundle/vim-unimpaired/.gitignore delete mode 100644 vim/default/bundle/vim-unimpaired/README.markdown delete mode 100644 vim/default/bundle/vim-unimpaired/doc/unimpaired.txt delete mode 100644 vim/default/bundle/vim-unimpaired/plugin/unimpaired.vim diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..17330cc245 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "vim/default/bundle/targets.vim"] + path = vim/default/bundle/targets.vim + url = https://github.com/wellle/targets.vim +[submodule "vim/default/bundle/vim-commentary"] + path = vim/default/bundle/vim-commentary + url = https://github.com/tpope/vim-commentary +[submodule "vim/default/bundle/vim-unimpaired"] + path = vim/default/bundle/vim-unimpaired + url = https://github.com/tpope/vim-unimpaired +[submodule "vim/core/typescript-vim"] + path = vim/core/typescript-vim + url = https://github.com/leafgarland/typescript-vim diff --git a/appveyor.yml b/appveyor.yml index dd69523914..06cf4869ff 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,6 +18,8 @@ platform: # Install scripts. (runs after repo cloning) install: + # Ensure the Git Submoduldes have been pulled down too + - git submodule update --init --recursive # Get the latest stable version of Node.js or io.js - ps: Install-Product node $env:nodejs_version # Workaround https://github.com/npm/npm/issues/18380 diff --git a/vim/core/typescript-vim b/vim/core/typescript-vim new file mode 160000 index 0000000000..fbd0e9e508 --- /dev/null +++ b/vim/core/typescript-vim @@ -0,0 +1 @@ +Subproject commit fbd0e9e508535f7d89778f7280dc76505348dcc6 diff --git a/vim/core/typescript-vim/README.md b/vim/core/typescript-vim/README.md deleted file mode 100644 index 8a4e60b064..0000000000 --- a/vim/core/typescript-vim/README.md +++ /dev/null @@ -1,73 +0,0 @@ -Typescript Syntax for Vim -========================= - -Syntax file and other settings for [TypeScript](http://typescriptlang.org). The -syntax file is taken from this [blog -post](http://blogs.msdn.com/b/interoperability/archive/2012/10/01/sublime-text-vi-emacs-typescript-enabled.aspx). - -Checkout [Tsuquyomi](https://github.com/Quramy/tsuquyomi) for omni-completion -and other features for TypeScript editing. - -Install -------- - -The simplest way to install is via a Vim add-in manager such as -[Plug](https://github.com/junegunn/vim-plug), -[Vundle](https://github.com/gmarik/vundle) or -[Pathogen](https://github.com/tpope/vim-pathogen/). - -### Pathogen - -``` -git clone https://github.com/leafgarland/typescript-vim.git ~/.vim/bundle/typescript-vim -``` - -If you want to install manually then you need to copy the files from this -repository into your vim path, see the vim docs for [:help -runtimepath](http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath') -for more information. This might be as simple as copying the files and -directories to `~/.vim/` but it depends on your Vim install and operating -system. - -Usage ------ - -Once the files are installed the syntax highlighting and other settings will be -automatically enabled anytime you edit a `.ts` file. - -Indenting ---------- - -This plugin includes a custom indenter (based on `indent/java.vim`), it works -pretty well but there are cases where it fails. If these bother you or want to -use other indent settings you can disable it by setting a flag in your -`.vimrc`: - -```vim -let g:typescript_indent_disable = 1 -``` - -Compiler settings ------------------ - -The compiler settings enable you to call the `tsc` compiler directly from Vim -and display any errors or warnings in Vim's QuickFix window. - -To run the compiler, enter `:make`, this will run `tsc` against the last saved -version of your currently edited file. - -You can add compiler options by modifying the compiler options variable. - -```vim -let g:typescript_compiler_options = '-sourcemap' -``` - -Note, you can use something like this in your `.vimrc` to make the QuickFix -window automatically appear if `:make` has any errors. - -```vim -autocmd QuickFixCmdPost [^l]* nested cwindow -autocmd QuickFixCmdPost l* nested lwindow -``` - -![Obligatory screenshot](https://raw.github.com/leafgarland/typescript-vim/master/vimshot01.png) diff --git a/vim/core/typescript-vim/compiler/typescript.vim b/vim/core/typescript-vim/compiler/typescript.vim deleted file mode 100644 index 7833e005bf..0000000000 --- a/vim/core/typescript-vim/compiler/typescript.vim +++ /dev/null @@ -1,16 +0,0 @@ -if exists("current_compiler") - finish -endif -let current_compiler = "typescript" - -if !exists("g:typescript_compiler_binary") - let g:typescript_compiler_binary = "tsc" -endif - -if !exists("g:typescript_compiler_options") - let g:typescript_compiler_options = "" -endif - -let &l:makeprg = g:typescript_compiler_binary . ' ' . g:typescript_compiler_options . ' $* %' - -CompilerSet errorformat=%+A\ %#%f\ %#(%l\\\,%c):\ %m,%C%m diff --git a/vim/core/typescript-vim/ftdetect/typescript.vim b/vim/core/typescript-vim/ftdetect/typescript.vim deleted file mode 100644 index 481aa470d5..0000000000 --- a/vim/core/typescript-vim/ftdetect/typescript.vim +++ /dev/null @@ -1 +0,0 @@ -autocmd BufNewFile,BufRead *.ts,*.tsx setlocal filetype=typescript diff --git a/vim/core/typescript-vim/ftplugin/typescript.vim b/vim/core/typescript-vim/ftplugin/typescript.vim deleted file mode 100644 index ed1b8aaeef..0000000000 --- a/vim/core/typescript-vim/ftplugin/typescript.vim +++ /dev/null @@ -1,19 +0,0 @@ -if exists("b:did_ftplugin") - finish -endif -let b:did_ftplugin = 1 - -let s:cpo_save = &cpo -set cpo-=C - -compiler typescript -setlocal commentstring=//\ %s - -" Set 'formatoptions' to break comment lines but not other lines, -" " and insert the comment leader when hitting or using "o". -setlocal formatoptions-=t formatoptions+=croql - -let b:undo_ftplugin = "setl fo< ofu< com< cms<" - -let &cpo = s:cpo_save -unlet s:cpo_save diff --git a/vim/core/typescript-vim/indent/typescript.vim b/vim/core/typescript-vim/indent/typescript.vim deleted file mode 100644 index 361300d616..0000000000 --- a/vim/core/typescript-vim/indent/typescript.vim +++ /dev/null @@ -1,501 +0,0 @@ -" Vim indent file -" Language: Typescript -" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org - -" 0. Initialization {{{1 -" ================= - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal nosmartindent - -" Now, set up our indentation expression and keys that trigger it. -setlocal indentexpr=GetTypescriptIndent() -setlocal formatexpr=Fixedgq(v:lnum,v:count) -setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e - -" Only define the function once. -if exists("*GetTypescriptIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" 1. Variables {{{1 -" ============ - -let s:ts_keywords = '^\s*\(break\|case\|catch\|continue\|debugger\|default\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)' - -" Regex of syntax group names that are or delimit string or are comments. -let s:syng_strcom = 'string\|regex\|comment\c' - -" Regex of syntax group names that are strings. -let s:syng_string = 'regex\c' - -" Regex of syntax group names that are strings or documentation. -let s:syng_multiline = 'comment\c' - -" Regex of syntax group names that are line comment. -let s:syng_linecom = 'linecomment\c' - -" Expression used to check whether we should skip a match with searchpair(). -let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'" - -let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' - -" Regex that defines continuation lines, not including (, {, or [. -let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@[^{;]*' . s:line_term - -" Regex that defines blocks. -let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term - -let s:var_stmt = '^\s*var' - -let s:comma_first = '^\s*,' -let s:comma_last = ',\s*$' - -let s:ternary = '^\s\+[?|:]' -let s:ternary_q = '^\s\+?' - -" 2. Auxiliary Functions {{{1 -" ====================== - -" Check if the character at lnum:col is inside a string, comment, or is ascii. -function s:IsInStringOrComment(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom -endfunction - -" Check if the character at lnum:col is inside a string. -function s:IsInString(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string -endfunction - -" Check if the character at lnum:col is inside a multi-line comment. -function s:IsInMultilineComment(lnum, col) - return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline -endfunction - -" Check if the character at lnum:col is a line comment. -function s:IsLineComment(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_linecom -endfunction - -" Find line above 'lnum' that isn't empty, in a comment, or in a string. -function s:PrevNonBlankNonString(lnum) - let in_block = 0 - let lnum = prevnonblank(a:lnum) - while lnum > 0 - " Go in and out of blocks comments as necessary. - " If the line isn't empty (with opt. comment) or in a string, end search. - let line = getline(lnum) - if line =~ '/\*' - if in_block - let in_block = 0 - else - break - endif - elseif !in_block && line =~ '\*/' - let in_block = 1 - elseif !in_block && line !~ '^\s*\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line))) - break - endif - let lnum = prevnonblank(lnum - 1) - endwhile - return lnum -endfunction - -" Find line above 'lnum' that started the continuation 'lnum' may be part of. -function s:GetMSL(lnum, in_one_line_scope) - " Start on the line we're at and use its indent. - let msl = a:lnum - let lnum = s:PrevNonBlankNonString(a:lnum - 1) - while lnum > 0 - " If we have a continuation line, or we're in a string, use line as MSL. - " Otherwise, terminate search as we have found our MSL already. - let line = getline(lnum) - let col = match(line, s:msl_regex) + 1 - if (col > 0 && !s:IsInStringOrComment(lnum, col)) || s:IsInString(lnum, strlen(line)) - let msl = lnum - else - " Don't use lines that are part of a one line scope as msl unless the - " flag in_one_line_scope is set to 1 - " - if a:in_one_line_scope - break - end - let msl_one_line = s:Match(lnum, s:one_line_scope_regex) - if msl_one_line == 0 - break - endif - endif - let lnum = s:PrevNonBlankNonString(lnum - 1) - endwhile - return msl -endfunction - -function s:RemoveTrailingComments(content) - let single = '\/\/\(.*\)\s*$' - let multi = '\/\*\(.*\)\*\/\s*$' - return substitute(substitute(a:content, single, '', ''), multi, '', '') -endfunction - -" Find if the string is inside var statement (but not the first string) -function s:InMultiVarStatement(lnum) - let lnum = s:PrevNonBlankNonString(a:lnum - 1) - -" let type = synIDattr(synID(lnum, indent(lnum) + 1, 0), 'name') - - " loop through previous expressions to find a var statement - while lnum > 0 - let line = getline(lnum) - - " if the line is a ts keyword - if (line =~ s:ts_keywords) - " check if the line is a var stmt - " if the line has a comma first or comma last then we can assume that we - " are in a multiple var statement - if (line =~ s:var_stmt) - return lnum - endif - - " other ts keywords, not a var - return 0 - endif - - let lnum = s:PrevNonBlankNonString(lnum - 1) - endwhile - - " beginning of program, not a var - return 0 -endfunction - -" Find line above with beginning of the var statement or returns 0 if it's not -" this statement -function s:GetVarIndent(lnum) - let lvar = s:InMultiVarStatement(a:lnum) - let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1) - - if lvar - let line = s:RemoveTrailingComments(getline(prev_lnum)) - - " if the previous line doesn't end in a comma, return to regular indent - if (line !~ s:comma_last) - return indent(prev_lnum) - &sw - else - return indent(lvar) + &sw - endif - endif - - return -1 -endfunction - - -" Check if line 'lnum' has more opening brackets than closing ones. -function s:LineHasOpeningBrackets(lnum) - let open_0 = 0 - let open_2 = 0 - let open_4 = 0 - let line = getline(a:lnum) - let pos = match(line, '[][(){}]', 0) - while pos != -1 - if !s:IsInStringOrComment(a:lnum, pos + 1) - let idx = stridx('(){}[]', line[pos]) - if idx % 2 == 0 - let open_{idx} = open_{idx} + 1 - else - let open_{idx - 1} = open_{idx - 1} - 1 - endif - endif - let pos = match(line, '[][(){}]', pos + 1) - endwhile - return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) -endfunction - -function s:Match(lnum, regex) - let col = match(getline(a:lnum), a:regex) + 1 - return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0 -endfunction - -function s:IndentWithContinuation(lnum, ind, width) - " Set up variables to use and search for MSL to the previous line. - let p_lnum = a:lnum - let lnum = s:GetMSL(a:lnum, 1) - let line = getline(lnum) - - " If the previous line wasn't a MSL and is continuation return its indent. - " TODO: the || s:IsInString() thing worries me a bit. - if p_lnum != lnum - if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line)) - return a:ind - endif - endif - - " Set up more variables now that we know we aren't continuation bound. - let msl_ind = indent(lnum) - - " If the previous line ended with [*+/.-=], start a continuation that - " indents an extra level. - if s:Match(lnum, s:continuation_regex) - if lnum == p_lnum - return msl_ind + a:width - else - return msl_ind - endif - endif - - return a:ind -endfunction - -function s:InOneLineScope(lnum) - let msl = s:GetMSL(a:lnum, 1) - if msl > 0 && s:Match(msl, s:one_line_scope_regex) - return msl - endif - return 0 -endfunction - -function s:ExitingOneLineScope(lnum) - let msl = s:GetMSL(a:lnum, 1) - if msl > 0 - " if the current line is in a one line scope .. - if s:Match(msl, s:one_line_scope_regex) - return 0 - else - let prev_msl = s:GetMSL(msl - 1, 1) - if s:Match(prev_msl, s:one_line_scope_regex) - return prev_msl - endif - endif - endif - return 0 -endfunction - -" 3. GetTypescriptIndent Function {{{1 -" ========================= - -function GetTypescriptIndent() - " 3.1. Setup {{{2 - " ---------- - - " Set up variables for restoring position in file. Could use v:lnum here. - let vcol = col('.') - - " 3.2. Work on the current line {{{2 - " ----------------------------- - - let ind = -1 - " Get the current line. - let line = getline(v:lnum) - " previous nonblank line number - let prevline = prevnonblank(v:lnum - 1) - - " If we got a closing bracket on an empty line, find its match and indent - " according to it. For parentheses we indent to its column - 1, for the - " others we indent to the containing line's MSL's level. Return -1 if fail. - let col = matchend(line, '^\s*[],})]') - if col > 0 && !s:IsInStringOrComment(v:lnum, col) - call cursor(v:lnum, col) - - let lvar = s:InMultiVarStatement(v:lnum) - if lvar - let prevline_contents = s:RemoveTrailingComments(getline(prevline)) - - " check for comma first - if (line[col - 1] =~ ',') - " if the previous line ends in comma or semicolon don't indent - if (prevline_contents =~ '[;,]\s*$') - return indent(s:GetMSL(line('.'), 0)) - " get previous line indent, if it's comma first return prevline indent - elseif (prevline_contents =~ s:comma_first) - return indent(prevline) - " otherwise we indent 1 level - else - return indent(lvar) + &sw - endif - endif - endif - - - let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) - if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 - if line[col-1]==')' && col('.') != col('$') - 1 - let ind = virtcol('.')-1 - else - let ind = indent(s:GetMSL(line('.'), 0)) - endif - endif - return ind - endif - - " If the line is comma first, dedent 1 level - if (getline(prevline) =~ s:comma_first) - return indent(prevline) - &sw - endif - - if (line =~ s:ternary) - if (getline(prevline) =~ s:ternary_q) - return indent(prevline) - else - return indent(prevline) + &sw - endif - endif - - " If we are in a multi-line comment, cindent does the right thing. - if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1) - return cindent(v:lnum) - endif - - " Check for multiple var assignments -" let var_indent = s:GetVarIndent(v:lnum) -" if var_indent >= 0 -" return var_indent -" endif - - " 3.3. Work on the previous line. {{{2 - " ------------------------------- - - " If the line is empty and the previous nonblank line was a multi-line - " comment, use that comment's indent. Deduct one char to account for the - " space in ' */'. - if line =~ '^\s*$' && s:IsInMultilineComment(prevline, 1) - return indent(prevline) - 1 - endif - - " Find a non-blank, non-multi-line string line above the current line. - let lnum = s:PrevNonBlankNonString(v:lnum - 1) - - " If the line is empty and inside a string, use the previous line. - if line =~ '^\s*$' && lnum != prevline - return indent(prevnonblank(v:lnum)) - endif - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - " Set up variables for current line. - let line = getline(lnum) - let ind = indent(lnum) - - " If the previous line ended with a block opening, add a level of indent. - if s:Match(lnum, s:block_regex) - return indent(s:GetMSL(lnum, 0)) + &sw - endif - - " If the previous line contained an opening bracket, and we are still in it, - " add indent depending on the bracket type. - if line =~ '[[({]' - let counts = s:LineHasOpeningBrackets(lnum) - if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0 - if col('.') + 1 == col('$') - return ind + &sw - else - return virtcol('.') - endif - elseif counts[1] == '1' || counts[2] == '1' - return ind + &sw - else - call cursor(v:lnum, vcol) - end - endif - - " 3.4. Work on the MSL line. {{{2 - " -------------------------- - - let ind_con = ind - let ind = s:IndentWithContinuation(lnum, ind_con, &sw) - - " }}}2 - " - " - let ols = s:InOneLineScope(lnum) - if ols > 0 - let ind = ind + &sw - else - let ols = s:ExitingOneLineScope(lnum) - while ols > 0 && ind > 0 - let ind = ind - &sw - let ols = s:InOneLineScope(ols - 1) - endwhile - endif - - return ind -endfunction - -" }}}1 - -let &cpo = s:cpo_save -unlet s:cpo_save - -function! Fixedgq(lnum, count) - let l:tw = &tw ? &tw : 80; - - let l:count = a:count - let l:first_char = indent(a:lnum) + 1 - - if mode() == 'i' " gq was not pressed, but tw was set - return 1 - endif - - " This gq is only meant to do code with strings, not comments - if s:IsLineComment(a:lnum, l:first_char) || s:IsInMultilineComment(a:lnum, l:first_char) - return 1 - endif - - if len(getline(a:lnum)) < l:tw && l:count == 1 " No need for gq - return 1 - endif - - " Put all the lines on one line and do normal spliting after that - if l:count > 1 - while l:count > 1 - let l:count -= 1 - normal J - endwhile - endif - - let l:winview = winsaveview() - - call cursor(a:lnum, l:tw + 1) - let orig_breakpoint = searchpairpos(' ', '', '\.', 'bcW', '', a:lnum) - call cursor(a:lnum, l:tw + 1) - let breakpoint = searchpairpos(' ', '', '\.', 'bcW', s:skip_expr, a:lnum) - - " No need for special treatment, normal gq handles edgecases better - if breakpoint[1] == orig_breakpoint[1] - call winrestview(l:winview) - return 1 - endif - - " Try breaking after string - if breakpoint[1] <= indent(a:lnum) - call cursor(a:lnum, l:tw + 1) - let breakpoint = searchpairpos('\.', '', ' ', 'cW', s:skip_expr, a:lnum) - endif - - - if breakpoint[1] != 0 - call feedkeys("r\") - else - let l:count = l:count - 1 - endif - - " run gq on new lines - if l:count == 1 - call feedkeys("gqq") - endif - - return 0 -endfunction diff --git a/vim/core/typescript-vim/syntax/typescript.vim b/vim/core/typescript-vim/syntax/typescript.vim deleted file mode 100644 index 5f2495784f..0000000000 --- a/vim/core/typescript-vim/syntax/typescript.vim +++ /dev/null @@ -1,328 +0,0 @@ -" Vim syntax file -" Language: typescript -" Author: MicroSoft Open Technologies Inc. -" Version: 0.1 -" Credits: Zhao Yi, Claudio Fleiner, Scott Shattuck, Jose Elera Campana - -if !exists("main_syntax") - if version < 600 - syntax clear - elseif exists("b:current_syntax") - finish - endif - let main_syntax = "typescript" -endif - -" Drop fold if it set but vim doesn't support it. -if version < 600 && exists("typescript_fold") - unlet typescript_fold -endif - -"" dollar sign is permitted anywhere in an identifier -setlocal iskeyword+=$ - -syntax sync fromstart - -"" syntax coloring for Node.js shebang line -syn match shebang "^#!.*/bin/env\s\+node\>" -hi link shebang Comment - -"" typescript comments"{{{ -syn keyword typescriptCommentTodo TODO FIXME XXX TBD contained -syn match typescriptLineComment "\/\/.*" contains=@Spell,typescriptCommentTodo,typescriptRef -syn match typescriptRefComment /\/\/\/<\(reference\|amd-\(dependency\|module\)\)\s\+.*\/>$/ contains=typescriptRefD,typescriptRefS -syn region typescriptRefD start=+"+ skip=+\\\\\|\\"+ end=+"\|$+ -syn region typescriptRefS start=+'+ skip=+\\\\\|\\'+ end=+'\|$+ - -syn match typescriptCommentSkip "^[ \t]*\*\($\|[ \t]\+\)" -syn region typescriptComment start="/\*" end="\*/" contains=@Spell,typescriptCommentTodo extend -"}}} -"" JSDoc support start"{{{ -if !exists("typescript_ignore_typescriptdoc") - syntax case ignore - -" syntax coloring for JSDoc comments (HTML) -"unlet b:current_syntax - - syntax region typescriptDocComment start="/\*\*\s*$" end="\*/" contains=typescriptDocTags,typescriptCommentTodo,typescriptCvsTag,@typescriptHtml,@Spell fold extend - syntax match typescriptDocTags contained "@\(param\|argument\|requires\|exception\|throws\|type\|class\|extends\|see\|link\|member\|module\|method\|title\|namespace\|optional\|default\|base\|file\)\>" nextgroup=typescriptDocParam,typescriptDocSeeTag skipwhite - syntax match typescriptDocTags contained "@\(beta\|deprecated\|description\|fileoverview\|author\|license\|version\|returns\=\|constructor\|private\|protected\|final\|ignore\|addon\|exec\)\>" - syntax match typescriptDocParam contained "\%(#\|\w\|\.\|:\|\/\)\+" - syntax region typescriptDocSeeTag contained matchgroup=typescriptDocSeeTag start="{" end="}" contains=typescriptDocTags - - syntax case match -endif "" JSDoc end -"}}} -syntax case match - -"" Syntax in the typescript code"{{{ -syn match typescriptSpecial "\\\d\d\d\|\\." -syn region typescriptStringD start=+"+ skip=+\\\\\|\\"+ end=+"\|$+ contains=typescriptSpecial,@htmlPreproc extend -syn region typescriptStringS start=+'+ skip=+\\\\\|\\'+ end=+'\|$+ contains=typescriptSpecial,@htmlPreproc extend -syn region typescriptStringB start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=typescriptSpecial,@htmlPreproc extend - -syn match typescriptSpecialCharacter "'\\.'" -syn match typescriptNumber "-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>" -syn region typescriptRegexpString start=+/[^/*]+me=e-1 skip=+\\\\\|\\/+ end=+/[gi]\{0,2\}\s*$+ end=+/[gi]\{0,2\}\s*[;.,)\]}]+me=e-1 contains=@htmlPreproc oneline -" syntax match typescriptSpecial "\\\d\d\d\|\\x\x\{2\}\|\\u\x\{4\}\|\\." -" syntax region typescriptStringD start=+"+ skip=+\\\\\|\\$"+ end=+"+ contains=typescriptSpecial,@htmlPreproc -" syntax region typescriptStringS start=+'+ skip=+\\\\\|\\$'+ end=+'+ contains=typescriptSpecial,@htmlPreproc -" syntax region typescriptRegexpString start=+/\(\*\|/\)\@!+ skip=+\\\\\|\\/+ end=+/[gim]\{,3}+ contains=typescriptSpecial,@htmlPreproc oneline -" syntax match typescriptNumber /\<-\=\d\+L\=\>\|\<0[xX]\x\+\>/ -syntax match typescriptFloat /\<-\=\%(\d\+\.\d\+\|\d\+\.\|\.\d\+\)\%([eE][+-]\=\d\+\)\=\>/ -" syntax match typescriptLabel /\(?\s*\)\@/ -"}}} -"" typescript Prototype"{{{ -syntax keyword typescriptPrototype contained prototype -"}}} -" DOM, Browser and Ajax Support {{{ -"""""""""""""""""""""""" -syntax keyword typescriptBrowserObjects window navigator screen history location - -syntax keyword typescriptDOMObjects document event HTMLElement Anchor Area Base Body Button Form Frame Frameset Image Link Meta Option Select Style Table TableCell TableRow Textarea -syntax keyword typescriptDOMMethods contained createTextNode createElement insertBefore replaceChild removeChild appendChild hasChildNodes cloneNode normalize isSupported hasAttributes getAttribute setAttribute removeAttribute getAttributeNode setAttributeNode removeAttributeNode getElementsByTagName hasAttribute getElementById adoptNode close compareDocumentPosition createAttribute createCDATASection createComment createDocumentFragment createElementNS createEvent createExpression createNSResolver createProcessingInstruction createRange createTreeWalker elementFromPoint evaluate getBoxObjectFor getElementsByClassName getSelection getUserData hasFocus importNode -syntax keyword typescriptDOMProperties contained nodeName nodeValue nodeType parentNode childNodes firstChild lastChild previousSibling nextSibling attributes ownerDocument namespaceURI prefix localName tagName - -syntax keyword typescriptAjaxObjects XMLHttpRequest -syntax keyword typescriptAjaxProperties contained readyState responseText responseXML statusText -syntax keyword typescriptAjaxMethods contained onreadystatechange abort getAllResponseHeaders getResponseHeader open send setRequestHeader - -syntax keyword typescriptPropietaryObjects ActiveXObject -syntax keyword typescriptPropietaryMethods contained attachEvent detachEvent cancelBubble returnValue - -syntax keyword typescriptHtmlElemProperties contained className clientHeight clientLeft clientTop clientWidth dir href id innerHTML lang length offsetHeight offsetLeft offsetParent offsetTop offsetWidth scrollHeight scrollLeft scrollTop scrollWidth style tabIndex target title - -syntax keyword typescriptEventListenerKeywords contained blur click focus mouseover mouseout load item - -syntax keyword typescriptEventListenerMethods contained scrollIntoView addEventListener dispatchEvent removeEventListener preventDefault stopPropagation -" }}} -"" Programm Keywords"{{{ -syntax keyword typescriptSource import export from as -syntax keyword typescriptIdentifier arguments this let var void const -syntax keyword typescriptOperator delete new instanceof typeof -syntax keyword typescriptBoolean true false -syntax keyword typescriptNull null undefined -syntax keyword typescriptMessage alert confirm prompt status -syntax keyword typescriptGlobal self top parent -syntax keyword typescriptDeprecated escape unescape all applets alinkColor bgColor fgColor linkColor vlinkColor xmlEncoding -"}}} -"" Statement Keywords"{{{ -syntax keyword typescriptConditional if else switch -syntax keyword typescriptRepeat do while for in of -syntax keyword typescriptBranch break continue yield await -syntax keyword typescriptLabel case default async -syntax keyword typescriptStatement return with - -syntax keyword typescriptGlobalObjects Array Boolean Date Function Infinity Math Number NaN Object Packages RegExp String netscape - -syntax keyword typescriptExceptions try catch throw finally Error EvalError RangeError ReferenceError SyntaxError TypeError URIError - -syntax keyword typescriptReserved constructor declare as interface module abstract enum int short export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public type namespace from -"}}} -"" typescript/DOM/HTML/CSS specified things"{{{ - -" typescript Objects"{{{ - syn match typescriptFunction "(super\s*|constructor\s*)" contained nextgroup=typescriptVars - syn region typescriptVars start="(" end=")" contained contains=typescriptParameters transparent keepend - syn match typescriptParameters "([a-zA-Z0-9_?.$][\w?.$]*)\s*:\s*([a-zA-Z0-9_?.$][\w?.$]*)" contained skipwhite -"}}} -" DOM2 Objects"{{{ - syntax keyword typescriptType DOMImplementation DocumentFragment Node NodeList NamedNodeMap CharacterData Attr Element Text Comment CDATASection DocumentType Notation Entity EntityReference ProcessingInstruction void any string boolean number - syntax keyword typescriptExceptions DOMException -"}}} -" DOM2 CONSTANT"{{{ - syntax keyword typescriptDomErrNo INDEX_SIZE_ERR DOMSTRING_SIZE_ERR HIERARCHY_REQUEST_ERR WRONG_DOCUMENT_ERR INVALID_CHARACTER_ERR NO_DATA_ALLOWED_ERR NO_MODIFICATION_ALLOWED_ERR NOT_FOUND_ERR NOT_SUPPORTED_ERR INUSE_ATTRIBUTE_ERR INVALID_STATE_ERR SYNTAX_ERR INVALID_MODIFICATION_ERR NAMESPACE_ERR INVALID_ACCESS_ERR - syntax keyword typescriptDomNodeConsts ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE CDATA_SECTION_NODE ENTITY_REFERENCE_NODE ENTITY_NODE PROCESSING_INSTRUCTION_NODE COMMENT_NODE DOCUMENT_NODE DOCUMENT_TYPE_NODE DOCUMENT_FRAGMENT_NODE NOTATION_NODE -"}}} -" HTML events and internal variables"{{{ - syntax case ignore - syntax keyword typescriptHtmlEvents onblur onclick oncontextmenu ondblclick onfocus onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup onresize onload onsubmit - syntax case match -"}}} - -" Follow stuff should be highligh within a special context -" While it can't be handled with context depended with Regex based highlight -" So, turn it off by default -if exists("typescript_enable_domhtmlcss") - -" DOM2 things"{{{ - syntax match typescriptDomElemAttrs contained /\%(nodeName\|nodeValue\|nodeType\|parentNode\|childNodes\|firstChild\|lastChild\|previousSibling\|nextSibling\|attributes\|ownerDocument\|namespaceURI\|prefix\|localName\|tagName\)\>/ - syntax match typescriptDomElemFuncs contained /\%(insertBefore\|replaceChild\|removeChild\|appendChild\|hasChildNodes\|cloneNode\|normalize\|isSupported\|hasAttributes\|getAttribute\|setAttribute\|removeAttribute\|getAttributeNode\|setAttributeNode\|removeAttributeNode\|getElementsByTagName\|getAttributeNS\|setAttributeNS\|removeAttributeNS\|getAttributeNodeNS\|setAttributeNodeNS\|getElementsByTagNameNS\|hasAttribute\|hasAttributeNS\)\>/ nextgroup=typescriptParen skipwhite -"}}} -" HTML things"{{{ - syntax match typescriptHtmlElemAttrs contained /\%(className\|clientHeight\|clientLeft\|clientTop\|clientWidth\|dir\|id\|innerHTML\|lang\|length\|offsetHeight\|offsetLeft\|offsetParent\|offsetTop\|offsetWidth\|scrollHeight\|scrollLeft\|scrollTop\|scrollWidth\|style\|tabIndex\|title\)\>/ - syntax match typescriptHtmlElemFuncs contained /\%(blur\|click\|focus\|scrollIntoView\|addEventListener\|dispatchEvent\|removeEventListener\|item\)\>/ nextgroup=typescriptParen skipwhite -"}}} -" CSS Styles in typescript"{{{ - syntax keyword typescriptCssStyles contained color font fontFamily fontSize fontSizeAdjust fontStretch fontStyle fontVariant fontWeight letterSpacing lineBreak lineHeight quotes rubyAlign rubyOverhang rubyPosition - syntax keyword typescriptCssStyles contained textAlign textAlignLast textAutospace textDecoration textIndent textJustify textJustifyTrim textKashidaSpace textOverflowW6 textShadow textTransform textUnderlinePosition - syntax keyword typescriptCssStyles contained unicodeBidi whiteSpace wordBreak wordSpacing wordWrap writingMode - syntax keyword typescriptCssStyles contained bottom height left position right top width zIndex - syntax keyword typescriptCssStyles contained border borderBottom borderLeft borderRight borderTop borderBottomColor borderLeftColor borderTopColor borderBottomStyle borderLeftStyle borderRightStyle borderTopStyle borderBottomWidth borderLeftWidth borderRightWidth borderTopWidth borderColor borderStyle borderWidth borderCollapse borderSpacing captionSide emptyCells tableLayout - syntax keyword typescriptCssStyles contained margin marginBottom marginLeft marginRight marginTop outline outlineColor outlineStyle outlineWidth padding paddingBottom paddingLeft paddingRight paddingTop - syntax keyword typescriptCssStyles contained listStyle listStyleImage listStylePosition listStyleType - syntax keyword typescriptCssStyles contained background backgroundAttachment backgroundColor backgroundImage gackgroundPosition backgroundPositionX backgroundPositionY backgroundRepeat - syntax keyword typescriptCssStyles contained clear clip clipBottom clipLeft clipRight clipTop content counterIncrement counterReset cssFloat cursor direction display filter layoutGrid layoutGridChar layoutGridLine layoutGridMode layoutGridType - syntax keyword typescriptCssStyles contained marks maxHeight maxWidth minHeight minWidth opacity MozOpacity overflow overflowX overflowY verticalAlign visibility zoom cssText - syntax keyword typescriptCssStyles contained scrollbar3dLightColor scrollbarArrowColor scrollbarBaseColor scrollbarDarkShadowColor scrollbarFaceColor scrollbarHighlightColor scrollbarShadowColor scrollbarTrackColor -"}}} -endif "DOM/HTML/CSS - -" Highlight ways"{{{ -syntax match typescriptDotNotation "\." nextgroup=typescriptPrototype,typescriptDomElemAttrs,typescriptDomElemFuncs,typescriptDOMMethods,typescriptDOMProperties,typescriptHtmlElemAttrs,typescriptHtmlElemFuncs,typescriptHtmlElemProperties,typescriptAjaxProperties,typescriptAjaxMethods,typescriptPropietaryMethods,typescriptEventListenerMethods skipwhite skipnl -syntax match typescriptDotNotation "\.style\." nextgroup=typescriptCssStyles -"}}} - -"" end DOM/HTML/CSS specified things""}}} - - -"" Code blocks -syntax cluster typescriptAll contains=typescriptComment,typescriptLineComment,typescriptDocComment,typescriptStringD,typescriptStringS,typescriptStringB,typescriptRegexpString,typescriptNumber,typescriptFloat,typescriptDecorators,typescriptLabel,typescriptSource,typescriptType,typescriptOperator,typescriptBoolean,typescriptNull,typescriptFuncKeyword,typescriptConditional,typescriptGlobal,typescriptRepeat,typescriptBranch,typescriptStatement,typescriptGlobalObjects,typescriptMessage,typescriptIdentifier,typescriptExceptions,typescriptReserved,typescriptDeprecated,typescriptDomErrNo,typescriptDomNodeConsts,typescriptHtmlEvents,typescriptDotNotation,typescriptBrowserObjects,typescriptDOMObjects,typescriptAjaxObjects,typescriptPropietaryObjects,typescriptDOMMethods,typescriptHtmlElemProperties,typescriptDOMProperties,typescriptEventListenerKeywords,typescriptEventListenerMethods,typescriptAjaxProperties,typescriptAjaxMethods,typescriptFuncArg - -if main_syntax == "typescript" - syntax sync clear - syntax sync ccomment typescriptComment minlines=200 -" syntax sync match typescriptHighlight grouphere typescriptBlock /{/ -endif - -syntax keyword typescriptFuncKeyword function -"syntax region typescriptFuncDef start="function" end="\(.*\)" contains=typescriptFuncKeyword,typescriptFuncArg keepend -"syntax match typescriptFuncArg "\(([^()]*)\)" contains=typescriptParens,typescriptFuncComma contained -"syntax match typescriptFuncComma /,/ contained -" syntax region typescriptFuncBlock contained matchgroup=typescriptFuncBlock start="{" end="}" contains=@typescriptAll,typescriptParensErrA,typescriptParensErrB,typescriptParen,typescriptBracket,typescriptBlock fold - -syn match typescriptBraces "[{}\[\]]" -syn match typescriptParens "[()]" -syn match typescriptOpSymbols "=\{1,3}\|!==\|!=\|<\|>\|>=\|<=\|++\|+=\|--\|-=" -syn match typescriptEndColons "[;,]" -syn match typescriptLogicSymbols "\(&&\)\|\(||\)" - -" typescriptFold Function {{{ - -" function! typescriptFold() - -" skip curly braces inside RegEx's and comments -syn region foldBraces start=/{/ skip=/\(\/\/.*\)\|\(\/.*\/\)/ end=/}/ transparent fold keepend extend - -" setl foldtext=FoldText() -" endfunction - -" au FileType typescript call typescriptFold() - -" }}} - -" Define the default highlighting. -" For version 5.7 and earlier: only when not done already -" For version 5.8 and later: only when an item doesn't have highlighting yet -if version >= 508 || !exists("did_typescript_syn_inits") - if version < 508 - let did_typescript_syn_inits = 1 - command -nargs=+ HiLink hi link - else - command -nargs=+ HiLink hi def link - endif - - "typescript highlighting - HiLink typescriptParameters Operator - HiLink typescriptSuperBlock Operator - - HiLink typescriptEndColons Exception - HiLink typescriptOpSymbols Operator - HiLink typescriptLogicSymbols Boolean - HiLink typescriptBraces Function - HiLink typescriptParens Operator - HiLink typescriptComment Comment - HiLink typescriptLineComment Comment - HiLink typescriptRefComment Include - HiLink typescriptRefS String - HiLink typescriptRefD String - HiLink typescriptDocComment Comment - HiLink typescriptCommentTodo Todo - HiLink typescriptCvsTag Function - HiLink typescriptDocTags Special - HiLink typescriptDocSeeTag Function - HiLink typescriptDocParam Function - HiLink typescriptStringS String - HiLink typescriptStringD String - HiLink typescriptStringB String - HiLink typescriptRegexpString String - HiLink typescriptGlobal Constant - HiLink typescriptCharacter Character - HiLink typescriptPrototype Type - HiLink typescriptConditional Conditional - HiLink typescriptBranch Conditional - HiLink typescriptIdentifier Identifier - HiLink typescriptRepeat Repeat - HiLink typescriptStatement Statement - HiLink typescriptFuncKeyword Function - HiLink typescriptMessage Keyword - HiLink typescriptDeprecated Exception - HiLink typescriptError Error - HiLink typescriptParensError Error - HiLink typescriptParensErrA Error - HiLink typescriptParensErrB Error - HiLink typescriptParensErrC Error - HiLink typescriptReserved Keyword - HiLink typescriptOperator Operator - HiLink typescriptType Type - HiLink typescriptNull Type - HiLink typescriptNumber Number - HiLink typescriptFloat Number - HiLink typescriptDecorators Special - HiLink typescriptBoolean Boolean - HiLink typescriptLabel Label - HiLink typescriptSpecial Special - HiLink typescriptSource Special - HiLink typescriptGlobalObjects Special - HiLink typescriptExceptions Special - - HiLink typescriptDomErrNo Constant - HiLink typescriptDomNodeConsts Constant - HiLink typescriptDomElemAttrs Label - HiLink typescriptDomElemFuncs PreProc - - HiLink typescriptHtmlElemAttrs Label - HiLink typescriptHtmlElemFuncs PreProc - - HiLink typescriptCssStyles Label - - " Ajax Highlighting - HiLink typescriptBrowserObjects Constant - - HiLink typescriptDOMObjects Constant - HiLink typescriptDOMMethods Function - HiLink typescriptDOMProperties Special - - HiLink typescriptAjaxObjects Constant - HiLink typescriptAjaxMethods Function - HiLink typescriptAjaxProperties Special - - HiLink typescriptFuncDef Title - HiLink typescriptFuncArg Special - HiLink typescriptFuncComma Operator - - HiLink typescriptHtmlEvents Special - HiLink typescriptHtmlElemProperties Special - - HiLink typescriptEventListenerKeywords Keyword - - HiLink typescriptNumber Number - HiLink typescriptPropietaryObjects Constant - - delcommand HiLink -endif - -" Define the htmltypescript for HTML syntax html.vim -"syntax clear htmltypescript -"syntax clear typescriptExpression -syntax cluster htmltypescript contains=@typescriptAll,typescriptBracket,typescriptParen,typescriptBlock,typescriptParenError -syntax cluster typescriptExpression contains=@typescriptAll,typescriptBracket,typescriptParen,typescriptBlock,typescriptParenError,@htmlPreproc - -let b:current_syntax = "typescript" -if main_syntax == 'typescript' - unlet main_syntax -endif - -" vim: ts=4 diff --git a/vim/core/typescript-vim/vimshot01.png b/vim/core/typescript-vim/vimshot01.png deleted file mode 100644 index 7c2627f978dadd6d6a63fd59e99b3d00031fe128..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19299 zcmb5VcT`hN*ESACy)cuJ4jWKW@ti?9*`~&f(X*2 zBfTdS>C&Yu^>?`M=Xt+(ee3(@w-(`?oSd06v**n0>$>)y2yIPeDvCQ4L_|bXFck$I zA|euii0IONG7|90YEw2GJdoPTX~+=~mB&(^m|q6J6T9jtKP4*dy}JV5O{A@^r$~2; zj*k8b9j7qe17SMxN8OrNAJxDb%U^*K%fc_ zrPU#9-ok=5q%TP6G$l!WNJW$w=#&)bY}7?n^dQRa!kTW9K6)^EIz4(i6?TXMlwDn# zPhIed9w)?<4Pr@u%a5MU56WmIDD1}u@e>qQpjTI*N9xi0DX^L7aq3yoD_GH+_|fb6 z(fe7kDOf=j{n$)ivc2+S^HW!1PDe;AszLsTr~Y`6#N_& zkoHI~8>F9)ADvPtok0SFSptJkF~lfF*d|oiC0970SkoX`%LAq7n4smJZ)FjRbd0jH zNV5)z@v}(tb4Vjakt%?Hd8Ae-Qa==_6^_&oN2(WTVg>%C!jZv9w?bpTE>gYlP=#Qu zUTBFydX8@5SA%q{X;Ph4cp4HF>K6IVFY>ipc$!suAu_$h8I|K#Sge;f>{mD(%1xIb zPM0PKNrMU(L;0eV850a|r#+PkwGj^Wd6-}!T&zh~EGJd$b307-X|RD_nt@`dfmfP= zTd1FMl#5=1k3xcrc2s~>f`?nN#fxGeyR?p$5589_TcS&@_+t zxdyq#$b@2#4^b%6gh=7sJklZ@X;h?oLaJg^q+43JRT|1IwD5UCp;2+TLT<2LUASId zl3{V7U(_gRaTjUvC~04~{BWM$aG_sl@Y|@!s8CcwXnJaL@S6{)P;`27D5^LisV+3D zHlg%$LVa-wDy%LkF1I3~E<3EQJ``J#@VP$iTX{lpVR3H#=e+uQY<6y4VR2nO23wEC z*4Ne5*Cl*zPN*LYtzR!5{8~3yS==^UJUIMqa5#7Lq;BVnR;x81h%+tb^7;l4ZCrRl4Uahy9~VxCwha#p38do8#$3^lJ`2 zyn)jl6K-tu9ejmQy!}ccbijjcsQeJmIXJ4~-RgojRH(MG#ojp2JBIrVB@+WhIKRV# z1O$`K^##2KHF!H8a>^!X{QY`)K>@o<51pCC9dG$m+|}!p{_6b)ub;nEQ$H*`LmOc| zGHr1>H#a!U3iQ52tc&eFwLa^b=*qQIMVfZ#KhV4~78QoKX`f~u8e%%sG~<1qnjWw& zc~&-V9VOtoo|2wEo%#$OIEm@eP2Z}kPu&TuQPtdd$Kjtc_rT!`n-BBZ5#ziE;`h?i z=z-C1--;xx@!?{KoLFQgHX`uNWyhRAuR0kkLh+UrKsY^(;{UthDfy}_bmPSt$>di5 z0o4`z^d~a2QS?ULD=B=ok-H?9%SBV(!;7#z)AH9?#w0hS-ZP@7$Gba>+tG!x#fPEe z6(a0}Rq+_6nXZ0AdxR?d_)w9x7Z(Czk5KJx>GO zf4TjME?z12L*GEb*=H^U2`YxGfV&dA@0-obq+hAWXB%u3MgD^IyfbMry!qoSZp9gQ zTi5c9;MzTj*jiHxf!Rlq;S!wUQs5;QhsO9Qmz(mq9=NUslab-@sqs*ghL7Tbc=o~1 zs@FQ1eANY&m$BrAsKLB%Z8_I1M26Z-KgPE9=cPR)gjX3Z?S({IjGQRA;B&iM(*(ll z+t-X2l?4%R9ufoTyGp})14?5Pr6zKJdthas!~xvUHIaCnzPt{6Fn1$({>Qr?_goPY zb8^KVc&k3gkPO^=vCX)T&In$PipLR%`M^@Cnr9aIhiWSDV!+kj-j3Isge$69`}R#7 zVBQANtpaP3O}g1qIuX z4e=-H2&v^e2)OSciRl*xGQNBGP(*xsF4TU)@^0~sy;>|4nm_Hd*?s1RGMaT;<1kQN zTyM~o4IA-1WF8jzNP*M!Rpx!XN*L5fLXzuccRnR=yk5;mRksRAa%8#(a6@0 zmXh5Sb7Z&n@nCqU1!B}u%`*9rAFsf*QBsXGaKx;aL?mWRt`2fuLEoivV=lFjJBvL= z)P_o4BO^d>@&^)l-asb~#lDrKce9r0$q;9b%I!@`?^{-oS5hC3iuc~sAIe@WnQ%|V zt&3cqRz??ZiPzzJ#EX}IlFJSu;BoU1_NRb0rK8lgISUcc9Rx+>WR5z7M#W2BO<&l_ zEaCZ{nE5r$$a3PR3O@s$l?*FKP5SS_js*DkR17aBEgdtK!OHy@2${R}y7UMM$9*QL zz7o0Djy0GYA4@71=fUCQKvb$Xq`v~t~X7< zmp7eAR+|FrKIhFuTJ;_pH5r^a+8^%6PCfke|Frdgn(Rn-u|gXUW4E2*>S%Diu4=)R z6#C*6$b#*&OMH(hyinA`H2Ab?0{9z78UAR49xQ@U{GSuTOBT>pN&WP1-@k^EsYc_p zaaNPuWS0PH?D#QoyXNx0rXjsJ&@%wqBKlFU1Tx9cVetNk_@|WM_<|Mx^GQnHNu;q0 zp{D?HbaizPM?5-Gjp!vmMA=X88Va9(!|&*4neC0;5I24Tn3<1={=r-MS3C3||1>6sc{bzZ z+=oVcW~z;tqv0jkjo8J4dw8X_{0%isZ(`v7NZz1_2v}*JMigvwdivG@YwTBSiEU9H zzmOVwilaFm>TujWS@5v)>=}kllomTB+AdX>D13Ve;KA6lp!` zxcImx@;y{!e<&ELWg6LV*xK#rXKjNTZ5*`^R1|yX&|9aS5_pVkow$LcQf-Pi>3P*% zg98@%VojRgN<2lt`v~XUW)11pE0i&2O35ANLWz|wt!GYk&S9Zik2ocsAy?XJU{guE z{El-b+1if%dnr{wCEWA$rbPa89a+bNG0byuuhz4^AL@g5#*G;>M}H(qyxTQgw?%IR zWKyYyK{*fo2TgU8|4PATD@&fh$FxkBcIm5b%|?$xjRuk}Oa8Xipdd{Fci#E5_*D$q zcl~IvS>wMhRW{xQj|q2BM05u(4d3V!6?tWkv6B#L;zb!Y(0mgs7QWc_cX+%958gn_|x?LPmCW$ku_G=9`b(!j< z0mia(+6cl<-TB`AI-55oSCiO>>+LPA?S$apu->c9)DJW%@JOmTMCI{cfN(_e8PLwb z)-ZDTr{~)3rb6v^{N%b5g{<+V@2p4itQ#~$?OQ9&`<#ZGo5?7=Q8v8WkXX^jowBBp zD2Mzj+t`WIey5PZ-;i3bmo8yUCDhMQ$Dd$~xALNWQ8^W5ZlU})d%ZIFwvLc#4_8bh zxkJ5FJ}Y@8TrGRm*G+lSXuVU+8_VqM^TwknEBcfld3~fy4P7923;!eF<`M%|E?NO* z5S9a3C2!Pvz{`H5noZa%b2N{xbs9^!Yi^OO;_A12rpm3#7JMq>r#jSj={0TPvd58j zW3ttvze`cGX=M(J@~@Im=;kZU(~k0<>95rP>H4-^rwNBB2$l(%;dUYR)OI1V@HIOE zF`l)5^iGM)>t~(Rb`F?09%6fXK;`EpxsHEl^2Nf@{T^o#;cum-@zde8EW8VQt5>=M zK{yS+@g#l2lBAx+u5+kO*%2et?H>>z%a=BF8~=gNBt+n<@fB>uv(6B-P9C3x5F$zS z9=^0KnS_r7-@^37@dYZkb^o{DJ;MsWdr0rl=%0%Q4py2k^%uI0-g_&oi|@3(E_X4X zze2decLRUryHh-89)L^Z>AgXBTiQD&O}1E@{;uZlp7_ZSx-St`DXd2EDzni_3)ScZ%CH)O^(j(F@j6<0H>&>dZKlM z`rcrL_^!%pC?Ra9bzNSP#+VZe3v^Mew3`p4upJgMOIHw;$$3Gr%d9Z zO7s0+)pD89QjTl$v6DyQOxfVz-8M2y9({N9nP5r?32_T`d}tCMuzVwY5H&1^_P*5E znW{^fz3kzGCK!F+h1%5|67W(yNZ#tP-1;1T50!P~S#1SPIK0@v&s&fAurNw3sqVm+C{0yVNejIX2It zrOWy1ECr5Dd|ir2xA2b?xM&6qs>%LNKYmQTfQkM#l4mzB26KValL0y5P^pRv%Rcf} zgDosDBaLq}mL-t8+DJ_AY8k?47_IxThs^}uIHgK!NVm-K^KXNi#c8Cj1FR74{*?Wu~wC2ZmT~Qc6PTBCl`TO zTe~|s*Xxqe+c{yfmw+2!UvhOTlv#%zT|%uzokrwuNLG2Q#|b;IeWr1d-w0UyqvI5v z760~r1~r{B{P1T|DHcIn3c+ajMk_P76!vpAqu{hddEdHet#Xo~2!g%eL+Y-wOLCM= z@pV5%ciAf2P4F>Z)J3XH?7y_Bu*?);+I83nWr`~4kPsk*-YP-i(ZXO}t@C^Adv#8J zfXn_j1aK2f!ns2tYYuYHzE>+Obb{4wW2@%K8$Ue)2IGg7_R z`2PZq`yTJarzh32_atos*{B~e#`_D;-H%KsnuG zT5hKms@`hd#dLoekREE=BLY4D6F@v3c7*bmlYYqi_pxw8ml!xXTQ$)?tOoB)<~dwb z9elk&@(R49^)IjdmtI~1F2EPupW<4n!T~iI7Q>O!8QLGde!o9BGkS@`c}dlz4!fex zsU_L7cXcj8sN#(*O3{n_epyH?@x!Wwfb)=3%g1A3#@;BfjTJc>j};K} zPVtcqr;Msmz)&TXtu3kLU4h4t=huvr_9wu4j-v71y=E~$-~}4 zn^Nu;{_wTTPUf^Zuz4VXb+!mJn7!z?OOD1~&+QlH1P|c{^02$WiPkI|o>hhO_ve!N zh?!s@B#8$o^yPd-6NAarDBZQ;W=x^orYie)6=OTmkmfbhoq&Uq&@(gy8@@@&!$57K8&Ye&nH1 zPy={zZP*=nh5^Tk1w4q6I!4u}xE^WZ&v5;|jXmg~qD1xi&_k7-{1lG=kpHYOuPMkHR#4GrH?sRB;w1Rqq=$C>Q|565hDVX@qj6Wq2R!%z=I|2|& zn}D!PV>_nxA~cTR48Q;B3f_h4N3H*NQLhU^uz1JI)0gXcNah0eviSx42Ae~A!4+%< zZ7Sa{Ea-EjlaJ?oMVmGpYV6v2t_ZuN;H;BokbEh-vz0iNNwbSv?CJE1Nsg zQ*E?FWcJy>I~Fc-JnJV#toZ^xX;nCMfhj1H-Umf}!3-|^%zqB}S2-6=@6XN!;;xN# zQI!yZjENo)6BKpX&yxcy=J7!-MWglM^}Z6IN$C48Gz%usvb=Vd0;pgpnf+y;Mgs(I z!Nzig2Y-!M`su+!1-__{pZ{@Yc0BzyJE#j1F@w8k$^Z5A|4w$WJve+~SwcU3W|%VJ z*YNPLzsSd&=Qb=-mGOLa#gs8lF?eA?!|P=a^}60ymFYc5FPs5MLOt=u)xud(LX{n4-)}Ufe3WG74aa{SO%C#0bw&V1XncR zm8m2N+rKXRQlTO{+BZ(w6dyiOSP)Q&oiN=QfC?HGq)l-fB>C9zW>+WJmf}xBA#wsn z?vrfYmgfh%gIn}0lkF`=6i)A`BijJPMuU0#@PnIq#hB*v>1(gEJ5b;=g%Px;P*2XErn;vAS~`D_-)+`@>oq*-Wi3|rXfv+K7Q9Hc#FN41kac=@KY{0`NI73?C{(J*5?KAAYA6YtN zm=6C{L7+DR)t`>S^n9_eO<+(?ZpLYdz_&dINQo&2GiU=KhGM^z?HN40R^L-y2ds*+ zGz>Hk2$Jrz`f>e+IX&WE%<(=4_wSL5yuoRH^eUnN81C9?Nctix9sfpNu1$!7HZeN< zoJjdCR2Bm#Md6 z;Vo)XS)&VdtdsF~6a6vlZUx2(x$C%d)HNL|!K+s%xyc27lbr4pPgp9aO=nHn+gUbH zqUEbx3X+Bmv!c;BBjyKuLC{YH*pxcRlxdA@fW$HBPp-tooBkXFfX^BqT8P=dHgAE9 zwibj~(!|$1nhUK6eo-}rv2RqROD=+Bl;48*eU89Zh36wN~|_}nM@81bf+4dk~089Lw7CU(?WL`=c%*6t3BXV z$nw!3hRHg%uq(R|=dljfGjIK2osM3HexA`mO3uS?7@5jt(Z9&kgNgns9R6 zA-Kt;ug8FJ`uz`Jl7b0kuww{&pgWYTT3ZDaE6#pKs-*&NNVMVkq!zSK3r9pNAWHU<& zvUzkuo=)HRUs~3GB`t@BNQ_Mq&hbb)N0GIN0{g*^iK-`pmM^6<*Rs!YxkQRbjuD-H zo%Q>e3DfgP?XA6tqgA8>^?Uux!G-;KyQqbZ+ocBMxW>?M;*E;R?7{&qT*)rS!A;ph z%dM&`%u?jeCKEY{oW5P9H%#FxsVA=GV8CXXb(Eb~;vh}??!M-+u@A4Egn1V(M{>sP z+*~sD4ax^)#rbn{gLiNr^5(C4_$fbNu_^yJZ0pxe=r?W%EU5@PQAHKtrpuS9 zS3({GQQ5#o=L*8+3S$P>pBVV%0{px9cA8>>hgj;zmEpt*Ueoq@e!5-h&*v;6<2kIlGAs{i4zMjxvd+x=dys+ z5XOGYPZ}dFfzj}sXG5^3sJk7)j0@$vj1>pz_aGzJ1GENjYo5Mwis*<3#}hR~ z-<34!_y5p*O}-d)F9VbNOth3;@xocE-xP8nW2ttLZ=f{M>-qr&fe{@okUlZLFD!f% zs!y4E)KJnucKpF89Lig*b1>S{rRC_3pbgQ8QF4#NuC<473^D0{h-=^05>-1OZ?rtu zn9>u23gc$OMjW_afA)49pqNAk$PUOpUNlT=ArLNp)(Y3Rp3&Jab zi_PGLOgHtl4zdyvRb01OsilIKR>iU9kPSn%bZ&CCK|GzdRAmG@ZB8#WUY2~^T$=O! z=6J&5c6d?MJsM{P=|<@PxNL1b%>T9)9Ti$gnXGI z{|?t<#YQXE@sg0tgZ`v7N(?7#emIIJ+;AMn9Nnc&qs(-!D;f^nGe;b!=VJn7EH#*s zOxV|U-I$CN6SqE6&E|4CY^VG5H4b)Hw!+zc$lv^(doYs>8^QbAH#L|9BV{QYq=jNu)!7dTzEy}L{gi)13aM%vP{)`5&om z|Iyq35tT1+A|OLN5%Yl?x|LFO6v=iC<@O5^zgV@uUFtFx&sX zxB&?L#n92Apa?^Q1-$I3^RQ}jHs`baWynRS!pU1^BeTkZ7iePwwm=mEw z^B%vZfI1k7Tu-h>?wNTSl_PndOYDX2uYk9*H@nfFey38X*<|m z1UT%oxXAx+3P$yW;v(+Lr-V)FD#T$!Bvx5??!@W<<`fGUr?k_ zT$407o_tw7bx$e4%cl5s0s$_*`Z*(xNeQomc=ULUp=f--cRvgL5!(b zb<5KEFMdozt38eV>^XdBee=m{f=&+j(9X+k0N*3Lk4;MAoe2A&o7jR89F^y~b%ukM zV@Z4kZKoZfL#DK3`T0(5TxZ7A+q|#27rs{|9CaB6zu)ZBI*{}+MGyExIv@4qe0oL6 z`1f-c{Ezx7W(S8Z2eYTTratKlt8br7PP?6d^V=%A?$lw`EB0ep;OyjiJIR|Hfj@xt zAD!roM{323hyRKY$lNtso(HZBXM%4c;?XIbBYp`+ch!&c!HEvIz?Lpjy+;?;E<|ZRCf-@ z{3-mw0%P%680#Ox%ti4l`EQP4c5;YMZg3<=0~iRicgxg#?F7(OH28=-MA{#7pxrg_8QAh$kNpvkl0c0 zUEl4BxoE+k`|Peqe;RE?!_8M)d|#!7m&>QPr$N6#ZW=MT9o==(ehuZM8qA^wzM&N1 zs=uB$yBaFNV+xZav`ckx_w|Y=Rt>dD$?}^I zQ{-!D-0oIj`jmMDDY zicWL8>en_+1yIQQ2zt|=`fnd8zt#Hp&Qdwi1k9s1ZRs`tB)q^!<#2t~OvC!v@lF_c zyvi0`F;`r-L(6I*#2B%8B3=AfOZK)CY{mi4Xaq@$Ve170ijwD0v*S3 zD8q%3AG7;B65qZtvG#d&6N_;ATx=YX40USg@j={2fX+J6Knr5PO=TaX?Uz zDO2gajf>&@%>@q>29Q~Y+Ie>X$GaTrOgxzDS~RCPj1v4B@`St*!xGro!ePWM7z`a) zRcwG=QCZ!AD8A%~7wa&7KD%Z%DY|3Ksv;1Z4XNB*jMcONm7|r)uK0VPFV4JI#27+_KKHlS>$my|5%&Udn{~- zR@kv3R_PaYtKVvSwjDbrG`32Ms17^pO+ZD#_@|svfB$~#JF%(Ia!+jN36O^_HWnIz|7j`J88veX+3|g1!*IG zZ1fLri`_6)tH%1<@rk+jZY|Vax-J<;%5Ih>$>s7z#{W$||490>Rk5*0;`9pbGj!Z> zE`Y7^hD~Ons<2b3EDpEEnUGb?=4J?obUyd?R6Pt|!ZKt&kcySZnrcCe{6>-bg9T{> z0}xaP+3Z*_zFX{4$4u#80O}XRM+XMG2+E}A(YROX@ojbvkUkhY_WmJ^NeYIJwi?lv z@`mj(rEw4&DAxU2THxRzov!G7n?*Bt5C4$e#!g6T)ao8g6+S4*HTUG{ptWEMU2nZv z1GV166$=%rW^YY0z$ePt$6FK0e@hkqr!M8iybmgh%jTM}O9nOtTGh|oQIjYv5K#sE z?aJj6h-k-^I~jeohIYRtj=bw26#M6&2DMoUfL>prx}0^CzM;4yTZC*`tQ?ziXsh$X z)xxEK8ZWubf%Z4j2JKRUEkHtQvVPVQV7sW>_!dHX_Fn_v`EX{|73Yd5Zv3V82kJC< zT#L6Rwxm)_okGx-;k@?Oda?aaN|gur_1Y|+C9!8XByUrv=ZiPE-?c?@EF_Xx6cinu z>-$R0-y0?jP>{vwNCJW)PsNA!@#@nd!nEVWocgj=gDUL1VeZ4#JAYF1xKvTb7fT;0>cwP~AOp4{RsuJph z4TZgifNCKoH$Sy#Eh((`4gIG(e+_sGC_zD@|H^-o1HeR(%%1!*|7Cb45b-N-nZ=PA z*qy0n!H#?~ojL3EJX71t^Lb`+w`7;Euc5X8^VmQ8;}{s;ZBM=qY<>L|q9wK8&M?(Q z&+_e8_B;NiHJoXSd(pU0(Gj(SldtOLLCw;jM_)HzB`{)Fd$yG=YN~|YfNmT&FW2;3oA{?B#d+-8 z$q%8vlS8p*9SrH-ORd~^{v&r7At(5;CMs7W*kfDwe4jZOdT`^a5EcG~pLf%jlqjWs zkFoiIuy0}TuT!vBwY(zuO;rUZC;hR8Ugz4gk>v5g?m64jUc+hM)3w-hb$M*!g24OR zcE^Wiac{r<`0EoP&=)xCj@z>!1!R1Ra--p5uu5^D%+CgT$GD{VJ}Bosa8>OT2T*VFD2>sbgleKCsh+-|p)M-&z7=Uld06&IszZ z{{0DEaTv7sk1jiUbM-Io{BUC{;e1nK26Frie->hz@3t)Culx%=UGgpn3tG#YxC0(_ zc@D=-{Q6MxVa(SwJ}H5{&*FRD)iZ9iGm7hm7)k$icrLpSLs8FWyOW@Mjk3V|qp8*; zQWZ}rzggG0y4q-VhuCjiCPlvvoVlEkhp!eK&tz_xdEUs`46HkBO}?`S$q)?;v_5-+ zarRwIv8}gLaXDQ)>rJeqaAmFfJM20p1C=*1%^Pb{M97^X%&F5UnX4uH94F+Kbs4Y9{bsu z`SB&-)FuAW+ickR5wk!qF{{wq0W*hAfcI^p^Jjj?IxqU;UV$>4IWMc8y3 zKqw3NZQ5{feIo35GK1`*gBiZti)(=^BV4A0gGZJ6li@}1#sF)GC$W~!*{`>K3=K5l zJ$S{nKc`x=C;st62eHcIZ?3=w4`R>%64qs|q)f#2ABfZseY7Q6{=;QSEDvXp1P&!j ziEpYE!pt_mqgHl&5R?Q}EwFRMc#Sm3%Ih5=^1PP(k{L&MvuW-l4YU~aG4Ml|MkB_# zE#UWMSAhp(1>RVrZ@FIqfu0|Mvx==IA8-Vm=}D0^KH#I%w?6~##sjkrJ7>+A|I1Y~b}Hv1m}1~@l`17x7EWRIWtleo_ICc>m5)a^ z!?`uD11|D>I1RVy^t!)JFaGi%X3tPha=4fd!ME)E#NyTIOrV_Gw9S`q?{YVuEvZj; z)gp)E6M{NCO;3hv9sTvhlkn3bPnl|04nDIu?&-rT{`|8^r-`S=F5)`QS zy}gNCpD^QpjVfxOWjTKS6?sV@g%+Mz;i8itP#PSpI0HFI7Og*V{h;JJ@e$m7nxTl2)I!M_d9$>-aA90b~ZP}NfVr7Tp+u+aDOSm(MHgRC0{m}qAg z|6DE})q6#Hi=LOSZ1@)4=5jI|K1h6QfqOh#ZId%Kp-d?7JNs$c+L?I3Sqc z{AdobD^2_eyIneA7=S*-nw$$|GaTglUoXgzuJ<_7?PO_kcG`jm!l&Yek5^tURF@tf z-T)U4D@j-haomjI!lZ%er)3hA0KMFxf*>`1a zG6KF!GA>J1&zw3}2h6?Bcvk@&JlAm%2F{Q2U)+$I8l5@^4Z5>(@Gu&7c3zW=lALP$ zWEB;!KGS*{>QAq|bptk8ejAM0WfJjZQh`o2fgRIEObUjRhiJcO~`>xJq8o% zG`g^hExD5J14&~|`9W6%kCb7(>X^J-8eIp)Pt;PnH&~uaGja=L8Z2!J=ymlF%08>x z{`vi+uc^O|;9gbZ?~L83lM2V_XNi?$3y&|$zlyJq$>JNpY4l}**_meMqIdm(ifNs} z{1R=)#qy)K!U%_jNc>Z{HmvzUWQBEf`TQ@^FH($52UHd`K?%+(P8_xlVierLZ6v8Swo8n99dO|BmS zyuN#*b*Zd%|B1=*#-FhxJ6mTgg|h0|I1Pr|Q9Bg379S4o{0K;Z_Nj*>>pT9=2ScTJ zIZD*(X*`*a-WL1p7t(#IlY~lqU%P+uQdbvVarnHJMU08hkojg{drv5Or(#j~b1RC! zpFhR2XX3O2o3%Rp@7#GEUk3_1cf_L(p|A zFn2ErTE6=`h$?`vgd9m=5ODuvF#F$@+>87!8zis_}^8nd8*c8-kYs1-Do-0X0$J4jD{Dc2qq12n#vybF# zOgPn)h8$(Ftagx$3%u~ucbo*j!BGU9-8Pf4(gZF#xwcE=UYG8o?C7(>++sqTh~Mj=rW8R|9=x=h`%(;Z3e%=^?7A|7Ks^r=hw}mI zyps>8+@F~}vs}v8D7FUmtJxnM+mO~0{v-%{*1d1QpGn`G${^nu)@0o-FyWA3^Q&Bc zNh0qaTNamh-ZgBOHo>iw+w3v(LsLc_7h1dBX&J!*v8z_pg8AIl+8EBaHZf1J|Q_}JRUpa&qE8)ekkfQZ5QGP${RwF z`E$9MJ$K<@&{{KQY@&(%q_%9;wgY=Mlh1h>6X*V$U_Pa^1La23?Lb>=|Y%C=j&Iz}tlLVQr=16A4U z-9wf|;Qd8&uq4U!TzGQhY=jgHPQfcPE*%0?nQIMtwwDY&hsM180Chp?gF%+ti!h~8 zj0V;@zN+ji7vgZ9)8Wmc{h!9`i_jMv2V=hs)?gmnFW(ZJndqLO>SYsJ6j99v1X?2J zhDFzs5R#kNh)-|lVLq|H2lHY}l+Y6bw8xg+wfinIcQ^*zZ}K@>@n@gIav-z!()q$N zW+Z(x0i(qAHRiUVyx6x5^HP<~*LlQu61nl~=EJf?Yy@?f_tS?6 z+WW^_0(zL9O|IK_Y%Mh^oS?B3p8zm?atZ!1pFli5O#6D5M2qO_2rbf9K&mA-JfE;r zOH+Tm0-PBtBRlNJ5Ca9n?ZMAS}_(E_pO~!p&S?Y zh2Uz5>BuWc(LZeGsrj|C*aCJ5Y@>a(SsYWhlr5WGWxKd7-E<3yb-aYQ$$ZdOSPMD#|@)v9{oD&H#ygo zrX4wIRDZ<5&8|~P;K!FX$-LsMlc6)Gy9>fWI{76Zyy&k98&had@tQuMMGb&5Mx<0<{PQ7c~6NC!S0hcn117ded#!Qoz z+ZsPvExg!U(yd0Lg+7+9wM#fC;SBU3A1W2Io6}Dj_oHj7uGE*f`)LW*wpjhU?p?Op zedX~Jrcy2**VGnM4u3W5?STDaSp%_jtDk4yGsYo07`|!@*gzUD)B}=oXI~14Whz%~ zsQ+yBLo?BLeaf>KK4~uHkrVm>>;QYDwN`_M8As>+p9MlZLqqp-iyi`5$ICs4OBhvn z={K;Jeoo^XJ#$$uS_*Z)k@!3FN?EkYvCUd=q-IRvU%ojz-oKgs*omTRR_ni$%qW5M z<7Iw1zDzzcc+oBjf{C`-?r5<|W-U8QqTr|=@r@y~q3FC?Ijhi5pFG3X8;@1?vSSz1 zDCT06egn=Y8ZB>0*vzSXe?==c?4^S{n1Gv}+cPKUs`aNrEiRz*+~57FxccM2+++as ziISgY%%#JIIdI(Uy3xfQOJpp-(gWZH)r^=OnDh{2%A)2X=DV38kWZd)4-Dli`|hAV z{NNsVMl&$+$Vk#|lN_`&jko|WoGw0=EsjTFq3shYK1Z9sWx4vd^?E;MoLv$-V8X#! z7QS_Nf&BHBT)Nn(mE`uMj1xF;iys!6z0kvIa7&#|z2uEzB``Ia8AuiEzY>JgLs+su z6t>Ewx&)+Pj@qb5@xP%w|4fMg#)-fTh7Pqs`zmNHxl6%A2tMi63mP$KVfyLZZh-I~ zB{g-Ac)Fcvy1}#pTI@st`YS#q*($LxCa~{L%tkbzgs`ALN_{ zx-ScI2!F(V0TVY)Obw*@#Zqy@;1KjQ%@drq`}A+{brUdD)I9iuP=j29`P2 zI(}P8RA=TJfEnuUS6v*dLlA?mOt)U=!mf6w0+-%ANKv>)(`hM2JgLF1JxEi`bxdzWp%sM zz_i$GmJJ@q2mDa008{)^8(uPO!1B<^koC!$jhO@;a5IR~O@m`zcav5$af>T%64>z#1HIg2IEGDmU6#1IKQBQ!5wu8J1ElFYgK`!s**r` z6kGO;4M|~8(wYohA3q$hRCg2!rudW&q8Y;`JHhw;+P*B9^nD2u#6?unqt+Y(dHAR% z8}NqN9Y0xqB^dch=Y(SU^s|wif(AvCB-gg>J4}xa`{QL1LxqD%!(iA?z=wcWdJwN>7*mZ6P5+_10SuuHKwtPH5}gKj+UH}lbl?3R_m+})Bgvpqy} zGVnUUcPgg%+5f5TslzJF+%bcw5r>(Du?fJkb?^dpA=mNr{6J5qTE#28CPOVW@&Ll`j9ER6;3ic^yQfM9W$5)WNY=?0MUD;S9~mPJ_X=9h3qvC$Bg? zAxPsA1oO5RZ%;Ln&dWIpaw|JctguaHn)zV2`vhNcXI;kED4t?xx|4Gzv4(W!^J&1l z2)sNPH3YM4zWf$B2De{&`(7g#dz_I_tEUlSj=$1LBwd3xU zp`^XLv!|&_@Kn!`fbSox{2J<=z8>5mjd`05?B_LM5w+~$(D#grR57D!?)^#Z-=#Kg zh1n5g0u|?+N)oZR;Ii;RS2}_wyqp-1nojV-+n32bzWMKN&09_P?hJ7>bC%3{!$O$~ z(pp6%1v+nR(01F%JVpC8B_!c=mO03g7)UWLmvmY6*7v->PY*LMcY*%l{X*nZY&pZZ zeu<6hTv1K%`GW`~%SX4)fUC#6Z6nXca;gQLtk1q2SD`FhyHkT#Eh2nNIVv2f`tI!< z7(L78cf$1Em`h`SwXV=%rX%t*UH5hPskQ&73DrLHJ9i7-m1b0C+^%?Ncl>@r^>ep% z>0sJMo0xM(q$8ld(fN^X`kqYcu&@cq4)gn3^R2iwsmRKu?}o6_5I-Sj?11mjV}6Z| zZ!<6N0uRqMJzwLPMCCjud+_|-YA)o*yY`ocQ~j$e9q}9z6E?LO7>)J1vqp{!2H=jM z6yO;bm0#a@a!@Fn;s1m?2I>P2$vE&H2pVi_h&VmTo8VZM(0(_^62$Av8+Pkwz~aHU zdW2d;wdZ?poF8SJ>-_{7H7+d!A}6=G7ETUzUC-{5sSadocxz!I(fqsKy$zHoCEIUxJ%q z!vXZS>pn47xSm5(JpQ=8={f#+E!7|=_Kb)mM95lJ2kZZ9wO7K!ZTgib!$j<$2P}$f z1suKSK9}y6Kvx<=GYX!x4=9y&&_;BwnQ^G0Pc{SwI9PyI)RBpp?)AWuz2}uxzeG#@ zn4R7gzm+5q5|rzCD|+vuZ}>LguDI~@zqBgK_~=$0j;M6c()=*p=QEWjSw^s_rs&@x z9#V2B>!Pk*7kH!Q;qbFR?_HK>PYqM*0yPjc9fHrgq9yqI-$sk#zl@L#m!X>C6kO_<(tgDS7bnarVj3c8y*9b^A75r9>w7FT_XQx@s%1`ayu6mg7Dlm z8&aI%;b~}<(BfDH8TV{=&3XZDbgMC32<&QXX#EWE4si$o7;X3s0#5K8`UUO9`J1Z1 zJprfli-1}CHD-JFC)SSLT~h@u6^yh#6#BXIwQ9_o&Yh+G-dX|Z8+G&=bHstYyPbBs z{{OV$^D6D@On?>%$?Vx=cnd3(A&s8>kUKpRM@<5kO1H8VA#kQpdn$hsI{=r-u6fw% zl`?o!XmwaOiex6vNLdPYDGo8~@$q=SMx%K&69(>(b$zNecu%gHUhP=zF|q6_NZ>@0 zJy#;}5{xmioClBkkpsiYL)uDe#)gb570~x(fs^}@LM=gS}Zl!*e-g>eC z`Zkhg+&;Y;)>jtGAC^v(#^QB}HOZ8T8(VM(*qSV3|2nzCUnT}7v93J`Kql*@Rj;4? zA(uJbyFbAIZXir~4GgtMe*S$U!=?UyWz0b$(i^G*j4{rve1y1Z`pOqx0j02(YIgX$ zrn8t5$^xMYttG?lA)DAtcp}riy7{jMy_Sip5%<=Lf=*-Ju4H=h?U6Q~*J+r&aRobo z$MnmS%y=Rkwob1U^^bD$eQ-t{n>OT4Z{OexxK#J(R^0Of zQV2=I5FVl^RRV;9a1+2P1%*HiC=nyjL+x5`b-lIj&wGEIKliM&&)y%9={L_e)o0vA zs*D(o^0H2ARp$J%Z3-B}i)qE*q*3Lr*7m*f=~+&j0ZW z`{e8mo7-eGHQtf1#Qoi$Rank7Cb1}@>1RIYaJSwEL;M2}dD6(G926i{e!{@G@cIl# z@(pEC{j9xbKDw{fc8IKqMiqvn{(Q*H8`9_1l0jpPT&qlh7PD*i{!judQRZq884?7s zy3w`R+^Tgb07vJX<`q5E1sm4+A>mAFLWp-*m(v)NK_!KyS@oY%AMjk-rnuh>pn9Y^ z-=;t0@2!c!+||_;%bM(fbxRQbF^cZve=gErZ8KNuss}GK&OaE8n}R; zE9iU(tvwo#=FMflYxhK)-9w)$+&ar2gHtx%d_+!V>qCO~7FNBkqc@A#nO^h?ZV7(5 z{8TFTU&QJ4anFAdr=*zSw<FQ@PMw@OA0`l^5DQ8C?d|@*X1G~*o&{!z ziEfX_fv96539Yu}m`2=j+O@6o@pH&#`;PIH z6+g3+1E(}*GYrNm`r|~WrDw_RPl`fGF~jl)`>rcI1iE*?K^|Eqhz5%2efj7?$hE5x zCBdp0vkq!EP2>wXroA`5CdEC1orQrF>7oNiD3_FK;HBx?_z)Xs{ zm#o$v?i8#qd%W=GW$gtw%-T0oxS2}spP#g4o~`WDMvxev)#SmGNKaO3a^Tlb!XiJ>2!3h+QpaTc%Aq!*#N4lE}elSj2;^10tS@ zHHJBj7@X-0tPj1yA)QNnz3wKAoHzWiU?HT0zoo?WYj62U_S^U?j6ZOI6_}%1qj;+p z(UnbzbTil8U1?XJe)LZMHbw=<7Xcl4v^s%_DdfBh_aNSVM4OY3)btltRB#GBa}BN@ z_6nh+k45P2!PHOJ4+dPNC;HVjPAlFnkK#r!1!$VIfto<9@ooa)cYC-A;?}yxw^FzG=Bf83e+KU~Ku0A8i>h^$Sfwgd|YN ziU|u%p{mAXHR9feiFN&n*eY(B;|s)q_C;nY_TIR+)-a+fX_sMkwYRIAAznzyxVv|J zZHIUm8Jz6Pg&!rkBDG^txdktmT!9;;N%hu;tH@u+BR_OyVpr0x&o%Ke0mwanY#f@QnQp5?;`MdUK; zB80XagEfuVB@B-r_B+vLm*3bh3zrdWuwLbFX7LHj+)&MLX`AyErZkzz@yYMU@A~ZX zyR=w_#3nlRYniZ}?_91|Nk(s>TIFD(ry60deYm)?OE zzL@SM4U{QEkJjq`2aq)MA}SP51Mtmz>ryR`XvNYYtE-=bxD?zOfV0D+^|kUI@2qMQBFf=|q(wb5XqEn~&0s@9Sumb=Sdz31@E^8shW{4O zX!!HD1cUKn*m;w(D>4L!YXaL@Iub| zZm9}{ZmqI-)+7C%c)5Cxy(WN%L9~1C@^jFW53bebu2Ggj(QC@0i6T|nWCQCDt{Bhd zFmrj=yAr{afa+icF$`i*S7sdyiJ~CmyhCOnV$!M2y$?&EWoHni$TaIU{V6; z!v{nMj@ulX7lKup;g*atYc755RsK!h;;{o_g7S_*L~o`YjDBh->IB}`e(RS)cj=6S zXs*uNIi}VED2pBJA%UJd+{LGj%|okz4l0d(K5D-P|1+RLsu5E_J!Yc(&r^NocKWBi Y|B+RcXlCC5bAPsA-Hy24aXxwJFUWlU` (work on angle brackets) -- `t` (work on tags) - -The following examples will use parentheses, but they all work for each listed -trigger character accordingly. - -Pair text objects work over multiple lines. - -#### In Pair - -`i( i) ib i{ i} iB i[ i] i< i> it` - -- Select inside of pair characters. -- This overrides Vim's default text object to allow seeking for the next pair - in the current line to the right or left when the cursor is not inside a - pair. This behavior is similar to Vim's seeking behavior of `di'` when not - inside of quotes, but it works both ways. See below for details about - seeking. -- Accepts a count to select multiple blocks. - -``` - ............ -a ( b ( cccccccc ) d ) e - │ └── i) ──┘ │ - └───── 2i) ──────┘ -``` - -#### A Pair - -`a( a) ab a{ a} aB a[ a] a< a> at` - -- Select a pair including pair characters. -- Overrides Vim's default text object to allow seeking. -- Accepts a count. - -``` - ............ -a ( b ( cccccccc ) d ) e - │ └─── a) ───┘ │ - └────── 2a) ───────┘ -``` - -#### Inside Pair - -`I( I) Ib I{ I} IB I[ I] I< I> It` - -- Select contents of pair characters. -- Like inside of parentheses, but exclude whitespace at both ends. Useful for - changing contents while preserving spacing. -- Supports seeking. -- Accepts a count. - -``` - ............ -a ( b ( cccccccc ) d ) e - │ └─ I) ─┘ │ - └──── 2I) ─────┘ -``` - -#### Around Pair - -`A( A) Ab A{ A} AB A[ A] A< A> At` - -- Select around pair characters. -- Like a pair, but include whitespace at one side of the pair. Prefers to - select trailing whitespace, falls back to select leading whitespace. -- Supports seeking. -- Accepts a count. - -``` - ............ -a ( b ( cccccccc ) d ) e - │ └─── A) ────┘ │ - └────── 2A) ────────┘ -``` - -### Next and Last Pair - -`in( an( In( An( il( al( Il( Al( ...` - -Work directly on distant pairs without moving there separately. - -All the above pair text objects can be shifted to the next pair by -including the letter `n`. The command `in)` selects inside of the next -pair. Use the letter `l` instead to work on the previous (last) pair. Uses -a count to skip multiple pairs. Skipping works over multiple lines. - -See our [Cheat Sheet][cheatsheet] for two charts summarizing all pair mappings. - -### Pair Seek - -If any of the normal pair commands (not containing `n` or `l`) is executed when -the cursor is not positioned inside a pair, it seeks for pairs before or after -the cursor by searching for the appropriate delimiter on the current line. This -is similar to using the explicit version containing `n` or `l`, but in only -seeks on the current line. - -## Quote Text Objects - -These text objects are similar to the built in text objects such as `i'`. -Supported trigger characters: - -- `'` (work on single quotes) -- `"` (work on double quotes) -- `` ` `` (work on back ticks) - -The following examples will use single quotes, but they all work for each -mentioned separator character accordingly. - - -Quote text objects work over multiple lines. - -When the cursor is positioned on a quotation mark, the quote text objects count -the numbers of quotation marks from the beginning of the line to choose the -properly quoted text to the left or right of the cursor. - -#### In Quote - -`` i' i" i` `` - -- Select inside quote. -- This overrides Vim's default text object to allow seeking in both directions. - See below for details about seeking. - -``` - ............ -a ' bbbbbbbb ' c ' d - └── i' ──┘ -``` - -#### A Quote - -``a' a" a` `` - -- Select a quote. -- This overrides Vim's default text object to support seeking. -- Unlike Vim's quote text objects, this incudes no surrounding whitespace. - -``` - ............ -a ' bbbbbbbb ' c ' d - └─── a' ───┘ -``` - -#### Inside Quote - -``I' I" I` `` - -- Select contents of a quote. -- Like inside quote, but exclude whitespace at both ends. Useful for changing - contents while preserving spacing. -- Supports seeking. - -``` - ............ -a ' bbbbbbbb ' c ' d - └─ I' ─┘ -``` - -#### Around Quote - -``A' A" A` `` - -- Select around a quote. -- Like a quote, but include whitespace in one direction. Prefers to select - trailing whitespace, falls back to select leading whitespace. -- Supports seeking. - -``` - ............ -a ' bbbbbbbb ' c ' d - └─── A' ────┘ -``` - -### Next and Last Quote - -`in' In' An' il' Il' Al' iN' IN' AN' iL' IL' AL' ...` - -Work directly on distant quotes without moving there separately. - -All the above pair text objects can be shifted to the next quote by -including the letter `n`. The command `in'` selects inside of the next -single quotes. Use the letter `l` instead to work on the previous (last) -quote. Uses a count to skip multiple quotation characters. - -Use uppercase `N` and `L` to jump from within one quote into the next -proper quote, instead of into the pseudo quote in between. (Using `N` -instead of `n` is actually just doubling the count to achieve this.) - -See our [Cheat Sheet][cheatsheet] for a chart summarizing all quote mappings. - -### Quote Seek - -If any of the normal quote commands (not containing `n`, `l`, `N` or `L`) is -executed when the cursor is not positioned inside a quote, it seeks for quotes -before or after the cursor by searching for the appropriate delimiter on the -current line. This is similar to using the explicit version containing `n` or -`l`. - -## Separator Text Objects - -These text objects are based on single separator characters like the comma in -one of our examples above. The text between two instances of the separator -character can be operated on with these targets. - -Supported separators: - -``` -, . ; : + - = ~ _ * # / | \ & $ -``` - -The following examples will use commas, but they all work for each listed -separator character accordingly. - -Separator text objects work over multiple lines. - -#### In Separator - -`i, i. i; i: i+ i- i= i~ i_ i* i# i/ i| i\ i& i$` - -- Select inside separators. Similar to in quote. -- Supports seeking. - -``` - ........... -a , b , cccccccc , d , e - └── i, ──┘ -``` - -#### A Separator - -`a, a. a; a: a+ a- a= a~ a_ a* a# a/ a| a\ a& a$` - -- Select an item in a list separated by the separator character. -- Includes the leading separator, but excludes the trailing one. This leaves - a proper list separated by the separator character after deletion. See the - examples above. -- Supports seeking. - -``` - ........... -a , b , cccccccc , d , e - └─── a, ──┘ -``` - -#### Inside Separator - -`I, I. I; I: I+ I- I= I~ I_ I* I# I/ I| I\ I& I$` - -- Select contents between separators. -- Like inside separators, but exclude whitespace at both ends. Useful for - changing contents while preserving spacing. -- Supports seeking. - -``` - ........... -a , b , cccccccc , d , e - └─ I, ─┘ -``` - -#### Around Separator - -`A, A. A; A: A+ A- A= A~ A_ A* A# A/ A| A\ A& A$` - -- Select around a pair of separators. -- Includes both separators and a surrounding whitespace, similar to `a'` and - `A(`. -- Supports seeking. - -``` - ........... -a , b , cccccccc , d , e - └─── A, ────┘ -``` - -### Next and Last Separator - -`in, an, In, An, il, al, Il, Al, iN, aN, IN, AN, iL, aL, IL, AL, ...` - -Work directly on distant separators without moving there separately. - -All the above separator text objects can be shifted to the next separator by -including the letter `n`. The command `in,` selects inside of the next commas. -Use the letter `l` instead to work on the previous (last) separators. Uses the -count to skip multiple separator characters. - -Use uppercase `N` and `L` to jump from within one pair of separators into -the next distinct pair, instead of into the adjacent one. (Using `N` -instead of `n` is actually just doubling the count to achieve this.) - -See our [Cheat Sheet][cheatsheet] for a chart summarizing all separator mappings. - -### Separator Seek - -Like quote seeking. If any of the normal separator commands (not -containing `n` or `l`) is executed when the cursor is not positioned inside a -pair of separators, it seeks for the separator before or after the cursor. -This is similar to using the explicit version containing `n` or `l`. - -## Argument Text Objects - -These text objects are similar to separator text objects, but are specialized -for arguments surrounded by braces and commas. They also take matching braces -into account to capture only valid arguments. - -Argument text objects work over multiple lines. - -#### In Argument - -`ia` - -- Select inside arguments. Similar to in quote. -- Supports seeking. -- Accepts a count. - -``` - ........... -a , b ( cccccccc , d ) e - └── ia ──┘ -``` - -#### An Argument - -`aa` - -- Select an argument in a list of arguments. -- Includes a separator if preset, but excludes surrounding braces. This leaves - a proper argument list after deletion. -- Supports seeking. -- Accepts a count. - -``` - ........... -a , b ( cccccccc , d ) e - └─── aa ──┘ -``` - -#### Inside Argument - -`Ia` - -- Select content of an argument. -- Like inside separators, but exclude whitespace at both ends. Useful for - changing contents while preserving spacing. -- Supports seeking. -- Accepts a count. - -``` - ........... -a , b ( cccccccc , d ) e - └─ Ia ─┘ -``` - -#### Around Argument - -`Aa` - -- Select around an argument. -- Includes both delimiters and a surrounding whitespace, similar to `a'` and - `A(`. -- Supports seeking. -- Accepts a count. - -``` - ........... -a , b ( cccccccc , d ) e - └─── Aa ────┘ -``` - -### Next and Last Argument - -`ina ana Ina Ana ila ala Ila Ala` - -Work directly on distant arguments without moving there separately. - -All the above argument text objects can be shifted to the next argument by -including the letter `n`. The command `ina` selects inside of the next -argument. Use the letter `l` instead to work on the previous (last) argument. -Uses a [count] to skip multiple argument characters. The order is determined by -the nearest surrounding argument delimiter. - -See our [Cheat Sheet][cheatsheet] for a chart summarizing all argument mappings. - -### Argument Seek - -Like separator seeking. If any of the normal argument commands (not containing -`n` or `l`) is executed when the cursor is not positioned inside an argument, -it seeks for the argument before or after the cursor. This is similar to using -the explicit version containing `n` or `l`. - -## Installation - -Use your favorite plugin manager. - -- [NeoBundle][neobundle] - - ```vim - NeoBundle 'wellle/targets.vim' - ``` - -- [Vundle][vundle] - - ```vim - Bundle 'wellle/targets.vim' - ``` - -- [Pathogen][pathogen] - - ```sh - git clone git://github.com/wellle/targets.vim.git ~/.vim/bundle/targets.vim - ``` - -## Settings - -Put these variables into your vimrc to customize the mappings described above. -The provided examples also indicate the default values. - -Available options: - -```vim -g:targets_aiAI -g:targets_nlNL -g:targets_pairs -g:targets_quotes -g:targets_separators -g:targets_tagTrigger -g:targets_argTrigger -g:targets_argOpening -g:targets_argClosing -g:targets_argSeparator -g:targets_seekRanges -g:targets_jumpRanges -``` - -### g:targets_aiAI - -Default: - -```vim -let g:targets_aiAI = 'aiAI' -``` - -Controls the normal mode operator mode maps that get created for In Pair (`i`), -A Pair (`a`), Inside Pair (`I`), and Around Pair (`A`). Required to be a 4 -character long list. Use a space to deactivate a mode. - -### g:targets_nlNL - -Default: - -```vim -let g:targets_nlNL = 'nlNL' -``` - -Controls the keys used in maps for seeking next and last text objects. For -example, if you don't wish to use the `N` and `L` seeks, and instead wish for -`n` to always search for the next object and `N` to search for the last, you -could set: - -```vim -let g:targets_nlNL = 'nN ' -``` - -Note that two extra spaces are still required on the end, indicating you wish -to disable the default functionality of `N` and `L`. Required to be a 4 -character long list. - -### g:targets_pairs - -Default: - -```vim -let g:targets_pairs = '()b {}B [] <>' -``` - -Defines the space separated list of pair objects you wish to use, along with -optional one letter aliases for them. - -### g:targets_quotes - -Default: - -```vim -let g:targets_quotes = '" '' `' -``` - -Defines the space separated list of quoting objects you wish to use. Note that -you have to escape the single quote by doubling it. Quote objects can -optionally be followed by a single one letter alias. For example, to set `d` -as an alias for double quotes, allowing such commands as `cid` to be -equivalent to `ci"`, you could define: - -```vim -let g:targets_quotes = '"d '' `' -``` - -### g:targets_separators - -Default: - -```vim -let g:targets_separators = ', . ; : + - = ~ _ * # / | \ & $' -``` - -Defines the space separated list of separator objects you wish to use. Like -quote objects, separator objects can optionally be followed by a single one -letter alias. To set `c` as an alias for comma, allowing such commands as -`dic` to be equivalent to `di,`, you could define: - -```vim -let g:targets_separators = ',c . ; : + - = ~ _ * # / | \ & $' -``` - -### g:targets_tagTrigger - -Default: - -```vim -let g:targets_tagTrigger = 't' -``` - -Defines the key you need to press to operate on tag text objects. - -### g:targets_argTrigger - -Default: - -```vim -let g:targets_argTrigger = 'a' -``` - -Defines the key you need to press to operate on arguments. To use `,` as -argument trigger, allowing commands as `da,` to act like `daa`, use this: - -```vim -let g:targets_argTrigger = ',' -``` - -### g:targets_argOpening and g:targets_argClosing - -Default: - -```vim -let g:targets_argOpening = '[([]' -let g:targets_argClosing = '[])]' -``` - -Defines regular expressions that match the beginning and closing delimiter of -an argument list respectively. If you also want to find arguments delimited by -curly braces, try this: - -```vim -let g:targets_argOpening = '[({[]' -let g:targets_argClosing = '[]})]' -``` - -### g:targets_argSeparator - -Default: - -```vim -let g:targets_argSeparator = ',' -``` - -Defines a regular expression matching separators in an argument list. If you -also want to find arguments separatode by semicolon, use this: - -```vim -let g:targets_argSeparator = '[,;]' -``` - -### g:targets_seekRanges - -Default: - -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb al rB Al bb aa bB Aa BB AA' -``` - -Defines a priority ordered, space separated list of range types which can be -used to customize seeking behavior. - -The default setting generally prefers targets around the cursor, with one -exception: If the target around the cursor is not contained in the current -cursor line, but the next or last target are, then prefer those. Targets -beginning or ending on the cursor are preferred over everything else. - -Some other useful example settings: - -Never seek backwards: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr lb ar ab lB Ar aB Ab AB rb rB bb bB BB' -``` - -Only seek if next/last targets touch current line: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb rB al Al' -``` - -Only consider targets fully visible on screen: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr lb ar ab rr rb bb ll al aa' -``` - -Only consider targets around cursor: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr lb ar ab lB Ar aB Ab AB' -``` - -Only consider targets fully contained in current line: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll' -``` - -If you want to build your own, or are just curious what those cryptic letters -mean, check out the full documentation in our [Cheat Sheet][cheatsheet]. - -### g:targets_jumpRanges - -Default: - -```vim -let g:targets_jumpRanges = 'bb bB BB aa Aa AA' ~ -``` - -Defines an unordered, space separated list of range types which can be used to -customize the jumplist behavior (see documentation on seek ranges). It -controls whether or not to add the cursor position prior to selecting the text -object to the jumplist. - -The default setting adds the previous cursor position to the jumplist if the -target that was operated on doesn't intersect the cursor line. That means it -adds a jumplist entry if the target ends above the cursor line or starts below -the cursor line. - -Some other useful example settings (or build your own!): - -Never add cursor position to jumplist: -```vim -let g:targets_jumpRanges = '' ~ -``` - -Always add cursor position to jumplist: -```vim -let g:targets_jumpRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb al rB Al bb aa bB Aa BB AA' ~ -``` - -Only add to jumplist if cursor was not inside the target: -```vim -let g:targets_jumpRanges = 'rr rb rB bb bB BB ll al Al aa Aa AA' ~ -``` - -## Notes - -- [Repeating an operator-pending mapping forgets its last count.][repeatcount] - Works since Vim 7.4.160 - -## Issues - -- [Empty matches can't be selected because it is not possible to visually select - zero-character ranges.][emptyrange] -- Forcing to motion to work linewise by inserting `V` in `dVan(` doesn't work - for operator-pending mappings. [See `:h o_v`][o_v]. -- Report issues or submit pull requests to - [github.com/wellle/targets.vim][targets]. - -## Todos - -Create more mappings to support commands like `danw` or `danp` to delete the -next word or paragraph. - -[cheatsheet]: cheatsheet.md -[textobjects]: http://vimdoc.sourceforge.net/htmldoc/motion.html#text-objects -[operator]: http://vimdoc.sourceforge.net/htmldoc/motion.html#operator -[repeat]: http://vimdoc.sourceforge.net/htmldoc/repeat.html#single-repeat -[neobundle]: https://github.com/Shougo/neobundle.vim -[vundle]: https://github.com/gmarik/vundle -[pathogen]: https://github.com/tpope/vim-pathogen -[repeatcount]: https://groups.google.com/forum/?fromgroups#!topic/vim_dev/G4SSgcRVN7g -[emptyrange]: https://groups.google.com/forum/#!topic/vim_use/qialxUwdcMc -[targets]: https://github.com/wellle/targets.vim -[o_v]: http://vimdoc.sourceforge.net/htmldoc/motion.html#o_v diff --git a/vim/default/bundle/targets.vim/autoload/targets.vim b/vim/default/bundle/targets.vim/autoload/targets.vim deleted file mode 100644 index 55c0195a51..0000000000 --- a/vim/default/bundle/targets.vim/autoload/targets.vim +++ /dev/null @@ -1,1313 +0,0 @@ -" targets.vim Provides additional text objects -" Author: Christian Wellenbrock -" License: MIT license - -" save cpoptions -let s:save_cpoptions = &cpoptions -set cpo&vim - -" called once when loaded -function! s:setup() - let s:argOpeningS = g:targets_argOpening . '\|' . g:targets_argSeparator - let s:argClosingS = g:targets_argClosing . '\|' . g:targets_argSeparator - let s:argOuter = g:targets_argOpening . '\|' . g:targets_argClosing - let s:argAll = s:argOpeningS . '\|' . g:targets_argClosing - let s:none = 'a^' " matches nothing - - let s:rangeScores = {} - let ranges = split(g:targets_seekRanges) - let rangesN = len(ranges) - let i = 0 - while i < rangesN - let s:rangeScores[ranges[i]] = rangesN - i - let i = i + 1 - endwhile - - let s:rangeJumps = {} - let ranges = split(g:targets_jumpRanges) - let rangesN = len(ranges) - let i = 0 - while i < rangesN - let s:rangeJumps[ranges[i]] = 1 - let i = i + 1 - endwhile -endfunction - -call s:setup() - -" a:count is unused here, but added for consistency with targets#x -function! targets#o(trigger, count) - call s:init('o') - let [delimiter, which, modifier] = split(a:trigger, '\zs') - let [target, rawTarget] = s:findTarget(delimiter, which, modifier, v:count1) - if target.state().isInvalid() - return s:cleanUp() - endif - call s:handleTarget(target, rawTarget) - call s:clearCommandLine() - call s:prepareRepeat(delimiter, which, modifier) - call s:cleanUp() -endfunction - -function! targets#e(modifier) - if mode() !=? 'v' - return a:modifier - endif - - let char1 = nr2char(getchar()) - let [delimiter, which, chars] = [char1, 'c', char1] - let i = 0 - while i < 4 - if g:targets_nlNL[i] ==# delimiter - " delimiter was which, get another char for delimiter - let char2 = nr2char(getchar()) - let [delimiter, which, chars] = [char2, 'nlNL'[i], chars . char2] - break - endif - let i = i + 1 - endwhile - - let [_, _, _, err] = s:getDelimiters(delimiter) - if err - return a:modifier . chars - endif - - if delimiter ==# "'" - let delimiter = "''" - endif - - return "\:\call targets#x('" . delimiter . which . a:modifier . "', " . v:count1 . ")\" -endfunction - -function! targets#x(trigger, count) - call s:initX(a:trigger) - - let [delimiter, which, modifier] = split(a:trigger, '\zs') - let [target, rawTarget] = s:findTarget(delimiter, which, modifier, a:count) - if target.state().isInvalid() - call s:abortMatch('#x') - return s:cleanUp() - endif - if s:handleTarget(target, rawTarget) == 0 - let s:lastTrigger = a:trigger - let s:lastRawTarget = rawTarget - let s:lastTarget = target - endif - call s:cleanUp() -endfunction - -" initialize script local variables for the current matching -function! s:init(mapmode) - let s:mapmode = a:mapmode - let s:oldpos = getpos('.') - let s:newSelection = 1 - let s:shouldGrow = 1 - - let s:selection = &selection " remember 'selection' setting - let &selection = 'inclusive' " and set it to inclusive - - let s:virtualedit = &virtualedit " remember 'virtualedit' setting - let &virtualedit = '' " and set it to default -endfunction - -" save old visual selection to detect new selections and reselect on fail -function! s:initX(trigger) - call s:init('x') - - let s:visualTarget = targets#target#fromVisualSelection() - - " reselect, save mode and go back to normal mode - normal! gv - if mode() ==# 'V' - let s:visualTarget.linewise = 1 - normal! V - else - normal! v - endif - - let s:newSelection = s:isNewSelection() - let s:shouldGrow = s:shouldGrow(a:trigger) -endfunction - -" clean up script variables after match -function! s:cleanUp() - " reset remembered settings - let &selection = s:selection - let &virtualedit = s:virtualedit -endfunction - -function! s:findTarget(delimiter, which, modifier, count) - let [kind, s:opening, s:closing, err] = s:getDelimiters(a:delimiter) - if err - let errorTarget = targets#target#withError("failed to find delimiter") - return [errorTarget, errorTarget] - endif - - let view = winsaveview() - let rawTarget = s:findRawTarget(kind, a:which, a:count) - let target = s:modifyTarget(rawTarget, kind, a:modifier) - call winrestview(view) - return [target, rawTarget] -endfunction - -function! s:findRawTarget(kind, which, count) - if a:kind ==# 'p' - if a:which ==# 'c' - return s:seekselectp(a:count + s:grow()) - elseif a:which ==# 'n' - call s:nextp(a:count) - return s:selectp() - elseif a:which ==# 'l' - call s:lastp(a:count) - return s:selectp() - else - return targets#target#withError('findRawTarget p') - endif - - elseif a:kind ==# 'q' - if a:which ==# 'c' - call s:quote() - return s:seekselect() - elseif a:which ==# 'n' - call s:quote() - return s:nextselect(a:count) - elseif a:which ==# 'l' - call s:quote() - return s:lastselect(a:count) - elseif a:which ==# 'N' - call s:quote() - return s:nextselect(a:count * 2) - elseif a:which ==# 'L' - call s:quote() - return s:lastselect(a:count * 2) - else - return targets#target#withError('findRawTarget q') - endif - - elseif a:kind ==# 's' - if a:which ==# 'c' - return s:seekselect() - elseif a:which ==# 'n' - return s:nextselect(a:count) - elseif a:which ==# 'l' - return s:lastselect(a:count) - elseif a:which ==# 'N' - return s:nextselect(a:count * 2) - elseif a:which ==# 'L' - return s:lastselect(a:count * 2) - else - return targets#target#withError('findRawTarget s') - endif - - elseif a:kind ==# 't' - if a:which ==# 'c' - return s:seekselectt(a:count + s:grow()) - elseif a:which ==# 'n' - call s:nextt(a:count) - return s:selectp() - elseif a:which ==# 'l' - call s:lastt(a:count) - return s:selectp() - else - return targets#target#withError('findRawTarget t') - endif - - elseif a:kind ==# 'a' - if a:which ==# 'c' - return s:seekselecta(a:count + s:grow()) - elseif a:which ==# 'n' - return s:nextselecta(a:count) - elseif a:which ==# 'l' - return s:lastselecta(a:count) - else - return targets#target#withError('findRawTarget a') - endif - endif - - return targets#target#withError('findRawTarget kind') -endfunction - -function! s:modifyTarget(target, kind, modifier) - if a:target.state().isInvalid() - return targets#target#withError('modifyTarget invalid') - endif - let target = a:target.copy() - - if a:kind ==# 'p' - if a:modifier ==# 'i' - return s:drop(target) - elseif a:modifier ==# 'a' - return target - elseif a:modifier ==# 'I' - return s:shrink(target) - elseif a:modifier ==# 'A' - return s:expand(target) - else - return targets#target#withError('modifyTarget p') - endif - - elseif a:kind ==# 'q' - if a:modifier ==# 'i' - return s:drop(target) - elseif a:modifier ==# 'a' - return target - elseif a:modifier ==# 'I' - return s:shrink(target) - elseif a:modifier ==# 'A' - return s:expand(target) - else - return targets#target#withError('modifyTarget q') - endif - - elseif a:kind ==# 's' - if a:modifier ==# 'i' - return s:drop(target) - elseif a:modifier ==# 'a' - return s:dropr(target) - elseif a:modifier ==# 'I' - return s:shrink(target) - elseif a:modifier ==# 'A' - return s:expand(target) - else - return targets#target#withError('modifyTarget s') - endif - - elseif a:kind ==# 't' - if a:modifier ==# 'i' - let target = s:innert(target) - return s:drop(target) - elseif a:modifier ==# 'a' - return target - elseif a:modifier ==# 'I' - let target = s:innert(target) - return s:shrink(target) - elseif a:modifier ==# 'A' - return s:expand(target) - else - return targets#target#withError('modifyTarget t') - endif - - elseif a:kind ==# 'a' - if a:modifier ==# 'i' - return s:drop(target) - elseif a:modifier ==# 'a' - return s:dropa(target) - elseif a:modifier ==# 'I' - return s:shrink(target) - elseif a:modifier ==# 'A' - return s:expand(target) - else - return targets#target#withError('modifyTarget a') - endif - endif - - return targets#target#withError('modifyTarget kind') -endfunction - -function! s:getDelimiters(trigger) - " create cache - if !exists('s:delimiterCache') - let s:delimiterCache = {} - endif - - " check cache - if has_key(s:delimiterCache, a:trigger) - let [kind, opening, closing] = s:delimiterCache[a:trigger] - return [kind, opening, closing, 0] - endif - - let [kind, rawOpening, rawClosing, err] = s:getRawDelimiters(a:trigger) - if err > 0 - return [0, 0, 0, err] - endif - - let opening = s:modifyDelimiter(kind, rawOpening) - let closing = s:modifyDelimiter(kind, rawClosing) - - " write to cache - let s:delimiterCache[a:trigger] = [kind, opening, closing] - - return [kind, opening, closing, 0] -endfunction - -function! s:getRawDelimiters(trigger) - for pair in split(g:targets_pairs) - for trigger in split(pair, '\zs') - if trigger ==# a:trigger - return ['p', pair[0], pair[1], 0] - endif - endfor - endfor - - for quote in split(g:targets_quotes) - for trigger in split(quote, '\zs') - if trigger ==# a:trigger - return ['q', quote[0], quote[0], 0] - endif - endfor - endfor - - for separator in split(g:targets_separators) - for trigger in split(separator, '\zs') - if trigger ==# a:trigger - return ['s', separator[0], separator[0], 0] - endif - endfor - endfor - - if a:trigger ==# g:targets_tagTrigger - return ['t', 't', 0, 0] " TODO: set tag patterns here and remove special tag functions? - elseif a:trigger ==# g:targets_argTrigger - return ['a', 0, 0, 0] - else - return [0, 0, 0, 1] - endif -endfunction - -function! s:modifyDelimiter(kind, delimiter) - let delimiter = escape(a:delimiter, '.~\$') - if a:kind !=# 'q' || "eescape ==# '' - return delimiter - endif - - let escapedqe = escape("eescape, ']^-\') - let lookbehind = '[' . escapedqe . ']' - if v:version >= 704 - return lookbehind . '\@1v" - - let &eventignore = eventignore " restore setting -endfunction - -" abort when no match was found -function! s:abortMatch(message) - " get into normal mode and beep - if !exists("*getcmdwintype") || getcmdwintype() ==# "" - call feedkeys("\\\", 'n') - endif - - call s:prepareReselect() - call setpos('.', s:oldpos) - - " undo partial command - call s:triggerUndo() - " trigger reselect if called from xmap - call s:triggerReselect() - - return s:fail(a:message) -endfunction - -" feed keys to call undo after aborted operation and clear the command line -function! s:triggerUndo() - if exists("*undotree") - let undoseq = undotree().seq_cur - call feedkeys(":call targets#undo(" . undoseq . ")\:echo\", 'n') - endif -endfunction - -" temporarily select original selection to reselect later -function! s:prepareReselect() - if s:mapmode ==# 'x' - call s:selectRegion(s:visualTarget) - endif -endfunction - -" feed keys to reselect the last visual selection if called with mapmode x -function! s:triggerReselect() - if s:mapmode ==# 'x' - call feedkeys("gv", 'n') - endif -endfunction - -" set up repeat.vim for older Vim versions -function! s:prepareRepeat(delimiter, which, modifier) - if v:version >= 704 " skip recent versions - return - endif - - if v:operator ==# 'y' && match(&cpoptions, 'y') ==# -1 " skip yank unless set up - return - endif - - let cmd = v:operator . a:modifier - if a:which !=# 'c' - let cmd .= a:which - endif - let cmd .= a:delimiter - if v:operator ==# 'c' - let cmd .= "\.\" - endif - - silent! call repeat#set(cmd, v:count) -endfunction - -" undo last operation if it created a new undo position -function! targets#undo(lastseq) - if undotree().seq_cur > a:lastseq - silent! execute "normal! u" - endif -endfunction - -" position modifiers -" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - -" move the cursor inside of a proper quote when positioned on a delimiter -" (move one character to the left when over an odd number of quotation mark) -" the number of delimiters to the left of the cursor is counted to decide -" if this is an opening or closing quote delimiter -" in │ . │ . │ . │ . -" line │ ' │ ' │ ' │ ' -" out │ . │ . │ . │ . -function! s:quote() - if s:getchar() !=# s:opening - return - endif - - let oldpos = getpos('.') - let closing = 1 - let line = 1 - while line != 0 - let line = searchpos(s:opening, 'b', line('.'))[0] - let closing = !closing - endwhile - call setpos('.', oldpos) - if closing " cursor is on closing delimiter - silent! normal! h - endif -endfunction - -" find `count` next delimiter (multi line) -" in │ ... -" line │ ' ' ' ' -" out │ 1 2 -" args (count=1) -function! s:nextselect(...) - let cnt = a:0 == 1 ? a:1 : 1 - - call s:prepareNext() - - if s:search(cnt, s:opening, 'W') > 0 - return targets#target#withError('nextselect') - endif - - return s:select('>') -endfunction - -" find `count` last delimiter, move in front of it (multi line) -" in │ ... -" line │ ' ' ' ' -" out │ 2 1 -" args (count=1) -function! s:lastselect(...) - let cnt = a:0 == 1 ? a:1 : 1 - - " if started on closing, but not when skipping - if !s:prepareLast() && s:getchar() ==# s:closing - let [cnt, message] = [cnt - 1, 'lastselect 1'] - else - let [cnt, message] = [cnt, 'lastselect 2'] - endif - - if s:search(cnt, s:closing, 'bW') > 0 - return targets#target#withError(message) - endif - - return s:select('<') -endfunction - -" find `count` next opening delimiter (multi line) -" in │ .... -" line │ ( ) ( ) ( ( ) ) ( ) -" out │ 1 2 3 4 -function! s:nextp(count) - call s:prepareNext() - return s:search(a:count, s:opening, 'W') -endfunction - -" find `count` last closing delimiter (multi line) -" in │ .... -" line │ ( ) ( ) ( ( ) ) ( ) -" out │ 4 3 2 1 -function! s:lastp(count) - call s:prepareLast() - return s:search(a:count, s:closing, 'bW') -endfunction - -" find `count` next opening tag delimiter (multi line) -" in │ ......... -" line │ -" out │ 1 2 3 4 -function! s:nextt(count) - call s:prepareNext() - return s:search(a:count, '<\a', 'W') -endfunction - -" find `count` last closing tag delimiter (multi line) -" in │ ......... -" line │ -" out │ 4 3 2 1 -function! s:lastt(count) - call s:prepareLast() - return s:search(a:count, '' - let [sl, sc, el, ec, err] = s:findSeparators('bcW', 'W', s:opening, s:closing) - let message = 'select 1' - else - let [el, ec, sl, sc, err] = s:findSeparators('cW', 'bW', s:closing, s:opening) - let message = 'select 2' - endif - - if err > 0 - call setpos('.', oldpos) - return targets#target#withError(message) - endif - - let target = targets#target#fromValues(sl, sc, el, ec) - return target -endfunction - -" TODO: inject direction and return proper target -" find separators around cursor by searching for opening with flags1 and for -" closing with flags2 -function! s:findSeparators(flags1, flags2, opening, closing) - let [sl, sc] = searchpos(a:opening, a:flags1) - if sc == 0 " no match to the left - return [0, 0, 0, 0, s:fail('findSeparators 1')] - endif - - let [el, ec] = searchpos(a:closing, a:flags2) - if ec == 0 " no match to the right - return [0, 0, 0, 0, s:fail('findSeparators 2')] - endif - - return [sl, sc, el, ec, 0] -endfunction - -" select pair of delimiters around cursor (multi line, supports seeking) -function! s:seekselect() - let min = line('w0') - let max = line('w$') - let oldpos = getpos('.') - - let around = s:select('>') - - call setpos('.', oldpos) - - let last = s:lastselect() - - call setpos('.', oldpos) - - let next = s:nextselect() - - return s:bestSeekTarget([around, next, last], oldpos, min, max, 'seekselect') -endfunction - -" select a pair around the cursor -" args (count=1, trigger=s:opening) -function! s:selectp(...) - if a:0 == 2 - let [cnt, trigger] = [a:1, a:2] - else - let [cnt, trigger] = [1, s:opening] - endif - - " try to select pair - silent! execute 'keepjumps normal! v' . cnt . 'a' . trigger - let [el, ec] = getpos('.')[1:2] - silent! normal! o - let [sl, sc] = getpos('.')[1:2] - silent! normal! v - - if sc == ec && sl == el - return targets#target#withError('selectp') - endif - - return targets#target#fromValues(sl, sc, el, ec) -endfunction - -" pair matcher (works across multiple lines, supports seeking) -" cursor │ ..... -" line │ ( ( a ) ) -" modifier │ │ └─1─┘ │ -" │ └── 2 ──┘ -" args (count, opening=s:opening, closing=s:closing, trigger=s:closing) -function! s:seekselectp(...) - if a:0 == 4 - let [cnt, opening, closing, trigger] = [a:1, a:2, a:3, a:4] - else - let [cnt, opening, closing, trigger] = [a:1, s:opening, s:closing, s:closing] - endif - - let min = line('w0') - let max = line('w$') - let oldpos = getpos('.') - - let around = s:selectp(cnt, trigger) - - if cnt > 1 " don't seek with count - return around - endif - - call setpos('.', oldpos) - - call s:lastp(cnt) - let last = s:selectp() - - call setpos('.', oldpos) - - call s:nextp(cnt) - let next = s:selectp() - - return s:bestSeekTarget([around, next, last], oldpos, min, max, 'seekselectp') -endfunction - -" tag pair matcher (works across multiple lines, supports seeking) -function! s:seekselectt(count) - return s:seekselectp(a:count, '<\a', '' select to the right (default) -" '<' select to the left (used when selecting or skipping to the left) -" '^' select up (surrounding argument, used for growing) -function! s:selecta(direction) - let oldpos = getpos('.') - - let [opening, closing] = [g:targets_argOpening, g:targets_argClosing] - if a:direction ==# '^' - let [sl, sc, el, ec, err] = s:findArg(a:direction, 'W', 'bcW', 'bW', opening, closing) - let message = 'selecta 1' - elseif a:direction ==# '>' - let [sl, sc, el, ec, err] = s:findArg(a:direction, 'W', 'bW', 'bW', opening, closing) - let message = 'selecta 2' - elseif a:direction ==# '<' " like '>', but backwards - let [el, ec, sl, sc, err] = s:findArg(a:direction, 'bW', 'W', 'W', closing, opening) - let message = 'selecta 3' - else - return targets#target#withError('selecta') - endif - - if err > 0 - call setpos('.', oldpos) - return targets#target#withError(message) - endif - - return targets#target#fromValues(sl, sc, el, ec) -endfunction - -" find an argument around the cursor given a direction (see s:selecta) -" uses flags1 to search for end to the right; flags1 and flags2 to search for -" start to the left -function! s:findArg(direction, flags1, flags2, flags3, opening, closing) - let oldpos = getpos('.') - let char = s:getchar() - let separator = g:targets_argSeparator - - if char =~# a:closing && a:direction !=# '^' " started on closing, but not up - let [el, ec] = oldpos[1:2] " use old position as end - else " find end to the right - let [el, ec, err] = s:findArgBoundary(a:flags1, a:flags1, a:opening, a:closing) - if err > 0 " no closing found - return [0, 0, 0, 0, s:fail('findArg 1', a:)] - endif - - let separator = g:targets_argSeparator - if char =~# a:opening || char =~# separator " started on opening or separator - let [sl, sc] = oldpos[1:2] " use old position as start - return [sl, sc, el, ec, 0] - endif - - call setpos('.', oldpos) " return to old position - endif - - " find start to the left - let [sl, sc, err] = s:findArgBoundary(a:flags2, a:flags3, a:closing, a:opening) - if err > 0 " no opening found - return [0, 0, 0, 0, s:fail('findArg 2')] - endif - - return [sl, sc, el, ec, 0] -endfunction - -" find arg boundary by search for `finish` or `separator` while skipping -" matching `skip`s -" example: find ',' or ')' while skipping a pair when finding '(' -" args (flags1, flags2, skip, finish, all=s:argAll, -" separator=g:targets_argSeparator, cnt=2) -" return (line, column, err) -function! s:findArgBoundary(...) - let [flags1, flags2, skip, finish] = [a:1, a:2, a:3, a:4] - if a:0 == 7 - let [all, separator, cnt] = [a:5, a:6, a:7] - else - let [all, separator, cnt] = [s:argAll, g:targets_argSeparator, 1] - endif - - let tl = 0 - for _ in range(cnt) - let [rl, rc] = searchpos(all, flags1) - while 1 - if rl == 0 - return [0, 0, s:fail('findArgBoundary 1', a:)] - endif - - let char = s:getchar() - if char =~# separator - if tl == 0 - let [tl, tc] = [rl, rc] - endif - elseif char =~# finish - if tl > 0 - return [tl, tc, 0] - endif - break - elseif char =~# skip - silent! keepjumps normal! % - else - return [0, 0, s:fail('findArgBoundary 2')] - endif - let [rl, rc] = searchpos(all, flags2) - endwhile - endfor - - return [rl, rc, 0] -endfunction - -" selects and argument, supports growing and seeking -function! s:seekselecta(count) - if a:count > 1 - if s:getchar() =~# g:targets_argClosing - let [cnt, message] = [a:count - 2, 'seekselecta 1'] - else - let [cnt, message] = [a:count - 1, 'seekselecta 2'] - endif - " find cnt closing while skipping matched openings - let [opening, closing] = [g:targets_argOpening, g:targets_argClosing] - if s:findArgBoundary('W', 'W', opening, closing, s:argOuter, s:none, cnt)[2] > 0 - return targets#target#withError(message . ' count') - endif - return s:selecta('^') - endif - - let min = line('w0') - let max = line('w$') - let oldpos = getpos('.') - - let around = s:selecta('>') - - if a:count > 1 " don't seek with count - return around - endif - - call setpos('.', oldpos) - - let last = s:lastselecta() - - call setpos('.', oldpos) - - let next = s:nextselecta() - - return s:bestSeekTarget([around, next, last], oldpos, min, max, 'seekselecta') -endfunction - -" try to select a next argument, supports count and optional stopline -" args (count=1, stopline=0) -function! s:nextselecta(...) - let [cnt, stopline] = [a:0 > 0 ? a:1 : 1, a:0 > 1 ? a:2 : 0] - call s:prepareNext() - - if s:search(cnt, s:argOpeningS, 'W', stopline) > 0 " no start found - return targets#target#withError('nextselecta 1') - endif - - let char = s:getchar() - let target = s:selecta('>') - if target.state().isValid() - return target - endif - - if char !~# g:targets_argSeparator " start wasn't on comma - return targets#target#withError('nextselecta 2') - endif - - call setpos('.', s:oldpos) - let opening = g:targets_argOpening - if s:search(cnt, opening, 'W', stopline) > 0 " no start found - return targets#target#withError('nextselecta 3') - endif - - let target = s:selecta('>') - if target.state().isValid() - return target - endif - - return targets#target#withError('nextselecta 4') -endfunction - -" try to select a last argument, supports count and optional stopline -" args (count=1, stopline=0) -function! s:lastselecta(...) - let [cnt, stopline] = [a:0 > 0 ? a:1 : 1, a:0 > 1 ? a:2 : 0] - - call s:prepareLast() - - " special case to handle vala when invoked on a separator - let separator = g:targets_argSeparator - if s:getchar() =~# separator && s:newSelection - let target = s:selecta('<') - if target.state().isValid() - return target - endif - endif - - if s:search(cnt, s:argClosingS, 'bW', stopline) > 0 " no start found - return targets#target#withError('lastselecta 1') - endif - - let char = s:getchar() - let target = s:selecta('<') - if target.state().isValid() - return target - endif - - if char !~# separator " start wasn't on separator - return targets#target#withError('lastselecta 2') - endif - - call setpos('.', s:oldpos) - let closing = g:targets_argClosing - if s:search(cnt, closing, 'bW', stopline) > 0 " no start found - return targets#target#withError('lastselecta 3') - endif - - let target = s:selecta('<') - if target.state().isValid() - return target - endif - - return targets#target#withError('lastselecta 4') -endfunction - -" select best of given targets according to s:rangeScores -" detects for each given target what range type it has, depending on the -" relative positions of the start and end of the target relative to the cursor -" position and the currently visible lines - -" The possibly relative positions are: -" c - on cursor position -" l - left of cursor in current line -" r - right of cursor in current line -" a - above cursor on screen -" b - below cursor on screen -" A - above cursor off screen -" B - below cursor off screen - -" All possibly ranges are listed below, denoted by two characters: one for the -" relative start and for the relative end position each of the target. For -" example, `lr` means "from left of cursor to right of cursor in cursor line". - -" Next to each range type is a pictogram of an example. They are made of these -" symbols: -" . - current cursor position -" ( ) - start and end of target -" / - line break before and after cursor line -" | - screen edge between hidden and visible lines - -" ranges on cursor: -" cr | / () / | starting on cursor, current line -" cb | / ( /) | starting on cursor, multiline down, on screen -" cB | / ( / |) starting on cursor, multiline down, partially off screen -" lc | / () / | ending on cursor, current line -" ac | (/ ) / | ending on cursor, multiline up, on screen -" Ac (| / ) / | ending on cursor, multiline up, partially off screen - -" ranges around cursor: -" lr | / (.) / | around cursor, current line -" lb | / (. /) | around cursor, multiline down, on screen -" ar | (/ .) / | around cursor, multiline up, on screen -" ab | (/ . /) | around cursor, multiline both, on screen -" lB | / (. / |) around cursor, multiline down, partially off screen -" Ar (| / .) / | around cursor, multiline up, partially off screen -" aB | (/ . / |) around cursor, multiline both, partially off screen bottom -" Ab (| / . /) | around cursor, multiline both, partially off screen top -" AB (| / . / |) around cursor, multiline both, partially off screen both - -" ranges after (right of/below) cursor -" rr | / .()/ | after cursor, current line -" rb | / .( /) | after cursor, multiline, on screen -" rB | / .( / |) after cursor, multiline, partially off screen -" bb | / . /()| after cursor below, on screen -" bB | / . /( |) after cursor below, partially off screen -" BB | / . / |() after cursor below, off screen - -" ranges before (left of/above) cursor -" ll | /(). / | before cursor, current line -" al | (/ ). / | before cursor, multiline, on screen -" Al (| / ). / | before cursor, multiline, partially off screen -" aa |()/ . / | before cursor above, on screen -" Aa (| )/ . / | before cursor above, partially off screen -" AA ()| / . / | before cursor above, off screen - -" A a l r b B relative positions -" └───────────┘ visible screen -" └─────┘ current line - -function! s:bestSeekTarget(targets, oldpos, min, max, message) - let bestScore = 0 - for target in a:targets - let range = target.range(a:oldpos, a:min, a:max) - let score = get(s:rangeScores, range) - if bestScore < score - let bestScore = score - let best = target - endif - endfor - - if bestScore > 0 - return best - endif - - return targets#target#withError(a:message) -endfunction - -" selection modifiers -" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - -" drop delimiters left and right -" remove last line of multiline selection if it consists of whitespace only -" in │ ┌─────┐ -" line │ a . b . c -" out │ └───┘ -function! s:drop(target) - if a:target.state().isInvalid() - return a:target - endif - - let [sLinewise, eLinewise] = [0, 0] - call a:target.cursorS() - if searchpos('\S', 'nW', line('.'))[0] == 0 - " if only whitespace after cursor - let sLinewise = 1 - endif - silent! execute "normal! 1 " - call a:target.getposS() - - call a:target.cursorE() - if a:target.sl < a:target.el && searchpos('\S', 'bnW', line('.'))[0] == 0 - " if only whitespace in front of cursor - let eLinewise = 1 - " move to end of line above - normal! -$ - else - " one character back - silent! execute "normal! \" - endif - call a:target.getposE() - let a:target.linewise = sLinewise && eLinewise - return a:target -endfunction - -" drop right delimiter -" in │ ┌─────┐ -" line │ a . b c . d -" out │ └────┘ -function! s:dropr(target) - call a:target.cursorE() - silent! execute "normal! \" - call a:target.getposE() - return a:target -endfunction - -" drop an argument separator (like a comma), prefer the right one, fall back -" to the left (one on first argument) -" in │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ -" line │ ( x ) ( x , a ) (a , x , b) ( a , x ) -" out │ └─┘ └──┘ └──┘ └──┘ -function! s:dropa(target) - let startOpening = a:target.getcharS() !~# g:targets_argSeparator - let endOpening = a:target.getcharE() !~# g:targets_argSeparator - - if startOpening - if endOpening - " ( x ) select space on both sides - return s:drop(a:target) - else - " ( x , a ) select separator and space after - call a:target.cursorS() - call a:target.searchposS('\S', '', a:target.el) - return s:expand(a:target, '>') - endif - else - if !endOpening - " (a , x , b) select leading separator, no surrounding space - return s:dropr(a:target) - else - " ( a , x ) select separator and space before - call a:target.cursorE() - call a:target.searchposE('\S', 'b', a:target.sl) - return s:expand(a:target, '<') - endif - endif -endfunction - -" select inner tag delimiters -" in │ ┌──────────┐ -" line │ a c c -" out │ └─────┘ -function! s:innert(target) - call a:target.cursorS() - call a:target.searchposS('>', 'W') - call a:target.cursorE() - call a:target.searchposE('<', 'bW') - return a:target -endfunction - -" drop delimiters and whitespace left and right -" fall back to drop when only whitespace is inside -" in │ ┌─────┐ │ ┌──┐ -" line │ a . b c . d │ a . . d -" out │ └─┘ │ └┘ -function! s:shrink(target) - if a:target.state().isInvalid() - return a:target - endif - - call a:target.cursorE() - call a:target.searchposE('\S', 'b', a:target.sl) - if a:target.state().isInvalidOrEmpty() - " fall back to drop when there's only whitespace in between - return s:drop(a:target) - else - call a:target.cursorS() - call a:target.searchposS('\S', '', a:target.el) - endif - return a:target -endfunction - -" expand selection by some whitespace -" in │ ┌───┐ │ ┌───┐ │ ┌───┐ │ ┌───┐ -" line │ a . b . c │ a . b .c │ a. c .c │ . a .c -" out │ └────┘ │ └────┘ │ └───┘ │└────┘ -" args (target, direction=) -function! s:expand(...) - let target = a:1 - - if a:0 == 1 || a:2 ==# '>' - call target.cursorE() - let [line, column] = searchpos('\S\|$', '', line('.')) - if line > 0 && column-1 > target.ec - " non whitespace or EOL after trailing whitespace found - " not counting whitespace directly after end - call target.setE(line, column-1) - return target - endif - endif - - if a:0 == 1 || a:2 ==# '<' - call target.cursorS() - let [line, column] = searchpos('\S', 'b', line('.')) - if line > 0 - " non whitespace before leading whitespace found - call target.setS(line, column+1) - return target - endif - " only whitespace in front of start - " include all leading whitespace from beginning of line - let target.sc = 1 - endif - - return target -endfunction - -" return 1 if count should be increased by one to grow selection on repeated -" invocations -function! s:grow() - if s:mapmode ==# 'o' || !s:shouldGrow - return 0 - endif - - " move cursor back to last raw end of selection to avoid growing being - " confused by last modifiers - call s:prepareNext() - - return 1 -endfunction - -" if in visual mode, move cursor to start of last raw selection -" also used in s:grow to move to last raw end -function! s:prepareNext() - if s:newSelection - return - endif - - if s:mapmode ==# 'x' && exists('s:lastRawTarget') && s:lastRawTarget.state().isNonempty() - call s:lastRawTarget.cursorS() - endif -endfunction - -" if in visual mode, move cursor to end of last raw selection -" returns whether or not the cursor was moved -function! s:prepareLast() - if s:newSelection - return - endif - - if s:mapmode ==# 'x' && exists('s:lastRawTarget') && s:lastRawTarget.state().isNonempty() - call s:lastRawTarget.cursorE() - return 1 - endif -endfunction - -" returns the character under the cursor -function! s:getchar() - return getline('.')[col('.')-1] -endfunction - -" search for pattern using flags and a count, optional stopline -" args (cnt, pattern, flags, stopline=0) -function! s:search(...) - let [cnt, pattern, flags] = [a:1, a:2, a:3] - if a:0 == 4 - let stopline = a:4 - elseif a:0 == 3 - let stopline = 0 - endif - - for _ in range(cnt) - let line = searchpos(pattern, flags, stopline)[0] - if line == 0 " not enough found - return s:fail('search') - endif - endfor -endfunction - -" return 1 and send a message to s:debug -" args (message, parameters=nil) -function! s:fail(...) - if a:0 == 2 - call s:debug('fail ' . a:1 . ' ' . string(a:2)) - else - call s:debug('fail ' . a:1) - endif - return 1 -endfunction - -" useful for debugging -function! s:debug(message) - " echom a:message -endfunction - -" reset cpoptions -let &cpoptions = s:save_cpoptions -unlet s:save_cpoptions diff --git a/vim/default/bundle/targets.vim/autoload/targets/state.vim b/vim/default/bundle/targets.vim/autoload/targets/state.vim deleted file mode 100644 index 7e4e4fdca7..0000000000 --- a/vim/default/bundle/targets.vim/autoload/targets/state.vim +++ /dev/null @@ -1,54 +0,0 @@ -let s:invalid = 0 -let s:empty = 1 -let s:nonempty = 2 - -function! targets#state#new(state) - return { - \ 'state': a:state, - \ - \ 'isInvalid': function('targets#state#isInvalid'), - \ 'isEmpty': function('targets#state#isEmpty'), - \ 'isNonempty': function('targets#state#isNonempty'), - \ 'isValid': function('targets#state#isValid'), - \ 'isInvalidOrEmpty': function('targets#state#isInvalidOrEmpty'), - \ } -endfunction - -" constructors - -function! targets#state#invalid() - return targets#state#new(s:invalid) -endfunction - -function! targets#state#nonempty() - return targets#state#new(s:nonempty) -endfunction - -function! targets#state#empty() - return targets#state#new(s:empty) -endfunction - -" raw attributes - -function! targets#state#isInvalid() dict - return self.state == s:invalid -endfunction - -function! targets#state#isEmpty() dict - return self.state == s:empty -endfunction - -function! targets#state#isNonempty() dict - return self.state == s:nonempty -endfunction - -" derived attributes - -" empty or nonempty -function! targets#state#isValid() dict - return self.state != s:invalid -endfunction - -function! targets#state#isInvalidOrEmpty() dict - return self.state != s:nonempty -endfunction diff --git a/vim/default/bundle/targets.vim/autoload/targets/target.vim b/vim/default/bundle/targets.vim/autoload/targets/target.vim deleted file mode 100644 index 05faed9238..0000000000 --- a/vim/default/bundle/targets.vim/autoload/targets/target.vim +++ /dev/null @@ -1,183 +0,0 @@ -function! targets#target#new(sl, sc, el, ec, error) - return { - \ 'error': a:error, - \ 'sl': a:sl, - \ 'sc': a:sc, - \ 'el': a:el, - \ 'ec': a:ec, - \ 'linewise': 0, - \ - \ 'copy': function('targets#target#copy'), - \ 'setS': function('targets#target#setS'), - \ 'setE': function('targets#target#setE'), - \ 's': function('targets#target#s'), - \ 'e': function('targets#target#e'), - \ 'searchposS': function('targets#target#searchposS'), - \ 'searchposE': function('targets#target#searchposE'), - \ 'getcharS': function('targets#target#getcharS'), - \ 'getcharE': function('targets#target#getcharE'), - \ 'getposS': function('targets#target#getposS'), - \ 'getposE': function('targets#target#getposE'), - \ 'cursorS': function('targets#target#cursorS'), - \ 'cursorE': function('targets#target#cursorE'), - \ 'state': function('targets#target#state'), - \ 'range': function('targets#target#range'), - \ 'select': function('targets#target#select'), - \ 'string': function('targets#target#string') - \ } -endfunction - -function! targets#target#fromValues(sl, sc, el, ec) - return targets#target#new(a:sl, a:sc, a:el, a:ec, '') -endfunction - -function! targets#target#fromVisualSelection() - let [sl, sc] = getpos("'<")[1:2] - let [el, ec] = getpos("'>")[1:2] - return targets#target#fromValues(sl, sc, el, ec) -endfunction - -function! targets#target#withError(error) - return targets#target#new(0, 0, 0, 0, a:error) -endfunction - -function! targets#target#copy() dict - return targets#target#fromValues(self.sl, self.sc, self.el, self.ec) -endfunction - -function! targets#target#setS(line, column) dict - let [self.sl, self.sc] = [a:line, a:column] -endfunction - -function! targets#target#setE(line, column) dict - let [self.el, self.ec] = [a:line, a:column] -endfunction - -function! targets#target#s() dict - return [self.sl, self.sc] -endfunction - -function! targets#target#e() dict - return [self.el, self.ec] -endfunction - -function! targets#target#searchposS(...) dict - let pattern = a:1 - let flags = a:0 > 1 ? a:2 : '' - let stopline = a:0 > 2 ? a:3 : 0 - let [self.sl, self.sc] = searchpos(pattern, flags, stopline) -endfunction - -function! targets#target#searchposE(...) dict - let pattern = a:1 - let flags = a:0 > 1 ? a:2 : '' - let stopline = a:0 > 2 ? a:3 : 0 - let [self.el, self.ec] = searchpos(pattern, flags, stopline) -endfunction - -function! targets#target#getcharS() dict - return getline(self.sl)[self.sc-1] -endfunction - -function! targets#target#getcharE() dict - return getline(self.el)[self.ec-1] -endfunction - -" args (mark = '.') -function! targets#target#getposS(...) dict - let mark = a:0 > 0 ? a:1 : '.' - let [self.sl, self.sc] = getpos(mark)[1:2] -endfunction - -" args (mark = '.') -function! targets#target#getposE(...) dict - let mark = a:0 > 0 ? a:1 : '.' - let [self.el, self.ec] = getpos(mark)[1:2] -endfunction - -function! targets#target#cursorS() dict - call cursor(self.s()) -endfunction - -function! targets#target#cursorE() dict - call cursor(self.e()) -endfunction - -function! targets#target#state() dict - if self.error != '' - return targets#state#invalid() - endif - if self.sl == 0 || self.el == 0 - return targets#state#invalid() - elseif self.sl < self.el - return targets#state#nonempty() - elseif self.sl > self.el - return targets#state#invalid() - elseif self.sc == self.ec + 1 - return targets#state#empty() - elseif self.sc > self.ec - return targets#state#invalid() - else - return targets#state#nonempty() - endif -endfunction - -function! targets#target#range(cursor, min, max) dict - if self.error != '' - return '' - endif - - let positionS = s:position(self.sl, self.sc, a:cursor, a:min, a:max, 'c') - let positionE = s:position(self.el, self.ec, a:cursor, a:min, a:max, 'c') - return positionS . positionE -endfunction - -function! s:position(line, column, cursor, min, max, tie) - let cursorLine = a:cursor[1] - - if a:line == cursorLine " cursor line - let cursorColumn = a:cursor[2] - if a:column == cursorColumn " same column - return a:tie - elseif a:column < cursorColumn " left of cursor - return 'l' - else " a:column > cursorColumn " right of cursor - return 'r' - endif - - elseif a:line < cursorLine - if a:line >= a:min " above on screen - return 'a' - else " above off screen - return 'A' - endif - - else " a:line > cursorLine - if a:line <= a:max " below on screen - return 'b' - else " below off screen - return 'B' - endif - endif -endfunction - -" visually select the target -function! targets#target#select() dict - call cursor(self.s()) - - if self.linewise - silent! normal! V - else - silent! normal! v - endif - - call cursor(self.e()) -endfunction - -function! targets#target#string() dict - if self.error != '' - return '[err:' . self.error . ']' - endif - - return '[' . self.sl . ' ' . self.sc . '; ' . self.el . ' ' . self.ec . ']' -endfunction diff --git a/vim/default/bundle/targets.vim/cheatsheet.md b/vim/default/bundle/targets.vim/cheatsheet.md deleted file mode 100644 index 5a3145be94..0000000000 --- a/vim/default/bundle/targets.vim/cheatsheet.md +++ /dev/null @@ -1,270 +0,0 @@ -## Pair mappings - -Available mappings - - i( i) ib i{ i} iB i[ i] ir i< i> ia it - a( a) ab a{ a} aB a[ a] ar a< a> aa at - I( I) Ib I{ I} IB I[ I] Ir I< I> Ia It - A( A) Ab A{ A} AB A[ A] Ar A< A> Aa At - - in( in) inb in{ in} inB in[ in] inr in< in> ina int - an( an) anb an{ an} anB an[ an] anr an< an> ana ant - In( In) Inb In{ In} InB In[ In] Inr In< In> Ina Int - An( An) Anb An{ An} AnB An[ An] Anr An< An> Ana Ant - - il( il) ilb il{ il} ilB il[ il] ilr il< il> ila ilt - al( al) alb al{ al} alB al[ al] alr al< al> ala alt - Il( Il) Ilb Il{ Il} IlB Il[ Il] Ilr Il< Il> Ila Ilt - Al( Al) Alb Al{ Al} AlB Al[ Al] Alr Al< Al> Ala Alt - -Chart for a list of pairs - -``` - .......... -a ( bbbbbbbb ) ( ccccccc ) ( dddddd ) ( eeeeeee ) ( ffffffff ) g - ││└ 2Il) ┘│││││└ Il) ┘│││││└ I) ┘│││││└ In) ┘│││││└ 2In) ┘│││ - │└─ 2il) ─┘│││└─ il) ─┘│││└─ i) ─┘│││└─ in) ─┘│││└─ 2in) ─┘││ - ├── 2al) ──┘│├── al) ──┘│├── a) ──┘│├── an) ──┘│├── 2an) ──┘│ - └── 2Al) ───┘└── Al) ───┘└── A) ───┘└── An) ───┘└── 2An) ───┘ -``` - -Chart for nested pairs - -``` - .......... -a ( b ( cccccccc ) d ) ( e ( ffffff ) g ) ( h ( iiiiiiii ) j ) k - │││ ││└ 2Il) ┘││││││││││ ││└ I) ┘││││││││││ ││└ 2In) ┘│││││││ - │││ │└─ 2il) ─┘│││││││││ │└─ i) ─┘│││││││││ │└─ 2in) ─┘││││││ - │││ ├── 2al) ──┘││││││││ ├── a) ──┘││││││││ ├── 2an) ──┘│││││ - │││ └── 2Al) ───┘│││││││ └── A) ───┘│││││││ └── 2An) ───┘││││ - ││└───── Il) ────┘│││││└─── 2I) ────┘│││││└───── In) ────┘│││ - │└────── il) ─────┘│││└──── 2i) ─────┘│││└────── in) ─────┘││ - ├─────── al) ──────┘│├───── 2a) ──────┘│├─────── an) ──────┘│ - └─────── Al) ───────┘└───── 2A) ───────┘└─────── An) ───────┘ -``` - -## Quote mappings - -Available mappings - -``` - i' i" i` in' in" in` il' il" il` iL' iL" iL` - a' a" a` an' an" an` al' al" al` aL' aL" aL` - I' I" I` In' In" In` Il' Il" Il` IL' IL" IL` - A' A" A` An' An" An` Al' Al" Al` AL' AL" AL` -``` - -Chart for a list of quotes - -``` - .......... -a ' bbbbbbb ' ccccccc ' dddddd ' eeeeeee ' fffffff ' g - ││└ IL' ┘│││└ Il' ┘│││└ I' ┘│││└ In' ┘│││└ IN' ┘│││ - │└─ iL' ─┘│├─ il' ─┘│├─ i' ─┘│├─ in' ─┘│├─ iN' ─┘││ - ├── aL' ──┤│ ├┼─ a' ──┤│ ├┼─ aN' ──┘│ - └── AL' ──┼┘ ├┼─ A' ──┼┘ ├┼─ AN' ───┘ - ├── al' ──┘│ ├── an' ──┘│ - └── Al' ───┘ └── An' ───┘ -``` - -## Separator mappings - -Available mappings - -``` - i, i. i; i: i+ i- i= i~ i_ i* i# i/ i| i\ i& i$ - a, a. a; a: a+ a- a= a~ a_ a* a# a/ a| a\ a& a$ - I, I. I; I: I+ I- I= I~ I_ I* I# I/ I| I\ I& I$ - A, A. A; A: A+ A- A= A~ A_ A* A# A/ A| A\ A& A$ - -in, in. in; in: in+ in- in= in~ in_ in* in# in/ in| in\ in& in$ -an, an. an; an: an+ an- an= an~ an_ an* an# an/ an| an\ an& an$ -In, In. In; In: In+ In- In= In~ In_ In* In# In/ In| In\ In& In$ -An, An. An; An: An+ An- An= An~ An_ An* An# An/ An| An\ An& An$ - -il, il. il; il: il+ il- il= il~ il_ il* il# il/ il| il\ il& il$ -al, al. al; al: al+ al- al= al~ al_ al* al# al/ al| al\ al& al$ -Il, Il. Il; Il: Il+ Il- Il= Il~ Il_ Il* Il# Il/ Il| Il\ Il& Il$ -Al, Al. Al; Al: Al+ Al- Al= Al~ Al_ Al* Al# Al/ Al| Al\ Al& Al$ - -iN, iN. iN; iN: iN+ iN- iN= iN~ iN_ iN* iN# iN/ iN| iN\ iN& iN$ -aN, aN. aN; aN: aN+ aN- aN= aN~ aN_ aN* aN# aN/ aN| aN\ aN& aN$ -IN, IN. IN; IN: IN+ IN- IN= IN~ IN_ IN* IN# IN/ IN| IN\ IN& IN$ -AN, AN. AN; AN: AN+ AN- AN= AN~ AN_ AN* AN# AN/ AN| AN\ AN& AN$ - -iL, iL. iL; iL: iL+ iL- iL= iL~ iL_ iL* iL# iL/ iL| iL\ iL& iL$ -aL, aL. aL; aL: aL+ aL- aL= aL~ aL_ aL* aL# aL/ aL| aL\ aL& aL$ -IL, IL. IL; IL: IL+ IL- IL= IL~ IL_ IL* IL# IL/ IL| IL\ IL& IL$ -AL, AL. AL; AL: AL+ AL- AL= AL~ AL_ AL* AL# AL/ AL| AL\ AL& AL$ -``` - -Chart for a list of separators - -``` - ......... -a , bbbbbbb , ccccccc , dddddd , eeeeeee , fffffff , g - ││└ IL, ┘│││└ Il, ┘│││└ I, ┘│││└ In, ┘│││└ IN, ┘│ │ - │└─ iL, ─┤│├─ il, ─┤│├─ i, ─┤│├─ in, ─┤│├─ iN, ─┤ │ - ├── aL, ─┘├┼─ al, ─┘├┼─ a, ─┘├┼─ an, ─┘├┼─ aN, ─┘ │ - └── AL, ──┼┘ └┼─ A, ──┼┘ └┼─ AN, ───┘ - └─ Al, ──┘ └─ An, ──┘ -``` - -## Argument mappings - -Available mappings - -``` - ia aa Ia Aa - ina ana Ina Ana - ila ala Ila Ala -``` - -Chart for arguments - -``` - ......... -a ( bbbbbb , ccccccc , d ( eeeeee , fffffff ) , gggggg ) h - ││├2Ila┘│││└─Ila─┘││││ ││├─Ia─┘│││└─Ina─┘│││││└2Ina┘│ │ - │└┼2ila─┘│├──ila──┤│││ │└┼─ia──┘│├──ina──┤│││├─2ina─┤ │ - │ └2ala──┼┤ ││││ │ └─aa───┼┤ │││├┼─2ana─┘ │ - └──2Ala──┼┘ ││││ └───Aa───┼┘ │││└┼─2Ana───┘ - ├───ala──┘│││ ├───ana──┘││ │ - └───Ala───┼┤│ └───Ana───┼┤ │ - ││└─────2Ia────────────┘│ │ - │└──────2ia─────────────┤ │ - ├───────2aa─────────────┘ │ - └───────2Aa───────────────┘ -``` - -## Customize seeking - -Seeking is controlled by the setting `g:targets_seekRanges`. Default value: - -```vim -let g:targets_seekRanges = 'lr rr ll lb ar ab lB Ar aB Ab AB rb al rB Al bb aa bB Aa BB AA' -``` - -When using a command like `cib` to change inside a block, targets.vim considers -the three targets: - - - smallest target around cursor - - next target after cursor - - last target before cursor - -For each of those that were found, we detect what range type it has. A range -type depends on the relative position of the start and end of the target, -relative to the current cursor position and the currently visible lines. - -The possibly relative positions are: - - - `c`: on cursor position - - `l`: left of cursor in current line - - `r`: right of cursor in current line - - `a`: above cursor on screen - - `b`: below cursor on screen - - `A`: above cursor off screen - - `B`: below cursor off screen - -All possibly ranges are listed below, denoted by two characters: one for the -relative start and one for the relative end position of the target. For -example, `lr` means "from left of cursor to right of cursor in cursor line". - -Next to each range type is a pictogram of an example. They are made of these -symbols: - - - `.`: current cursor position - - `(`: start of target - - `)`: end of target - - `/`: line break before and after cursor line - - `|`: screen edge between hidden and visible lines - -#### Ranges on cursor: - -``` -cr | / () / | starting on cursor, current line -cb | / ( /) | starting on cursor, multiline down, on screen -cB | / ( / |) starting on cursor, multiline down, partially off screen -lc | / () / | ending on cursor, current line -ac | (/ ) / | ending on cursor, multiline up, on screen -Ac (| / ) / | ending on cursor, multiline up, partially off screen -``` - -#### Ranges around cursor: - -``` -lr | / (.) / | around cursor, current line -lb | / (. /) | around cursor, multiline down, on screen -ar | (/ .) / | around cursor, multiline up, on screen -ab | (/ . /) | around cursor, multiline both, on screen -lB | / (. / |) around cursor, multiline down, partially off screen -Ar (| / .) / | around cursor, multiline up, partially off screen -aB | (/ . / |) around cursor, multiline both, partially off screen bottom -Ab (| / . /) | around cursor, multiline both, partially off screen top -AB (| / . / |) around cursor, multiline both, partially off screen both -``` - -#### Ranges after (right of/below) cursor - -``` -rr | / .()/ | after cursor, current line -rb | / .( /) | after cursor, multiline, on screen -rB | / .( / |) after cursor, multiline, partially off screen -bb | / . /()| after cursor below, on screen -bB | / . /( |) after cursor below, partially off screen -BB | / . / |() after cursor below, off screen -``` - -#### Ranges before (left of/above) cursor - -``` -ll | /(). / | before cursor, current line -al | (/ ). / | before cursor, multiline, on screen -Al (| / ). / | before cursor, multiline, partially off screen -aa |()/ . / | before cursor above, on screen -Aa (| )/ . / | before cursor above, partially off screen -AA ()| / . / | before cursor above, off screen -``` - -Pictogram legend: - -``` - A a l r b B relative positions - └───────────┘ visible screen - └─────┘ current line -``` - -Given the range types of our targets, we then pick the one that appears first -in `g:targets_seekRanges`. If none is found, the selection fails. - -The default setting generally prefers targets around the cursor, with one -exception: If the target around the cursor is not contained in the current -cursor line, but the next or last target are, then prefer those. Targets -beginning or ending on the cursor are preferred over everything else. - -Some other useful example settings: - -Never seek backwards: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr lb ar ab lB Ar aB Ab AB rb rB bb bB BB' -``` - -Only seek if next/last targets touch current line: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb rB al Al' -``` - -Only consider targets fully visible on screen: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr lb ar ab rr rb bb ll al aa' -``` - -Only consider targets around cursor: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr lb ar ab lB Ar aB Ab AB' -``` - -Only consider targets fully contained in current line: -```vim -let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll' -``` diff --git a/vim/default/bundle/targets.vim/doc/targets.txt b/vim/default/bundle/targets.vim/doc/targets.txt deleted file mode 100644 index 8c69b88151..0000000000 --- a/vim/default/bundle/targets.vim/doc/targets.txt +++ /dev/null @@ -1,752 +0,0 @@ -*targets.txt* Provide additional text objects - -Author: Christian Wellenbrock -License: MIT license - - ____ - \___\_.::::::::::.____ - /___/ '::::::::::' - - - -============================================================================== -INTRODUCTION *targets-introduction* - -Targets.vim adds various |text-objects| to give you more targets to operate -on. It expands on the idea of simple commands like `di'` (delete inside the -single quotes around the cursor) to give you more opportunities to craft -powerful commands that can be repeated reliably. Another major goal is to -handle all corner cases correctly. - -============================================================================== -EXAMPLES *targets-examples* - -The following examples are displayed as three lines each. The top line denotes -cursor positions from where the presented command works. The middle line shows -the contents of the example line that we're working on. The last line shows -the part of the line that the command will operate on. - -To change the text in the next pair of parentheses, use the `cin)` command - - ..................... - This is example text (with a pair of parentheses) ~ - └───────── cin) ─────────┘ - -To delete the item in a comma separated list under the cursor, use `da,` - - ......... - Shopping list: oranges, apples, bananas, tomatoes ~ - └─ da, ─┘ - -Notice how the selection includes exactly one of the surrounding commas to -leave a proper comma separated list behind. - -============================================================================== -OVERVIEW *targets-overview* - -We distinguish between three kinds of text objects that behave slightly -differently: - - Pair text objects |targets-pair-text-objects| - Quote text objects |targets-quote-text-objects| - Separator text objects |targets-separator-text-objects| - Argument text objects |targets-argument-text-objects| - -============================================================================== -PAIR TEXT OBJECTS *targets-pair-text-objects* - -These text objects are similar to the built in text objects such as |i)|. -Supported trigger characters: - - ( ) b (work on parentheses) - { } B (work on curly braces) - [ ] (work on square brackets) - < > (work on angle brackets) - t (work on tags) - -We borrowed the aliases `r` and `a` from the |surround| plugin by Tim Pope. -The following examples will use parentheses, but they all work for each listed -trigger character accordingly. - -Pair text objects work over multiple lines. - -i( i) ib i[ i] it *it_t* *i(_t* *i)_t* *ib_t* *i[_t* *i]_t* -i{ i} iB i< i> *i{_t* *i}_t* *iB_t* *i<_t* *i>_t* - Select inside of pair characters. This overrides Vim's default text object - to allow seeking for the next pair in the current line to the right or - left when the cursor is not inside a pair. This behavior is similar to - Vim's seeking behavior of `di'` when not inside of quotes, but it works - both ways. See |targets-pair-seek|. Accepts a [count] to select multiple - blocks. - - ............ - a ( b ( cccccccc ) d ) e ~ - │ └── i) ──┘ │ - └───── 2i) ──────┘ - -a( a) ab a[ a] at *at_t* *a(_t* *a)_t* *ab_t* *a[_t* *a]_t* -a{ a} aB a< a> *a{_t* *a}_t* *aB_t* *a<_t* *a>_t* - Select a pair. Overrides Vim's default text object to allow seeking. - Supports |targets-pair-seek|. Accepts [count]. - - ............ - a ( b ( cccccccc ) d ) e ~ - │ └─── a) ───┘ │ - └────── 2a) ───────┘ - -I( I) Ib I[ I] It *It* *I(* *I)* *Ib* *I[* *I]* -I{ I} IB I< I> *I{* *I}* *IB* *I<* *I>* - Select contents of pair characters. Like inside of parentheses, but - exclude whitespace at both ends. Useful for changing contents while - preserving spacing. Supports |targets-pair-seek|. Accepts [count]. - - ............ - a ( b ( cccccccc ) d ) e ~ - │ └─ I) ─┘ │ - └──── 2I) ─────┘ - -A( A) Ab A[ A] At *At* *A(* *A)* *Ab* *A[* *A]* -A{ A} AB A< A> *A{* *A}* *AB* *A<* *A>* - Select around pair characters. Like a pair, but include whitespace at one - side of the pair. Prefers to select trailing whitespace, falls back to - select leading whitespace. Supports |targets-pair-seek|. Accepts [count]. - - ............ - a ( b ( cccccccc ) d ) e ~ - │ └─── A) ────┘ │ - └────── 2A) ────────┘ - ------------------------------------------------------------------------------- -NEXT AND LAST PAIR *targets-next-last-pair* - -Work directly on distant pairs without moving there separately. - -in( in) inb in[ in] int *int* *in(* *in)* *inb* *in[* *in]* -in{ in} inB in< in> *in{* *in}* *inB* *in<* *in>* -an( an) anb an[ an] ant *ant* *an(* *an)* *anb* *an[* *an]* -an{ an} anB an< an> *an{* *an}* *anB* *an<* *an>* -In( In) Inb In[ In] Int *Int* *In(* *In)* *Inb* *In[* *In]* -In{ In} InB In< In> *In{* *In}* *InB* *In<* *In>* -An( An) Anb An[ An] Ant *Ant* *An(* *An)* *Anb* *An[* *An]* -An{ An} AnB An< An> *An{* *An}* *AnB* *An<* *An>* -il( il) ilb il[ il] ilt *ilt* *il(* *il)* *ilb* *il[* *il]* -il{ il} ilB il< il> *il{* *il}* *ilB* *il<* *il>* -al( al) alb al[ al] alt *alt* *al(* *al)* *alb* *al[* *al]* -al{ al} alB al< al> *al{* *al}* *alB* *al<* *al>* -Il( Il) Ilb Il[ Il] Ilt *Ilt* *Il(* *Il)* *Ilb* *Il[* *Il]* -Il{ Il} IlB Il< Il> *Il{* *Il}* *IlB* *Il<* *Il>* -Al( Al) Alb Al[ Al] Alt *Alt* *Al(* *Al)* *Alb* *Al[* *Al]* -Al{ Al} AlB Al< Al> *Al{* *Al}* *AlB* *Al<* *Al>* - All the above pair text objects can be shifted to the next pair by - including the letter `n`. The command `in)` selects inside of the next - pair. Use the letter `l` instead to work on the previous (last) pair. Uses - a [count] to skip multiple pairs. Skipping works over multiple lines. - - *targets-pair-charts* -The following charts summarizes all pair mappings for a list of pairs and -nested pairs: - - .......... - a ( bbbbbbbb ) ( ccccccc ) ( dddddd ) ( eeeeeee ) ( ffffffff ) g ~ - ││└ 2Il) ┘│││││└ Il) ┘│││││└ I) ┘│││││└ In) ┘│││││└ 2In) ┘│││ - │└─ 2il) ─┘│││└─ il) ─┘│││└─ i) ─┘│││└─ in) ─┘│││└─ 2in) ─┘││ - ├── 2al) ──┘│├── al) ──┘│├── a) ──┘│├── an) ──┘│├── 2an) ──┘│ - └── 2Al) ───┘└── Al) ───┘└── A) ───┘└── An) ───┘└── 2An) ───┘ - - .......... - a ( b ( cccccccc ) d ) ( e ( ffffff ) g ) ( h ( iiiiiiii ) j ) k ~ - │││ ││└ 2Il) ┘││││││││││ ││└ I) ┘││││││││││ ││└ 2In) ┘│││││││ - │││ │└─ 2il) ─┘│││││││││ │└─ i) ─┘│││││││││ │└─ 2in) ─┘││││││ - │││ ├── 2al) ──┘││││││││ ├── a) ──┘││││││││ ├── 2an) ──┘│││││ - │││ └── 2Al) ───┘│││││││ └── A) ───┘│││││││ └── 2An) ───┘││││ - ││└───── Il) ────┘│││││└─── 2I) ────┘│││││└───── In) ────┘│││ - │└────── il) ─────┘│││└──── 2i) ─────┘│││└────── in) ─────┘││ - ├─────── al) ──────┘│├───── 2a) ──────┘│├─────── an) ──────┘│ - └─────── Al) ───────┘└───── 2A) ───────┘└─────── An) ───────┘ - ------------------------------------------------------------------------------- -PAIR SEEK *targets-pair-seek* - -If any of the normal pair commands (not containing `n` or `l`) is executed -when the cursor is not positioned inside a pair, it seeks for pairs before or -after the cursor by searching for the appropriate delimiter on the current -line. This is similar to using the explicit version containing `n` or `l`, but -in only seeks on the current line. - -============================================================================== -QUOTE TEXT OBJECTS *targets-quote-text-objects* - -These text objects are similar to the built in text objects such as |i'|. -Supported trigger characters: - - ' (work on single quotes) - " (work on double quotes) - ` (work on back ticks) - -The following examples will use single quotes, but they all work for each -listed quoting character accordingly. - -Quote text objects work over multiple lines. - -When the cursor is positioned on a quotation mark, the quote text objects -count the numbers of quotation marks from the beginning of the line to choose -the properly quoted text to the left or right of the cursor. - -i' i" i` *i`_t* *i'_t* *iquote_t* - Select inside quote. This overrides Vim's default text object to allow - seeking in both directions. See |targets-quote-seek|. - - ............ - a ' bbbbbbbb ' c ' d ~ - └── i' ──┘ - -a' a" a` *a`_t* *a'_t* *aquote_t* - Select a quote. This overrides Vim's default text object to support - |targets-quote-seek|. Unlike Vim's quote text objects, this incudes no - surrounding whitespace. - - ............ - a ' bbbbbbbb ' c ' d ~ - └─── a' ───┘ - -I' I" I` *I`* *I'* *Iquote* - Select contents of a quote. Like inside quote, but exclude whitespace at - both ends. Useful for changing contents while preserving spacing. Supports - |targets-quote-seek|. - - ............ - a ' bbbbbbbb ' c ' d ~ - └─ I' ─┘ - -A' A" A` *A`* *A'* *Aquote* - Select around a quote. Like a quote, but include whitespace in one - direction. Prefers to select trailing whitespace, falls back to select - leading whitespace. Supports |targets-quote-seek|. - - ............ - a ' bbbbbbbb ' c ' d ~ - └─── A' ────┘ - ------------------------------------------------------------------------------- -NEXT AND LAST QUOTE *targets-next-last-quote* - -Work directly on distant quotes without moving there separately. - -in' in" in` il' il" il` *in`* *in'* *inquote* *il`* *il'* *ilquote* -an' an" an` al' al" al` *an`* *an'* *anquote* *al`* *al'* *alquote* -In' In" In` Il' Il" Il` *In`* *In'* *Inquote* *Il`* *Il'* *Ilquote* -iN' iN" iN` iL' iL" iL` *iN`* *iN'* *iNquote* *iL`* *iL'* *iLquote* -aN' aN" aN` aL' aL" aL` *aN`* *aN'* *aNquote* *aL`* *aL'* *aLquote* -IN' IN" IN` IL' IL" IL` *IN`* *IN'* *INquote* *IL`* *IL'* *ILquote* - All the above pair text objects can be shifted to the next quote by - including the letter `n`. The command `in'` selects inside of the next - single quotes. Use the letter `l` instead to work on the previous (last) - quote. Uses a [count] to skip multiple quotation characters. - - Use uppercase `N` and `L` to jump from within one quote into the next - proper quote, instead of into the pseudo quote in between. (Using `N` - instead of `n` is actually just doubling the count to achieve this.) - - *targets-quote-chart* -The following chart summarizes all quote mappings: - - .......... - a ' bbbbbbb ' ccccccc ' dddddd ' eeeeeee ' fffffff ' g ~ - ││└ IL' ┘│││└ Il' ┘│││└ I' ┘│││└ In' ┘│││└ IN' ┘│ │ - │└─ iL' ─┘│├─ il' ─┘│├─ i' ─┘│├─ in' ─┘│├─ iN' ─┘ │ - └── aL' ──┼┘ └┼─ a' ──┼┘ └┼─ aN' ───┘ - └── al' ───┘ └── an' ───┘ - ------------------------------------------------------------------------------- -QUOTE SEEK *targets-quote-seek* - -If any of the normal quote commands (not containing `n`, `l`, `N` or `L`) is -executed when the cursor is not positioned inside a quote, it seeks for quotes -before or after the cursor by searching for the appropriate delimiter on the -current line. Similar to using the explicit version containing `n` or `l`. - -============================================================================== -SEPARATOR TEXT OBJECTS *targets-separator-text-objects* - -These text objects are based on single separator characters like the comma in -one of our |targets-examples|. The text between two instances of the separator -character can be operated on with these targets. - -Supported separators: - - , . ; : + - = ~ _ * # / | \ & $ ~ - -The following examples will use commas, but they all work for each listed -separator character accordingly. - -Separator text objects work over multiple lines. - -i, i. i; i: i+ i- i= i~ *i,* *i.* *i;* *i:* *i+* *i-* *i=* *i~* -i_ i/ i| i\ i& i$ i# i* *i_* *i/* *i|* *i\* *i&* *i$* *i#* *istar* - Select inside separators. Supports |targets-separator-seek|. - - ........... - a , b , cccccccc , d , e ~ - └── i, ──┘ - -a, a. a; a: a+ a- a= a~ *a,* *a.* *a;* *a:* *a+* *a-* *a=* *a~* -a_ a/ a| a\ a& a$ a# a* *a_* *a/* *a|* *a\* *ar* *a$* *a#* *astar* - Select an item in a list separated by the separator character. This - includes the leading separator, but excludes the trailing one. This leaves - a proper list separated by the separator character after deletion. See - |targets-examples|. Supports |targets-separator-seek|. - - ........... - a , b , cccccccc , d , e ~ - └─── a, ──┘ - -I, I. I; I: I+ I- I= I~ *I,* *I.* *I;* *I:* *I+* *I-* *I=* *I~* -I_ I/ I| I\ I& I$ I# I* *I_* *I/* *I|* *I\* *I&* *I$* *I#* *Istar* - Select contents between separators. Like inside separators, but exclude - whitespace at both ends. Useful for changing contents while preserving - spacing. Supports |targets-separator-seek|. - - ........... - a , b , cccccccc , d , e ~ - └─ I, ─┘ - -A, A. A; A: A+ A- A= A~ *A,* *A.* *A;* *A:* *A+* *A-* *A=* *A~* -A_ A/ A| A\ A& A$ A# A* *A_* *A/* *A|* *A\* *A&* *A$* *A#* *Astar* - Select around a pair of separators. This includes both separators and a - surrounding whitespace, similar to `a'` and `A(`. Supports - |targets-separator-seek|. - - ........... - a , b , cccccccc , d , e ~ - └─── A, ────┘ - ------------------------------------------------------------------------------- -NEXT AND LAST SEPARATOR *targets-next-last-separator* - -Work directly on distant separators without moving there separately. - - *in,* *in.* *in;* *in:* *in+* *in-* *in=* *in~* - *an,* *an.* *an;* *an:* *an+* *an-* *an=* *an~* - *In,* *In.* *In;* *In:* *In+* *In-* *In=* *In~* - *An,* *An.* *An;* *An:* *An+* *An-* *An=* *An~* - *il,* *il.* *il;* *il:* *il+* *il-* *il=* *il~* - *al,* *al.* *al;* *al:* *al+* *al-* *al=* *al~* - *Il,* *Il.* *Il;* *Il:* *Il+* *Il-* *Il=* *Il~* - *Al,* *Al.* *Al;* *Al:* *Al+* *Al-* *Al=* *Al~* - *iN,* *iN.* *iN;* *iN:* *iN+* *iN-* *iN=* *iN~* - *aN,* *aN.* *aN;* *aN:* *aN+* *aN-* *aN=* *aN~* - *IN,* *IN.* *IN;* *IN:* *IN+* *IN-* *IN=* *IN~* - *AN,* *AN.* *AN;* *AN:* *AN+* *AN-* *AN=* *AN~* - *iL,* *iL.* *iL;* *iL:* *iL+* *iL-* *iL=* *iL~* - *aL,* *aL.* *aL;* *aL:* *aL+* *aL-* *aL=* *aL~* - *IL,* *IL.* *IL;* *IL:* *IL+* *IL-* *IL=* *IL~* - *AL,* *AL.* *AL;* *AL:* *AL+* *AL-* *AL=* *AL~* - - *in_* *in/* *in|* *in\* *in&* *in$* *in#* *instar* - *an_* *an/* *an|* *an\* *an&* *an$* *an#* *anstar* - *In_* *In/* *In|* *In\* *In&* *In$* *In#* *Instar* - *An_* *An/* *An|* *An\* *An&* *An$* *An#* *Anstar* - *il_* *il/* *il|* *il\* *il&* *il$* *il#* *ilstar* - *al_* *al/* *al|* *al\* *al&* *al$* *al#* *alstar* - *Il_* *Il/* *Il|* *Il\* *Il&* *Il$* *Il#* *Ilstar* - *Al_* *Al/* *Al|* *Al\* *Al&* *Al$* *Al#* *Alstar* - *iN_* *iN/* *iN|* *iN\* *iN&* *iN$* *iN#* *iNstar* - *aN_* *aN/* *aN|* *aN\* *aN&* *aN$* *aN#* *aNstar* - *IN_* *IN/* *IN|* *IN\* *IN&* *IN$* *IN#* *INstar* - *AN_* *AN/* *AN|* *AN\* *AN&* *AN$* *AN#* *ANstar* - *iL_* *iL/* *iL|* *iL\* *iL&* *iL$* *iL#* *iLstar* - *aL_* *aL/* *aL|* *aL\* *aL&* *aL$* *aL#* *aLstar* - *IL_* *IL/* *IL|* *IL\* *IL&* *IL$* *IL#* *ILstar* - *AL_* *AL/* *AL|* *AL\* *AL&* *AL$* *AL#* *ALstar* - -in, in. in; in: in+ in- in= in~ in_ in/ in| in\ in& in$ in# in* -an, an. an; an: an+ an- an= an~ an_ an/ an| an\ an& an$ an# an* -In, In. In; In: In+ In- In= In~ In_ In/ In| In\ In& In$ In# In* -An, An. An; An: An+ An- An= An~ An_ An/ An| An\ An& An$ An# An* -il, il. il; il: il+ il- il= il~ il_ il/ il| il\ il& il$ il# il* -al, al. al; al: al+ al- al= al~ al_ al/ al| al\ al& al$ al# al* -Il, Il. Il; Il: Il+ Il- Il= Il~ Il_ Il/ Il| Il\ Il& Il$ Il# Il* -Al, Al. Al; Al: Al+ Al- Al= Al~ Al_ Al/ Al| Al\ Al& Al$ Al# Al* -iN, iN. iN; iN: iN+ iN- iN= iN~ iN_ iN/ iN| iN\ iN& iN$ iN# iN* -aN, aN. aN; aN: aN+ aN- aN= aN~ aN_ aN/ aN| aN\ aN& aN$ aN# aN* -IN, IN. IN; IN: IN+ IN- IN= IN~ IN_ IN/ IN| IN\ IN& IN$ IN# IN* -AN, AN. AN; AN: AN+ AN- AN= AN~ AN_ AN/ AN| AN\ AN& AN$ AN# AN* -iL, iL. iL; iL: iL+ iL- iL= iL~ iL_ iL/ iL| iL\ iL& iL$ iL# iL* -aL, aL. aL; aL: aL+ aL- aL= aL~ aL_ aL/ aL| aL\ aL& aL$ aL# aL* -IL, IL. IL; IL: IL+ IL- IL= IL~ IL_ IL/ IL| IL\ IL& IL$ IL# IL* -AL, AL. AL; AL: AL+ AL- AL= AL~ AL_ AL/ AL| AL\ AL& AL$ AL# AL* - - All the above separator text objects can be shifted to the next separator - by including the letter `n`. The command `in,` selects inside of the next - commas. Use the letter `l` instead to work on the previous (last) - separators. Uses a [count] to skip multiple separator characters. - - Use uppercase `N` and `L` to jump from within one pair of separators into - the next distinct pair, instead of into the adjacent one. (Using `N` - instead of `n` is actually just doubling the count to achieve this.) - - *targets-separator-chart* -The following chart summarizes all separator mappings: - - ......... - a , bbbbbbb , ccccccc , dddddd , eeeeeee , fffffff , g ~ - ││└ IL, ┘│││└ Il, ┘│││└ I, ┘│││└ In, ┘│││└ IN, ┘│ │ - │└─ iL, ─┤│├─ il, ─┤│├─ i, ─┤│├─ in, ─┤│├─ iN, ─┤ │ - ├── aL, ─┘├┼─ al, ─┘├┼─ a, ─┘├┼─ an, ─┘├┼─ aN, ─┘ │ - └── AL, ──┼┘ └┼─ A, ──┼┘ └┼─ AN, ───┘ - └─ Al, ──┘ └─ An, ──┘ - ------------------------------------------------------------------------------- -SEPARATOR SEEK *targets-separator-seek* - -Like |targets-quote-seek|. If any of the normal separator commands (not -containing `n` or `l`) is executed when the cursor is not positioned inside a -pair of separators, it seeks for the separator before or after the cursor. -This is similar to using the explicit version containing `n` or `l`. - -============================================================================== -ARGUMENT TEXT OBJECTS *targets-argument-text-objects* - -These text objects are similar to separator text objects, but are specialized -for arguments surrounded by braces and commas. They also take matching braces -into account to capture only valid arguments. - -Argument text objects work over multiple lines. - -ia *ia* - Select inside argument. Supports |targets-argument-seek|. Accepts a - [count] to select bigger nested arguments. - - ........... - a , b ( cccccccc , d ) e ~ - └── ia ──┘ - -aa *aa* - Select an argument in a list of arguments. This includes a separator if - present, but excludes surrounding braces. This leaves a proper of - arguments after deletion. Supports |targets-argument-seek|. Accepts a - [count] to select bigger nested arguments. - - ........... - a , b ( cccccccc , d ) e ~ - └─── aa ──┘ - -Ia *Ia* - Select contents of an argument. Like inside argument, but exclude - whitespace at both ends. Useful for changing contents while preserving - spacing. Supports |targets-argument-seek|. Accepts a [count] to select - bigger nested arguments. - - ........... - a , b ( cccccccc , d ) e ~ - └─ Ia ─┘ - -Aa *Aa* - Select around an argument. This includes both delimiters and a surrounding - whitespace, similar to `a'` and `A(`. Supports |targets-argument-seek|. - Accepts a [count] to select bigger nested arguments. - - ........... - a , b ( cccccccc , d ) e ~ - └─── Aa ────┘ - ------------------------------------------------------------------------------- -NEXT AND LAST ARGUMENT *targets-next-last-argument* - -Work directly on distant arguments without moving there separately. - -ina ana Ina Ana *ina* *ana* *Ina* *Ana* -ila ala Ila Ala *ila* *ala* *Ila* *Ala* - - All the above argument text objects can be shifted to the next argument - by including the letter `n`. The command `ina` selects inside of the next - argument. Use the letter `l` instead to work on the previous (last) - argument. Uses a [count] to skip multiple argument characters. The order - is determined by the nearest surrounding argument delimiter. - - *targets-argument-chart* -The following chart summarizes all argument mappings: - - ......... - a ( bbbbbb , ccccccc , d ( eeeeee , fffffff ) , gggggg ) h ~ - ││├2Ila┘│││└─Ila─┘││││ ││├─Ia─┘│││└─Ina─┘│││││└2Ina┘│ │ - │└┼2ila─┘│├──ila──┤│││ │└┼─ia──┘│├──ina──┤│││├─2ina─┤ │ - │ └2ala──┼┤ ││││ │ └─aa───┼┤ │││├┼─2ana─┘ │ - └──2Ala──┼┘ ││││ └───Aa───┼┘ │││└┼─2Ana───┘ - ├───ala──┘│││ ├───ana──┘││ │ - └───Ala───┼┤│ └───Ana───┼┤ │ - ││└─────2Ia────────────┘│ │ - │└──────2ia─────────────┤ │ - ├───────2aa─────────────┘ │ - └───────2Aa───────────────┘ - ------------------------------------------------------------------------------- -ARGUMENT SEEK *targets-argument-seek* - -Like |targets-separator-seek|. If any of the normal argument commands (not -containing `n` or `l`) is executed when the cursor is not positioned inside an -argument, it seeks for the argument before or after the cursor. This is -similar to using the explicit version containing `n` or `l`. - - -============================================================================== -SETTINGS *targets-settings* - -Put these variables into your vimrc to customize the mappings described above. -The provided examples also indicate the default values. - -Available options: ~ - - |g:targets_aiAI| - |g:targets_nlNL| - |g:targets_pairs| - |g:targets_quotes| - |g:targets_separators| - |g:targets_tagTrigger| - |g:targets_argTrigger| - |g:targets_argOpening| - |g:targets_argClosing| - |g:targets_argSeparator| - |g:targets_seekRanges| - |g:targets_jumpRanges| - ------------------------------------------------------------------------------- - *g:targets_aiAI* -Default: - let g:targets_aiAI = 'aiAI' ~ - -Controls the normal mode operator mode maps that get created for In Pair (i), -A Pair (a), Inside Pair (I), and Around Pair (A). Required to be a 4 character -long list. Use a space to deactivate a mode. - - *g:targets_nlNL* -Default: - let g:targets_nlNL = 'nlNL' ~ - -Controls the keys used in maps for seeking next and last text objects. For -example, if you don't wish to use the N and L seeks, and instead wish for 'n' -to always search for the next object and `N` to search for the last, you could -set: - - let g:targets_nlNL = 'nN ' ~ - -Note that two extra spaces are still required on the end, indicating you wish -to disable the default functionality of N and L. Required to be a 4 character -long list. - - *g:targets_pairs* -Default: - let g:targets_pairs = '()b {}B [] <>' ~ - -Defines the space separated list of pair objects you wish to use, along with -optional one letter aliases for them. - - *g:targets_quotes* -Default: - let g:targets_quotes = '" '' `' ~ - -Defines the space separated list of quoting objects you wish to use. Note that -you have to escape the single quote by doubling it. Quote objects can -optionally be followed by a single one letter alias. For example, to set `d` -as an alias for double quotes, allowing such commands as `cid` to be -equivalent to `ci"`, you could define: - - let g:targets_quotes = '"d '' `' ~ - - - *g:targets_separators* -Default: - let g:targets_separators = ', . ; : + - = ~ _ * # / | \ & $' ~ - -Defines the space separated list of separator objects you wish to use. Like -quote objects, separator objects can optionally be followed by a single one -letter alias. To set `c` as an alias for comma, allowing such commands as -`dic` to be equivalent to `di,`, you could define: - - let g:targets_separators = ',c . ; : + - = ~ _ * # / | \ & $' ~ - - *g:targets_tagTrigger* -Default: - let g:targets_tagTrigger = 't' ~ - -Defines the key you need to press to operate on tag text objects. - - - *g:targets_argTrigger* -Default: - let g:targets_argTrigger = 'a' ~ - -Defines the key you need to press to operate on arguments. To use `,` as -argument trigger, allowing commands as `da,` to act like `daa`, use this: - - let g:targets_argTrigger = ',' ~ - - *g:targets_argOpening* - *g:targets_argClosing* - -Default: - let g:targets_argOpening = '[([]' ~ - let g:targets_argClosing = '[])]' ~ - -Defines regular expressions that match the beginning and closing delimiter of -an argument list respectively. If you also want to find arguments delimited by -curly braces, try this: - - let g:targets_argOpening = '[({[]' ~ - let g:targets_argClosing = '[]})]' ~ - - *g:targets_argSeparator* - -Default: - let g:targets_argSeparator = ',' ~ - -Defines a regular expression matching separators in an argument list. If you -also want to find arguments separatode by semicolon, use this: - - let g:targets_argSeparator = '[,;]' ~ - - *g:targets_seekRanges* - -Default: - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb al rB Al bb aa bB Aa BB AA' ~ - -Defines a priority ordered, space separated list of range types which can be -used to customize seeking behavior. When using a command like `cib` to change -inside a block, targets.vim considers the three targets: - - smallest target around cursor - next target after cursor - last target before cursor - -For each of those that were found, we detect what range type it has. A range -type depends on the relative position of the start and end of the target, -relative to the current cursor position and the currently visible lines. - -The possibly relative positions are: - l left of cursor in current line ~ - r right of cursor in current line ~ - a above cursor on screen ~ - b below cursor on screen ~ - A above cursor off screen ~ - B below cursor off screen ~ - -All possibly ranges are listed below, denoted by two characters: one for the -relative start and one for the relative end position of the target. For -example, `lr` means "from left of cursor to right of cursor in cursor line". - -Next to each range type is a pictogram of an example. They are made of these -symbols: - . current cursor position ~ - ( ) start and end of target ~ - / line break before and after cursor line ~ - | screen edge between hidden and visible lines ~ - -Ranges around cursor: - lr | / (.) / | around cursor, current line ~ - lb | / (. /) | around cursor, multiline down, on screen ~ - ar | (/ .) / | around cursor, multiline up, on screen ~ - ab | (/ . /) | around cursor, multiline both, on screen ~ - lB | / (. / |) around cursor, multiline down, partially off screen ~ - Ar (| / .) / | around cursor, multiline up, partially off screen ~ - aB | (/ . / |) around cursor, multiline both, partially off screen bottom ~ - Ab (| / . /) | around cursor, multiline both, partially off screen top ~ - AB (| / . / |) around cursor, multiline both, partially off screen both ~ - -Ranges after (right of/below) cursor - rr | / .()/ | after cursor, current line ~ - rb | / .( /) | after cursor, multiline, on screen ~ - rB | / .( / |) after cursor, multiline, partially off screen ~ - bb | / . /()| after cursor below, on screen ~ - bB | / . /( |) after cursor below, partially off screen ~ - BB | / . / |() after cursor below, off screen ~ - -Ranges before (left of/above) cursor - ll | /(). / | before cursor, current line ~ - al | (/ ). / | before cursor, multiline, on screen ~ - Al (| / ). / | before cursor, multiline, partially off screen ~ - aa |()/ . / | before cursor above, on screen ~ - Aa (| )/ . / | before cursor above, partially off screen ~ - AA ()| / . / | before cursor above, off screen ~ - - A a l r b B relative positions - └───────────┘ visible screen - └─────┘ current line - -Given the range types of our targets, we then pick the one that appears first -in `g:targets_seekRanges`. If none is found, the selection fails. - -The default setting generally prefers targets around the cursor, with one -exception: If the target around the cursor is not contained in the current -cursor line, but the next or last target are, then prefer those. Targets -beginning or ending on the cursor are preferred over everything else. - -Some other useful example settings (or build your own!): - -Never seek backwards: - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr lb ar ab lB Ar aB Ab AB rb rB bb bB BB' ~ - -Only seek if next/last targets touch current line: - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb rB al Al' ~ - -Only consider targets fully visible on screen: - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr lb ar ab rr rb bb ll al aa' ~ - -Only consider targets around cursor: - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr lb ar ab lB Ar aB Ab AB' ~ - -Only consider targets fully contained in current line: - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll' ~ - - *g:targets_jumpRanges* - -Default: - let g:targets_jumpRanges = 'bb bB BB aa Aa AA' ~ - -Defines an unordered, space separated list of range types which can be used to -customize the jumplist behavior (see documentation on seek ranges). It -controls whether or not to add the cursor position prior to selecting the text -object to the jumplist. - -The default setting adds the previous cursor position to the jumplist if the -target that was operated on doesn't intersect the cursor line. That means it -adds a jumplist entry if the target ends above the cursor line or starts below -the cursor line. - -Some other useful example settings (or build your own!): - -Never add cursor position to jumplist: - let g:targets_jumpRanges = '' ~ - -Always add cursor position to jumplist: - let g:targets_jumpRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb al rB Al bb aa bB Aa BB AA' ~ - -Only add to jumplist if cursor was not inside the target: - let g:targets_jumpRanges = 'rr rb rB bb bB BB ll al Al aa Aa AA' ~ - -============================================================================== -NOTES *targets-notes* - -Repeating an operator-pending mapping forgets its last count. - https://groups.google.com/forum/?fromgroups#!topic/vim_dev/G4SSgcRVN7g -Works since Vim 7.4.160 - -============================================================================== -ISSUES *targets-issues* - -Empty matches can't be selected because it is no possible to visually select -zero-character ranges. - -Forcing to motion to work linewise by inserting `V` in `dVan(` doesn't work -for operator-pending mappings. See |o_V|. - -Report issues or submit pull requests to: - https://github.com/wellle/vim-targets - -============================================================================== -TODOS *targets-todos* - -Create more mappings to support commands like `danw` or `danp` to delete the -next word or paragraph. - -============================================================================== -vim:tw=78:ts=8:ft=help:norl: diff --git a/vim/default/bundle/targets.vim/plugin/targets.vim b/vim/default/bundle/targets.vim/plugin/targets.vim deleted file mode 100644 index 3a4b68b2d9..0000000000 --- a/vim/default/bundle/targets.vim/plugin/targets.vim +++ /dev/null @@ -1,276 +0,0 @@ -" targets.vim Provides additional text objects -" Author: Christian Wellenbrock -" License: MIT license - -if exists("g:loaded_targets") || &cp || v:version < 700 - finish -endif -let g:loaded_targets = '0.4.2' " version number -let s:save_cpoptions = &cpoptions -set cpo&vim - -function! s:addMapping1(mapType, mapping, aiAI) - if a:aiAI !=# ' ' - silent! execute a:mapType . 'noremap ' . a:aiAI . a:mapping - endif -endfunction - -function! s:addMapping2(mapType, mapping, aiAI, nlNL) - if a:aiAI !=# ' ' && a:nlNL !=# ' ' - silent! execute a:mapType . 'noremap ' . a:aiAI . a:nlNL . a:mapping - endif -endfunction - -" pair text objects (multi line objects with single line seek) -" cursor │ ......... -" line │ a ( bbbbbb ) ( ccccc ) ( ddddd ) ( eeeee ) ( ffffff ) g -" command │ ││└2Il)┘│││││└Il)┘│││││└─I)┘│││││└In)┘│││││└2In)┘│││ -" │ │└─2il)─┘│││└─il)─┘│││└──i)─┘│││└─in)─┘│││└─2in)─┘││ -" │ ├──2al)──┘│├──al)──┘│├───a)──┘│├──an)──┘│├──2an)──┘│ -" │ └──2Al)───┘└──Al)───┘└───A)───┘└──An)───┘└──2An)───┘ -" cursor │ ......... -" line │ a ( b ( cccccc ) d ) ( e ( fffff ) g ) ( h ( iiiiii ) j ) k -" command │ │││ ││└2Il)┘││││││││││ ││└─I)┘││││││││││ ││└2In)┘│││││││ -" │ │││ │└─2il)─┘│││││││││ │└──i)─┘│││││││││ │└─2in)─┘││││││ -" │ │││ ├──2al)──┘││││││││ ├───a)──┘││││││││ ├──2an)──┘│││││ -" │ │││ └──2Al)───┘│││││││ └───A)───┘│││││││ └──2An)───┘││││ -" │ ││└─────Il)────┘│││││└────2I)────┘│││││└─────In)────┘│││ -" │ │└──────il)─────┘│││└─────2i)─────┘│││└──────in)─────┘││ -" │ ├───────al)──────┘│├──────2a)──────┘│├───────an)──────┘│ -" │ └───────Al)───────┘└──────2A)───────┘└───────An)───────┘ -function! s:createPairTextObjects(mapType) - for trigger in split(g:targets_pairs, '\zs') - if trigger ==# ' ' - continue - endif - let triggerMap = trigger . " :call targets#" . a:mapType . "('" . trigger - call s:addMapping1(a:mapType, triggerMap . "ci', v:count1)", s:i) - call s:addMapping1(a:mapType, triggerMap . "ca', v:count1)", s:a) - call s:addMapping1(a:mapType, triggerMap . "cI', v:count1)", s:I) - call s:addMapping1(a:mapType, triggerMap . "cA', v:count1)", s:A) - call s:addMapping2(a:mapType, triggerMap . "ni', v:count1)", s:i, s:n) - call s:addMapping2(a:mapType, triggerMap . "na', v:count1)", s:a, s:n) - call s:addMapping2(a:mapType, triggerMap . "nI', v:count1)", s:I, s:n) - call s:addMapping2(a:mapType, triggerMap . "nA', v:count1)", s:A, s:n) - call s:addMapping2(a:mapType, triggerMap . "li', v:count1)", s:i, s:l) - call s:addMapping2(a:mapType, triggerMap . "la', v:count1)", s:a, s:l) - call s:addMapping2(a:mapType, triggerMap . "lI', v:count1)", s:I, s:l) - call s:addMapping2(a:mapType, triggerMap . "lA', v:count1)", s:A, s:l) - endfor -endfunction - -" tag text objects work on tags (similar to pair text objects) -function! s:createTagTextObjects(mapType) - let trigger = g:targets_tagTrigger - let triggerMap = trigger . " :call targets#" . a:mapType . "('" . trigger - call s:addMapping1(a:mapType, triggerMap . "ci', v:count1)", s:i) - call s:addMapping1(a:mapType, triggerMap . "ca', v:count1)", s:a) - call s:addMapping1(a:mapType, triggerMap . "cI', v:count1)", s:I) - call s:addMapping1(a:mapType, triggerMap . "cA', v:count1)", s:A) - call s:addMapping2(a:mapType, triggerMap . "ni', v:count1)", s:i, s:n) - call s:addMapping2(a:mapType, triggerMap . "na', v:count1)", s:a, s:n) - call s:addMapping2(a:mapType, triggerMap . "nI', v:count1)", s:I, s:n) - call s:addMapping2(a:mapType, triggerMap . "nA', v:count1)", s:A, s:n) - call s:addMapping2(a:mapType, triggerMap . "li', v:count1)", s:i, s:l) - call s:addMapping2(a:mapType, triggerMap . "la', v:count1)", s:a, s:l) - call s:addMapping2(a:mapType, triggerMap . "lI', v:count1)", s:I, s:l) - call s:addMapping2(a:mapType, triggerMap . "lA', v:count1)", s:A, s:l) -endfunction - -" quote text objects expand into quote (by counting quote signs) -" `aN'` is a shortcut for `2an'` to jump from within one quote into the -" next one, instead of the quote in between -" cursor │ ........ -" line │ a ' bbbbb ' ccccc ' dddd ' eeeee ' fffff ' g -" command │ ││└IL'┘│││└Il'┘│││└I'┘│││└In'┘│││└IN'┘│││ -" │ │└─iL'─┘│├─il'─┘│├─i'─┘│├─in'─┘│├─iN'─┘││ -" │ ├──aL'──┤│ ├┼─a'──┤│ ├┼─aN'──┘│ -" │ └──AL'──┼┘ ├┼─A'──┼┘ ├┼─AN'───┘ -" │ ├──al'──┘│ ├──an'──┘│ -" │ └──Al'───┘ └──An'───┘ -" cursor │ .......... │ ...... │ .......... -" line │ a ' bbbb ' c '' │ ' a ' bbbb ' c ' │ '' b ' cccc ' d -" command │ ││└I'┘│││ │ ││└I'┘│││ │ ││└I'┘│││ -" │ │└─i'─┘││ │ │└─i'─┘││ │ │└─i'─┘││ -" │ ├──a'──┘│ │ ├──a'──┘│ │ ├──a'──┘│ -" │ └──A'───┘ │ └──A'───┘ │ └──A'───┘ -function! s:createQuoteTextObjects(mapType) - " quote text objects - for trigger in split(g:targets_quotes, '\zs') - if trigger ==# " " - continue - elseif trigger ==# "'" - let triggerMap = "' :call targets#" . a:mapType . "('''" - else - let triggerMap = trigger . " :call targets#" . a:mapType . "('" . trigger - endif - call s:addMapping1(a:mapType, triggerMap . "ci', v:count1)", s:i) - call s:addMapping1(a:mapType, triggerMap . "ca', v:count1)", s:a) - call s:addMapping1(a:mapType, triggerMap . "cI', v:count1)", s:I) - call s:addMapping1(a:mapType, triggerMap . "cA', v:count1)", s:A) - call s:addMapping2(a:mapType, triggerMap . "ni', v:count1)", s:i, s:n) - call s:addMapping2(a:mapType, triggerMap . "na', v:count1)", s:a, s:n) - call s:addMapping2(a:mapType, triggerMap . "nI', v:count1)", s:I, s:n) - call s:addMapping2(a:mapType, triggerMap . "nA', v:count1)", s:A, s:n) - call s:addMapping2(a:mapType, triggerMap . "li', v:count1)", s:i, s:l) - call s:addMapping2(a:mapType, triggerMap . "la', v:count1)", s:a, s:l) - call s:addMapping2(a:mapType, triggerMap . "lI', v:count1)", s:I, s:l) - call s:addMapping2(a:mapType, triggerMap . "lA', v:count1)", s:A, s:l) - call s:addMapping2(a:mapType, triggerMap . "Ni', v:count1)", s:i, s:N) - call s:addMapping2(a:mapType, triggerMap . "Na', v:count1)", s:a, s:N) - call s:addMapping2(a:mapType, triggerMap . "NI', v:count1)", s:I, s:N) - call s:addMapping2(a:mapType, triggerMap . "NA', v:count1)", s:A, s:N) - call s:addMapping2(a:mapType, triggerMap . "Li', v:count1)", s:i, s:L) - call s:addMapping2(a:mapType, triggerMap . "La', v:count1)", s:a, s:L) - call s:addMapping2(a:mapType, triggerMap . "LI', v:count1)", s:I, s:L) - call s:addMapping2(a:mapType, triggerMap . "LA', v:count1)", s:A, s:L) - endfor -endfunction - -" separator text objects expand to the right -" cursor | ........ -" line │ a , bbbbb , ccccc , ddddd , eeeee , fffff , g -" command │ ││└IL,┘│││└Il,┘│││└ I,┘│││└In,┘│││└IN,┘│ │ -" │ │└─iL,─┤│├─il,─┤│├─ i,─┤│├─in,─┤│├─iN,─┤ │ -" │ ├──aL,─┘├┼─al,─┘├┼─ a,─┘├┼─an,─┘├┼─aN,─┘ │ -" │ └──AL,──┼┘ └┼─ A,──┼┘ └┼─AN,───┘ -" │ └─ Al, ──┘ └─ An, ──┘ -" cursor │ ......... │ .......... -" line │ a , bbbb , c , d │ a , b , cccc , d -" command │ ││└I,┘│ │ │ ││└I,┘│ │ -" │ │└─i,─┤ │ │ │└─i,─┤ │ -" │ ├──a,─┘ │ │ ├──a,─┘ │ -" │ └──A,───┘ │ └──A,───┘ -function! s:createSeparatorTextObjects(mapType) - " separator text objects - for trigger in split(g:targets_separators, '\zs') - if trigger ==# ' ' - continue - elseif trigger ==# '|' - let trigger = '\|' - endif - let triggerMap = trigger . " :call targets#" . a:mapType . "('" . trigger - call s:addMapping1(a:mapType, triggerMap . "ci', v:count1)", s:i) - call s:addMapping1(a:mapType, triggerMap . "ca', v:count1)", s:a) - call s:addMapping1(a:mapType, triggerMap . "cI', v:count1)", s:I) - call s:addMapping1(a:mapType, triggerMap . "cA', v:count1)", s:A) - call s:addMapping2(a:mapType, triggerMap . "ni', v:count1)", s:i, s:n) - call s:addMapping2(a:mapType, triggerMap . "na', v:count1)", s:a, s:n) - call s:addMapping2(a:mapType, triggerMap . "nI', v:count1)", s:I, s:n) - call s:addMapping2(a:mapType, triggerMap . "nA', v:count1)", s:A, s:n) - call s:addMapping2(a:mapType, triggerMap . "li', v:count1)", s:i, s:l) - call s:addMapping2(a:mapType, triggerMap . "la', v:count1)", s:a, s:l) - call s:addMapping2(a:mapType, triggerMap . "lI', v:count1)", s:I, s:l) - call s:addMapping2(a:mapType, triggerMap . "lA', v:count1)", s:A, s:l) - call s:addMapping2(a:mapType, triggerMap . "Ni', v:count1)", s:i, s:N) - call s:addMapping2(a:mapType, triggerMap . "Na', v:count1)", s:a, s:N) - call s:addMapping2(a:mapType, triggerMap . "NI', v:count1)", s:I, s:N) - call s:addMapping2(a:mapType, triggerMap . "NA', v:count1)", s:A, s:N) - call s:addMapping2(a:mapType, triggerMap . "Li', v:count1)", s:i, s:L) - call s:addMapping2(a:mapType, triggerMap . "La', v:count1)", s:a, s:L) - call s:addMapping2(a:mapType, triggerMap . "LI', v:count1)", s:I, s:L) - call s:addMapping2(a:mapType, triggerMap . "LA', v:count1)", s:A, s:L) - endfor -endfunction - -" argument text objects expand to the right -" cursor | ......... -" line │ a ( bbbbbb , ccccccc , d ( eeeeee , fffffff ) , gggggg ) h -" command │ ││├2Ila┘│││└─Ila─┘││││ ││├─Ia─┘│││└─Ina─┘│││││└2Ina┘│ │ -" │ │└┼2ila─┘│├──ila──┤│││ │└┼─ia──┘│├──ina──┤│││├─2ina─┤ │ -" │ │ └2ala──┼┤ ││││ │ └─aa───┼┤ │││├┼─2ana─┘ │ -" │ └──2Ala──┼┘ ││││ └───Aa───┼┘ │││└┼─2Ana───┘ -" │ ├───ala──┘│││ ├───ana──┘││ │ -" │ └───Ala───┼┤│ └───Ana───┼┤ │ -" │ ││└─────2Ia────────────┘│ │ -" │ │└──────2ia─────────────┤ │ -" │ ├───────2aa─────────────┘ │ -" │ └───────2Aa───────────────┘ -function! s:createArgTextObjects(mapType) - let trigger = g:targets_argTrigger - let triggerMap = trigger . " :call targets#" . a:mapType . "('" . trigger - call s:addMapping1(a:mapType, triggerMap . "ci', v:count1)", s:i) - call s:addMapping1(a:mapType, triggerMap . "ca', v:count1)", s:a) - call s:addMapping1(a:mapType, triggerMap . "cI', v:count1)", s:I) - call s:addMapping1(a:mapType, triggerMap . "cA', v:count1)", s:A) - call s:addMapping2(a:mapType, triggerMap . "ni', v:count1)", s:i, s:n) - call s:addMapping2(a:mapType, triggerMap . "na', v:count1)", s:a, s:n) - call s:addMapping2(a:mapType, triggerMap . "nI', v:count1)", s:I, s:n) - call s:addMapping2(a:mapType, triggerMap . "nA', v:count1)", s:A, s:n) - call s:addMapping2(a:mapType, triggerMap . "li', v:count1)", s:i, s:l) - call s:addMapping2(a:mapType, triggerMap . "la', v:count1)", s:a, s:l) - call s:addMapping2(a:mapType, triggerMap . "lI', v:count1)", s:I, s:l) - call s:addMapping2(a:mapType, triggerMap . "lA', v:count1)", s:A, s:l) -endfunction - -" add expression mappings for `A` and `I` in visual mode #23 unless -" deactivated #49. Manually make mappings for older verions of vim #117. -function! s:addVisualMappings() - if v:version >= 704 || (v:version == 703 && has('patch338')) - silent! execute 'xnoremap ' . s:i . " targets#e('i')" - silent! execute 'xnoremap ' . s:a . " targets#e('a')" - silent! execute 'xnoremap ' . s:I . " targets#e('I')" - silent! execute 'xnoremap ' . s:A . " targets#e('A')" - else - call s:createPairTextObjects('x') - call s:createTagTextObjects('x') - call s:createQuoteTextObjects('x') - call s:createSeparatorTextObjects('x') - call s:createArgTextObjects('x') - endif -endfunction - -function! s:loadSettings() - if !exists('g:targets_aiAI') - let g:targets_aiAI = 'aiAI' - endif - if !exists('g:targets_nlNL') - let g:targets_nlNL = 'nlNL' - endif - if !exists('g:targets_pairs') - let g:targets_pairs = '()b {}B [] <>' - endif - if !exists('g:targets_quotes') - let g:targets_quotes = '" '' `' - endif - if !exists('g:targets_separators') - let g:targets_separators = ', . ; : + - = ~ _ * # / \ | & $' - endif - if !exists('g:targets_tagTrigger') - let g:targets_tagTrigger = 't' - endif - if !exists('g:targets_argTrigger') - let g:targets_argTrigger = 'a' - endif - if !exists('g:targets_argOpening') - let g:targets_argOpening = '[([]' - endif - if !exists('g:targets_argClosing') - let g:targets_argClosing = '[])]' - endif - if !exists('g:targets_argSeparator') - let g:targets_argSeparator = ',' - endif - if !exists('g:targets_seekRanges') - let g:targets_seekRanges = 'cr cb cB lc ac Ac lr rr ll lb ar ab lB Ar aB Ab AB rb al rB Al bb aa bB Aa BB AA' - endif - if !exists('g:targets_jumpRanges') - let g:targets_jumpRanges = 'bb bB BB aa Aa AA' - endif - - let [s:a, s:i, s:A, s:I] = split(g:targets_aiAI, '\zs') - let [s:n, s:l, s:N, s:L] = split(g:targets_nlNL, '\zs') -endfunction - -call s:loadSettings() - -" create the text objects (current total count: 528) -call s:createPairTextObjects('o') -call s:createTagTextObjects('o') -call s:createQuoteTextObjects('o') -call s:createSeparatorTextObjects('o') -call s:createArgTextObjects('o') -call s:addVisualMappings() - -let &cpoptions = s:save_cpoptions -unlet s:save_cpoptions diff --git a/vim/default/bundle/targets.vim/test/Makefile b/vim/default/bundle/targets.vim/test/Makefile deleted file mode 100644 index 985d938b9b..0000000000 --- a/vim/default/bundle/targets.vim/test/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: - @rm -f *.out - @vim -N -u NONE --noplugin -S test.vim - @git diff --no-index test1.ok test1.out && echo "test1 OK" || echo "test1 failed" - @git diff --no-index test2.ok test2.out && echo "test2 OK" || echo "test2 failed" - @git diff --no-index test3.ok test3.out && echo "test3 OK" || echo "test3 failed" - @git diff --no-index test4.ok test4.out && echo "test4 OK" || echo "test4 failed" - @git diff --no-index test5.ok test5.out && echo "test5 OK" || echo "test5 failed" - @git diff --no-index test6.ok test6.out && echo "test6 OK" || echo "test6 failed" diff --git a/vim/default/bundle/targets.vim/test/test.vim b/vim/default/bundle/targets.vim/test/test.vim deleted file mode 100644 index ea7a437a36..0000000000 --- a/vim/default/bundle/targets.vim/test/test.vim +++ /dev/null @@ -1,210 +0,0 @@ -" targets.vim Provides additional text objects -" Author: Christian Wellenbrock -" License: MIT license - -set runtimepath+=../ -set softtabstop=16 expandtab -source ../plugin/targets.vim - -function! s:execute(operation, motions) - if a:operation == 'c' - execute "normal " . a:operation . a:motions . "_" - elseif a:operation == 'v' - execute "normal " . a:operation . a:motions - normal r_ - else - execute "normal " . a:operation . a:motions - endif - if a:operation == 'y' - execute "normal A\'\\"'" - endif - execute "normal I" . a:operation . a:motions . "\\" -endfunction - -function! s:testBasic() - edit test1.in - normal gg0 - - for delset in [ - \ [ '(', ')', 'b' ], - \ [ '{', '}', 'B' ], - \ [ '[', ']' ], - \ [ '<', '>' ], - \ [ 't' ] - \ ] - normal "lyy - - for op in [ 'c', 'd', 'y', 'v' ] - for cnt in [ '', '1', '2' ] - for ln in [ 'l', '', 'n' ] - for iaIA in [ 'I', 'i', 'a', 'A' ] - for del in delset - execute "normal \"lpfx" - call s:execute(op, cnt . iaIA . ln . del) - endfor - endfor - endfor - endfor - endfor - - normal + - endfor - - normal + - - for del in [ "'", '"', '`' ] - normal "lyy - - for op in [ 'c', 'd', 'y', 'v' ] - for cnt in [ '', '1', '2' ] - for LlnN in [ 'L', 'l', '', 'n', 'N' ] - for iaIA in [ 'I', 'i', 'a', 'A' ] - execute "normal \"lpfx" - call s:execute(op, cnt . iaIA . LlnN . del) - endfor - endfor - endfor - endfor - - normal + - endfor - - normal + - - for del in [ ',', '.', ';', ':', '+', '-', '=', '~', '_', '*', '#', '/', '|', '\', '&', '$' ] - normal "lyy - - for op in [ 'c', 'd', 'y', 'v' ] - for cnt in [ '', '1', '2' ] - for LlnN in [ 'L', 'l', '', 'n', 'N' ] - for iaIA in [ 'I', 'i', 'a', 'A' ] - execute "normal \"lpfx" - call s:execute(op, cnt . iaIA . LlnN . del) - endfor - endfor - endfor - endfor - - normal + - endfor - - normal + - - normal "lyy - - for op in [ 'c', 'd', 'y', 'v' ] - for cnt in [ '', '1', '2' ] - for ln in [ 'l', '', 'n' ] - for iaIA in [ 'I', 'i', 'a', 'A' ] - execute "normal \"lpfx" - call s:execute(op, cnt . iaIA . ln . 'a') - endfor - endfor - endfor - endfor - - write! test1.out -endfunction - -function! s:testMultiline() - edit! test2.in - normal gg0 - - execute "normal /comment 1\" - set autoindent - execute "normal cin{foo\" - set autoindent& - - execute "normal /comment 2\" - execute "normal din{" - - execute "normal /comment 3\" - execute "normal cin;foo\" - - execute "normal /comment 4\" - execute "normal cin`foo\" - - execute "normal /comment 5\" - execute "normal cI{foo\" - - write! test2.out -endfunction - -function s:testSeeking() - edit! test3.in - normal gg0 - - for c in split('ABCDEFGHI', '\zs') - execute "normal /" . c . "\" - execute "normal ci)" . c . "\" - endfor - - for c in split('JKLMNO', '\zs') - execute "normal /" . c . "\" - execute "normal ci'" . c . "\" - endfor - - write! test3.out -endfunction - -function s:testVisual() - edit! test4.in - normal gg0 - - for delset in [ - \ [ '(', ')', 'b' ], - \ [ '{', '}', 'B' ], - \ [ '[', ']' ], - \ [ '<', '>' ], - \ [ 't' ] - \ ] - normal "lyy - - for ia in [ 'i', 'a' ] - for del in delset - normal "lpfx - execute "normal v" . ia . del . ia . del . "r_" - endfor - endfor - - normal + - endfor - - - write! test4.out -endfunction - -function s:testModifiers() - edit! test5.in - normal gg0 - - normal fxvItr_ - - write! test5.out -endfunction - -function s:testEmpty() - edit! test6.in - normal gg0 - - normal ci"foo - - normal + - - normal ci(foo - - normal + - - normal ci,foo - - write! test6.out -endfunction - -call s:testBasic() -call s:testMultiline() -call s:testSeeking() -call s:testVisual() -call s:testModifiers() -call s:testEmpty() - -quit! diff --git a/vim/default/bundle/targets.vim/test/test1.in b/vim/default/bundle/targets.vim/test/test1.in deleted file mode 100644 index e830378439..0000000000 --- a/vim/default/bundle/targets.vim/test/test1.in +++ /dev/null @@ -1,28 +0,0 @@ -a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g -a { b } { c } { { x } } { e } { f } g -a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g -a < b > < c > < < x > > < e > < f > g -a b c x e f g - -a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l -a " b " c " d " e " x " g " h " i " k " l -a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l - -a , b , c , d , e , x , g , h , i , k , l -a . b . c . d . e . x . g . h . i . k . l -a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l -a : b : c : d : e : x : g : h : i : k : l -a + b + c + d + e + x + g + h + i + k + l -a - b - c - d - e - x - g - h - i - k - l -a = b = c = d = e = x = g = h = i = k = l -a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l -a * b * c * d * e * x * g * h * i * k * l -a # b # c # d # e # x # g # h # i # k # l -a / b / c / d / e / x / g / h / i / k / l -a | b | c | d | e | x | g | h | i | k | l -a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l -a & b & c & d & e & x & g & h & i & k & l -a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l - -a ( b , c ( d ) , d ( x , e ) , f ) g diff --git a/vim/default/bundle/targets.vim/test/test1.ok b/vim/default/bundle/targets.vim/test/test1.ok deleted file mode 100644 index 96ab4d6bac..0000000000 --- a/vim/default/bundle/targets.vim/test/test1.ok +++ /dev/null @@ -1,6316 +0,0 @@ -a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g -cIl( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -cIl) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -cIlb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -cil( a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -cil) a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -cilb a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -cal( a ( b ) _ ( ( x ) ) ( e ) ( f ) g -cal) a ( b ) _ ( ( x ) ) ( e ) ( f ) g -calb a ( b ) _ ( ( x ) ) ( e ) ( f ) g -cAl( a ( b ) _( ( x ) ) ( e ) ( f ) g -cAl) a ( b ) _( ( x ) ) ( e ) ( f ) g -cAlb a ( b ) _( ( x ) ) ( e ) ( f ) g -cI( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -cI) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -cIb a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -ci( a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -ci) a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -cib a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -ca( a ( b ) ( c ) ( _ ) ( e ) ( f ) g -ca) a ( b ) ( c ) ( _ ) ( e ) ( f ) g -cab a ( b ) ( c ) ( _ ) ( e ) ( f ) g -cA( a ( b ) ( c ) ( _) ( e ) ( f ) g -cA) a ( b ) ( c ) ( _) ( e ) ( f ) g -cAb a ( b ) ( c ) ( _) ( e ) ( f ) g -cIn( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -cIn) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -cInb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -cin( a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -cin) a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -cinb a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -can( a ( b ) ( c ) ( ( x ) ) _ ( f ) g -can) a ( b ) ( c ) ( ( x ) ) _ ( f ) g -canb a ( b ) ( c ) ( ( x ) ) _ ( f ) g -cAn( a ( b ) ( c ) ( ( x ) ) _( f ) g -cAn) a ( b ) ( c ) ( ( x ) ) _( f ) g -cAnb a ( b ) ( c ) ( ( x ) ) _( f ) g -c1Il( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -c1Il) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -c1Ilb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -c1il( a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -c1il) a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -c1ilb a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -c1al( a ( b ) _ ( ( x ) ) ( e ) ( f ) g -c1al) a ( b ) _ ( ( x ) ) ( e ) ( f ) g -c1alb a ( b ) _ ( ( x ) ) ( e ) ( f ) g -c1Al( a ( b ) _( ( x ) ) ( e ) ( f ) g -c1Al) a ( b ) _( ( x ) ) ( e ) ( f ) g -c1Alb a ( b ) _( ( x ) ) ( e ) ( f ) g -c1I( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -c1I) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -c1Ib a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -c1i( a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -c1i) a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -c1ib a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -c1a( a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c1a) a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c1ab a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c1A( a ( b ) ( c ) ( _) ( e ) ( f ) g -c1A) a ( b ) ( c ) ( _) ( e ) ( f ) g -c1Ab a ( b ) ( c ) ( _) ( e ) ( f ) g -c1In( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -c1In) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -c1Inb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -c1in( a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -c1in) a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -c1inb a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -c1an( a ( b ) ( c ) ( ( x ) ) _ ( f ) g -c1an) a ( b ) ( c ) ( ( x ) ) _ ( f ) g -c1anb a ( b ) ( c ) ( ( x ) ) _ ( f ) g -c1An( a ( b ) ( c ) ( ( x ) ) _( f ) g -c1An) a ( b ) ( c ) ( ( x ) ) _( f ) g -c1Anb a ( b ) ( c ) ( ( x ) ) _( f ) g -c2Il( a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -c2Il) a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -c2Ilb a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -c2il( a (_) ( c ) ( ( x ) ) ( e ) ( f ) g -c2il) a (_) ( c ) ( ( x ) ) ( e ) ( f ) g -c2ilb a (_) ( c ) ( ( x ) ) ( e ) ( f ) g -c2al( a _ ( c ) ( ( x ) ) ( e ) ( f ) g -c2al) a _ ( c ) ( ( x ) ) ( e ) ( f ) g -c2alb a _ ( c ) ( ( x ) ) ( e ) ( f ) g -c2Al( a _( c ) ( ( x ) ) ( e ) ( f ) g -c2Al) a _( c ) ( ( x ) ) ( e ) ( f ) g -c2Alb a _( c ) ( ( x ) ) ( e ) ( f ) g -c2I( a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c2I) a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c2Ib a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c2i( a ( b ) ( c ) (_) ( e ) ( f ) g -c2i) a ( b ) ( c ) (_) ( e ) ( f ) g -c2ib a ( b ) ( c ) (_) ( e ) ( f ) g -c2a( a ( b ) ( c ) _ ( e ) ( f ) g -c2a) a ( b ) ( c ) _ ( e ) ( f ) g -c2ab a ( b ) ( c ) _ ( e ) ( f ) g -c2A( a ( b ) ( c ) _( e ) ( f ) g -c2A) a ( b ) ( c ) _( e ) ( f ) g -c2Ab a ( b ) ( c ) _( e ) ( f ) g -c2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -c2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -c2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -c2in( a ( b ) ( c ) ( ( x ) ) ( e ) (_) g -c2in) a ( b ) ( c ) ( ( x ) ) ( e ) (_) g -c2inb a ( b ) ( c ) ( ( x ) ) ( e ) (_) g -c2an( a ( b ) ( c ) ( ( x ) ) ( e ) _ g -c2an) a ( b ) ( c ) ( ( x ) ) ( e ) _ g -c2anb a ( b ) ( c ) ( ( x ) ) ( e ) _ g -c2An( a ( b ) ( c ) ( ( x ) ) ( e ) _g -c2An) a ( b ) ( c ) ( ( x ) ) ( e ) _g -c2Anb a ( b ) ( c ) ( ( x ) ) ( e ) _g -dIl( a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -dIl) a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -dIlb a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -dil( a ( b ) () ( ( x ) ) ( e ) ( f ) g -dil) a ( b ) () ( ( x ) ) ( e ) ( f ) g -dilb a ( b ) () ( ( x ) ) ( e ) ( f ) g -dal( a ( b ) ( ( x ) ) ( e ) ( f ) g -dal) a ( b ) ( ( x ) ) ( e ) ( f ) g -dalb a ( b ) ( ( x ) ) ( e ) ( f ) g -dAl( a ( b ) ( ( x ) ) ( e ) ( f ) g -dAl) a ( b ) ( ( x ) ) ( e ) ( f ) g -dAlb a ( b ) ( ( x ) ) ( e ) ( f ) g -dI( a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -dI) a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -dIb a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -di( a ( b ) ( c ) ( () ) ( e ) ( f ) g -di) a ( b ) ( c ) ( () ) ( e ) ( f ) g -dib a ( b ) ( c ) ( () ) ( e ) ( f ) g -da( a ( b ) ( c ) ( ) ( e ) ( f ) g -da) a ( b ) ( c ) ( ) ( e ) ( f ) g -dab a ( b ) ( c ) ( ) ( e ) ( f ) g -dA( a ( b ) ( c ) ( ) ( e ) ( f ) g -dA) a ( b ) ( c ) ( ) ( e ) ( f ) g -dAb a ( b ) ( c ) ( ) ( e ) ( f ) g -dIn( a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -dIn) a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -dInb a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -din( a ( b ) ( c ) ( ( x ) ) () ( f ) g -din) a ( b ) ( c ) ( ( x ) ) () ( f ) g -dinb a ( b ) ( c ) ( ( x ) ) () ( f ) g -dan( a ( b ) ( c ) ( ( x ) ) ( f ) g -dan) a ( b ) ( c ) ( ( x ) ) ( f ) g -danb a ( b ) ( c ) ( ( x ) ) ( f ) g -dAn( a ( b ) ( c ) ( ( x ) ) ( f ) g -dAn) a ( b ) ( c ) ( ( x ) ) ( f ) g -dAnb a ( b ) ( c ) ( ( x ) ) ( f ) g -d1Il( a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -d1Il) a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -d1Ilb a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -d1il( a ( b ) () ( ( x ) ) ( e ) ( f ) g -d1il) a ( b ) () ( ( x ) ) ( e ) ( f ) g -d1ilb a ( b ) () ( ( x ) ) ( e ) ( f ) g -d1al( a ( b ) ( ( x ) ) ( e ) ( f ) g -d1al) a ( b ) ( ( x ) ) ( e ) ( f ) g -d1alb a ( b ) ( ( x ) ) ( e ) ( f ) g -d1Al( a ( b ) ( ( x ) ) ( e ) ( f ) g -d1Al) a ( b ) ( ( x ) ) ( e ) ( f ) g -d1Alb a ( b ) ( ( x ) ) ( e ) ( f ) g -d1I( a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -d1I) a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -d1Ib a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -d1i( a ( b ) ( c ) ( () ) ( e ) ( f ) g -d1i) a ( b ) ( c ) ( () ) ( e ) ( f ) g -d1ib a ( b ) ( c ) ( () ) ( e ) ( f ) g -d1a( a ( b ) ( c ) ( ) ( e ) ( f ) g -d1a) a ( b ) ( c ) ( ) ( e ) ( f ) g -d1ab a ( b ) ( c ) ( ) ( e ) ( f ) g -d1A( a ( b ) ( c ) ( ) ( e ) ( f ) g -d1A) a ( b ) ( c ) ( ) ( e ) ( f ) g -d1Ab a ( b ) ( c ) ( ) ( e ) ( f ) g -d1In( a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -d1In) a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -d1Inb a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -d1in( a ( b ) ( c ) ( ( x ) ) () ( f ) g -d1in) a ( b ) ( c ) ( ( x ) ) () ( f ) g -d1inb a ( b ) ( c ) ( ( x ) ) () ( f ) g -d1an( a ( b ) ( c ) ( ( x ) ) ( f ) g -d1an) a ( b ) ( c ) ( ( x ) ) ( f ) g -d1anb a ( b ) ( c ) ( ( x ) ) ( f ) g -d1An( a ( b ) ( c ) ( ( x ) ) ( f ) g -d1An) a ( b ) ( c ) ( ( x ) ) ( f ) g -d1Anb a ( b ) ( c ) ( ( x ) ) ( f ) g -d2Il( a ( ) ( c ) ( ( x ) ) ( e ) ( f ) g -d2Il) a ( ) ( c ) ( ( x ) ) ( e ) ( f ) g -d2Ilb a ( ) ( c ) ( ( x ) ) ( e ) ( f ) g -d2il( a () ( c ) ( ( x ) ) ( e ) ( f ) g -d2il) a () ( c ) ( ( x ) ) ( e ) ( f ) g -d2ilb a () ( c ) ( ( x ) ) ( e ) ( f ) g -d2al( a ( c ) ( ( x ) ) ( e ) ( f ) g -d2al) a ( c ) ( ( x ) ) ( e ) ( f ) g -d2alb a ( c ) ( ( x ) ) ( e ) ( f ) g -d2Al( a ( c ) ( ( x ) ) ( e ) ( f ) g -d2Al) a ( c ) ( ( x ) ) ( e ) ( f ) g -d2Alb a ( c ) ( ( x ) ) ( e ) ( f ) g -d2I( a ( b ) ( c ) ( ) ( e ) ( f ) g -d2I) a ( b ) ( c ) ( ) ( e ) ( f ) g -d2Ib a ( b ) ( c ) ( ) ( e ) ( f ) g -d2i( a ( b ) ( c ) () ( e ) ( f ) g -d2i) a ( b ) ( c ) () ( e ) ( f ) g -d2ib a ( b ) ( c ) () ( e ) ( f ) g -d2a( a ( b ) ( c ) ( e ) ( f ) g -d2a) a ( b ) ( c ) ( e ) ( f ) g -d2ab a ( b ) ( c ) ( e ) ( f ) g -d2A( a ( b ) ( c ) ( e ) ( f ) g -d2A) a ( b ) ( c ) ( e ) ( f ) g -d2Ab a ( b ) ( c ) ( e ) ( f ) g -d2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( ) g -d2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( ) g -d2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( ) g -d2in( a ( b ) ( c ) ( ( x ) ) ( e ) () g -d2in) a ( b ) ( c ) ( ( x ) ) ( e ) () g -d2inb a ( b ) ( c ) ( ( x ) ) ( e ) () g -d2an( a ( b ) ( c ) ( ( x ) ) ( e ) g -d2an) a ( b ) ( c ) ( ( x ) ) ( e ) g -d2anb a ( b ) ( c ) ( ( x ) ) ( e ) g -d2An( a ( b ) ( c ) ( ( x ) ) ( e ) g -d2An) a ( b ) ( c ) ( ( x ) ) ( e ) g -d2Anb a ( b ) ( c ) ( ( x ) ) ( e ) g -yIl( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -yIl) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -yIlb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -yil( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -yil) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -yilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -yal( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -yal) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -yalb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -yAl( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -yAl) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -yAlb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -yI( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -yI) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -yIb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -yi( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -yi) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -yib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -ya( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -ya) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -yab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -yA( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -yA) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -yAb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -yIn( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -yIn) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -yInb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -yin( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -yin) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -yinb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -yan( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -yan) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -yanb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -yAn( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -yAn) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -yAnb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y1Il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -y1Il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -y1Ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -y1il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -y1il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -y1ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -y1al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -y1al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -y1alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -y1Al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -y1Al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -y1Alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -y1I( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -y1I) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -y1Ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -y1i( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -y1i) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -y1ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -y1a( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y1a) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y1ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y1A( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -y1A) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -y1Ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -y1In( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -y1In) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -y1Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -y1in( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -y1in) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -y1inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -y1an( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -y1an) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -y1anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -y1An( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y1An) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y1Anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y2Il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'b' -y2Il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'b' -y2Ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'b' -y2il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' b ' -y2il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' b ' -y2ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' b ' -y2al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b )' -y2al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b )' -y2alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b )' -y2Al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b ) ' -y2Al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b ) ' -y2Alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b ) ' -y2I( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y2I) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y2Ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y2i( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' ( x ) ' -y2i) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' ( x ) ' -y2ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' ( x ) ' -y2a( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) )' -y2a) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) )' -y2ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) )' -y2A( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) ) ' -y2A) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) ) ' -y2Ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) ) ' -y2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'f' -y2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'f' -y2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'f' -y2in( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' f ' -y2in) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' f ' -y2inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' f ' -y2an( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f )' -y2an) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f )' -y2anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f )' -y2An( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f ) ' -y2An) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f ) ' -y2Anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f ) ' -vIl( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -vIl) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -vIlb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -vil( a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -vil) a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -vilb a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -val( a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -val) a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -valb a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -vAl( a ( b ) ______( ( x ) ) ( e ) ( f ) g -vAl) a ( b ) ______( ( x ) ) ( e ) ( f ) g -vAlb a ( b ) ______( ( x ) ) ( e ) ( f ) g -vI( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -vI) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -vIb a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -vi( a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -vi) a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -vib a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -va( a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -va) a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -vab a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -vA( a ( b ) ( c ) ( ______) ( e ) ( f ) g -vA) a ( b ) ( c ) ( ______) ( e ) ( f ) g -vAb a ( b ) ( c ) ( ______) ( e ) ( f ) g -vIn( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -vIn) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -vInb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -vin( a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -vin) a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -vinb a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -van( a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -van) a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -vanb a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -vAn( a ( b ) ( c ) ( ( x ) ) ______( f ) g -vAn) a ( b ) ( c ) ( ( x ) ) ______( f ) g -vAnb a ( b ) ( c ) ( ( x ) ) ______( f ) g -v1Il( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -v1Il) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -v1Ilb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -v1il( a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -v1il) a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -v1ilb a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -v1al( a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -v1al) a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -v1alb a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -v1Al( a ( b ) ______( ( x ) ) ( e ) ( f ) g -v1Al) a ( b ) ______( ( x ) ) ( e ) ( f ) g -v1Alb a ( b ) ______( ( x ) ) ( e ) ( f ) g -v1I( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -v1I) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -v1Ib a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -v1i( a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -v1i) a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -v1ib a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -v1a( a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v1a) a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v1ab a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v1A( a ( b ) ( c ) ( ______) ( e ) ( f ) g -v1A) a ( b ) ( c ) ( ______) ( e ) ( f ) g -v1Ab a ( b ) ( c ) ( ______) ( e ) ( f ) g -v1In( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -v1In) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -v1Inb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -v1in( a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -v1in) a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -v1inb a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -v1an( a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -v1an) a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -v1anb a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -v1An( a ( b ) ( c ) ( ( x ) ) ______( f ) g -v1An) a ( b ) ( c ) ( ( x ) ) ______( f ) g -v1Anb a ( b ) ( c ) ( ( x ) ) ______( f ) g -v2Il( a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -v2Il) a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -v2Ilb a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -v2il( a (___) ( c ) ( ( x ) ) ( e ) ( f ) g -v2il) a (___) ( c ) ( ( x ) ) ( e ) ( f ) g -v2ilb a (___) ( c ) ( ( x ) ) ( e ) ( f ) g -v2al( a _____ ( c ) ( ( x ) ) ( e ) ( f ) g -v2al) a _____ ( c ) ( ( x ) ) ( e ) ( f ) g -v2alb a _____ ( c ) ( ( x ) ) ( e ) ( f ) g -v2Al( a ______( c ) ( ( x ) ) ( e ) ( f ) g -v2Al) a ______( c ) ( ( x ) ) ( e ) ( f ) g -v2Alb a ______( c ) ( ( x ) ) ( e ) ( f ) g -v2I( a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v2I) a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v2Ib a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v2i( a ( b ) ( c ) (_______) ( e ) ( f ) g -v2i) a ( b ) ( c ) (_______) ( e ) ( f ) g -v2ib a ( b ) ( c ) (_______) ( e ) ( f ) g -v2a( a ( b ) ( c ) _________ ( e ) ( f ) g -v2a) a ( b ) ( c ) _________ ( e ) ( f ) g -v2ab a ( b ) ( c ) _________ ( e ) ( f ) g -v2A( a ( b ) ( c ) __________( e ) ( f ) g -v2A) a ( b ) ( c ) __________( e ) ( f ) g -v2Ab a ( b ) ( c ) __________( e ) ( f ) g -v2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -v2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -v2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -v2in( a ( b ) ( c ) ( ( x ) ) ( e ) (___) g -v2in) a ( b ) ( c ) ( ( x ) ) ( e ) (___) g -v2inb a ( b ) ( c ) ( ( x ) ) ( e ) (___) g -v2an( a ( b ) ( c ) ( ( x ) ) ( e ) _____ g -v2an) a ( b ) ( c ) ( ( x ) ) ( e ) _____ g -v2anb a ( b ) ( c ) ( ( x ) ) ( e ) _____ g -v2An( a ( b ) ( c ) ( ( x ) ) ( e ) ______g -v2An) a ( b ) ( c ) ( ( x ) ) ( e ) ______g -v2Anb a ( b ) ( c ) ( ( x ) ) ( e ) ______g -a { b } { c } { { x } } { e } { f } g -cIl{ a { b } { _ } { { x } } { e } { f } g -cIl} a { b } { _ } { { x } } { e } { f } g -cIlB a { b } { _ } { { x } } { e } { f } g -cil{ a { b } {_} { { x } } { e } { f } g -cil} a { b } {_} { { x } } { e } { f } g -cilB a { b } {_} { { x } } { e } { f } g -cal{ a { b } _ { { x } } { e } { f } g -cal} a { b } _ { { x } } { e } { f } g -calB a { b } _ { { x } } { e } { f } g -cAl{ a { b } _{ { x } } { e } { f } g -cAl} a { b } _{ { x } } { e } { f } g -cAlB a { b } _{ { x } } { e } { f } g -cI{ a { b } { c } { { _ } } { e } { f } g -cI} a { b } { c } { { _ } } { e } { f } g -cIB a { b } { c } { { _ } } { e } { f } g -ci{ a { b } { c } { {_} } { e } { f } g -ci} a { b } { c } { {_} } { e } { f } g -ciB a { b } { c } { {_} } { e } { f } g -ca{ a { b } { c } { _ } { e } { f } g -ca} a { b } { c } { _ } { e } { f } g -caB a { b } { c } { _ } { e } { f } g -cA{ a { b } { c } { _} { e } { f } g -cA} a { b } { c } { _} { e } { f } g -cAB a { b } { c } { _} { e } { f } g -cIn{ a { b } { c } { { x } } { _ } { f } g -cIn} a { b } { c } { { x } } { _ } { f } g -cInB a { b } { c } { { x } } { _ } { f } g -cin{ a { b } { c } { { x } } {_} { f } g -cin} a { b } { c } { { x } } {_} { f } g -cinB a { b } { c } { { x } } {_} { f } g -can{ a { b } { c } { { x } } _ { f } g -can} a { b } { c } { { x } } _ { f } g -canB a { b } { c } { { x } } _ { f } g -cAn{ a { b } { c } { { x } } _{ f } g -cAn} a { b } { c } { { x } } _{ f } g -cAnB a { b } { c } { { x } } _{ f } g -c1Il{ a { b } { _ } { { x } } { e } { f } g -c1Il} a { b } { _ } { { x } } { e } { f } g -c1IlB a { b } { _ } { { x } } { e } { f } g -c1il{ a { b } {_} { { x } } { e } { f } g -c1il} a { b } {_} { { x } } { e } { f } g -c1ilB a { b } {_} { { x } } { e } { f } g -c1al{ a { b } _ { { x } } { e } { f } g -c1al} a { b } _ { { x } } { e } { f } g -c1alB a { b } _ { { x } } { e } { f } g -c1Al{ a { b } _{ { x } } { e } { f } g -c1Al} a { b } _{ { x } } { e } { f } g -c1AlB a { b } _{ { x } } { e } { f } g -c1I{ a { b } { c } { { _ } } { e } { f } g -c1I} a { b } { c } { { _ } } { e } { f } g -c1IB a { b } { c } { { _ } } { e } { f } g -c1i{ a { b } { c } { {_} } { e } { f } g -c1i} a { b } { c } { {_} } { e } { f } g -c1iB a { b } { c } { {_} } { e } { f } g -c1a{ a { b } { c } { _ } { e } { f } g -c1a} a { b } { c } { _ } { e } { f } g -c1aB a { b } { c } { _ } { e } { f } g -c1A{ a { b } { c } { _} { e } { f } g -c1A} a { b } { c } { _} { e } { f } g -c1AB a { b } { c } { _} { e } { f } g -c1In{ a { b } { c } { { x } } { _ } { f } g -c1In} a { b } { c } { { x } } { _ } { f } g -c1InB a { b } { c } { { x } } { _ } { f } g -c1in{ a { b } { c } { { x } } {_} { f } g -c1in} a { b } { c } { { x } } {_} { f } g -c1inB a { b } { c } { { x } } {_} { f } g -c1an{ a { b } { c } { { x } } _ { f } g -c1an} a { b } { c } { { x } } _ { f } g -c1anB a { b } { c } { { x } } _ { f } g -c1An{ a { b } { c } { { x } } _{ f } g -c1An} a { b } { c } { { x } } _{ f } g -c1AnB a { b } { c } { { x } } _{ f } g -c2Il{ a { _ } { c } { { x } } { e } { f } g -c2Il} a { _ } { c } { { x } } { e } { f } g -c2IlB a { _ } { c } { { x } } { e } { f } g -c2il{ a {_} { c } { { x } } { e } { f } g -c2il} a {_} { c } { { x } } { e } { f } g -c2ilB a {_} { c } { { x } } { e } { f } g -c2al{ a _ { c } { { x } } { e } { f } g -c2al} a _ { c } { { x } } { e } { f } g -c2alB a _ { c } { { x } } { e } { f } g -c2Al{ a _{ c } { { x } } { e } { f } g -c2Al} a _{ c } { { x } } { e } { f } g -c2AlB a _{ c } { { x } } { e } { f } g -c2I{ a { b } { c } { _ } { e } { f } g -c2I} a { b } { c } { _ } { e } { f } g -c2IB a { b } { c } { _ } { e } { f } g -c2i{ a { b } { c } {_} { e } { f } g -c2i} a { b } { c } {_} { e } { f } g -c2iB a { b } { c } {_} { e } { f } g -c2a{ a { b } { c } _ { e } { f } g -c2a} a { b } { c } _ { e } { f } g -c2aB a { b } { c } _ { e } { f } g -c2A{ a { b } { c } _{ e } { f } g -c2A} a { b } { c } _{ e } { f } g -c2AB a { b } { c } _{ e } { f } g -c2In{ a { b } { c } { { x } } { e } { _ } g -c2In} a { b } { c } { { x } } { e } { _ } g -c2InB a { b } { c } { { x } } { e } { _ } g -c2in{ a { b } { c } { { x } } { e } {_} g -c2in} a { b } { c } { { x } } { e } {_} g -c2inB a { b } { c } { { x } } { e } {_} g -c2an{ a { b } { c } { { x } } { e } _ g -c2an} a { b } { c } { { x } } { e } _ g -c2anB a { b } { c } { { x } } { e } _ g -c2An{ a { b } { c } { { x } } { e } _g -c2An} a { b } { c } { { x } } { e } _g -c2AnB a { b } { c } { { x } } { e } _g -dIl{ a { b } { } { { x } } { e } { f } g -dIl} a { b } { } { { x } } { e } { f } g -dIlB a { b } { } { { x } } { e } { f } g -dil{ a { b } {} { { x } } { e } { f } g -dil} a { b } {} { { x } } { e } { f } g -dilB a { b } {} { { x } } { e } { f } g -dal{ a { b } { { x } } { e } { f } g -dal} a { b } { { x } } { e } { f } g -dalB a { b } { { x } } { e } { f } g -dAl{ a { b } { { x } } { e } { f } g -dAl} a { b } { { x } } { e } { f } g -dAlB a { b } { { x } } { e } { f } g -dI{ a { b } { c } { { } } { e } { f } g -dI} a { b } { c } { { } } { e } { f } g -dIB a { b } { c } { { } } { e } { f } g -di{ a { b } { c } { {} } { e } { f } g -di} a { b } { c } { {} } { e } { f } g -diB a { b } { c } { {} } { e } { f } g -da{ a { b } { c } { } { e } { f } g -da} a { b } { c } { } { e } { f } g -daB a { b } { c } { } { e } { f } g -dA{ a { b } { c } { } { e } { f } g -dA} a { b } { c } { } { e } { f } g -dAB a { b } { c } { } { e } { f } g -dIn{ a { b } { c } { { x } } { } { f } g -dIn} a { b } { c } { { x } } { } { f } g -dInB a { b } { c } { { x } } { } { f } g -din{ a { b } { c } { { x } } {} { f } g -din} a { b } { c } { { x } } {} { f } g -dinB a { b } { c } { { x } } {} { f } g -dan{ a { b } { c } { { x } } { f } g -dan} a { b } { c } { { x } } { f } g -danB a { b } { c } { { x } } { f } g -dAn{ a { b } { c } { { x } } { f } g -dAn} a { b } { c } { { x } } { f } g -dAnB a { b } { c } { { x } } { f } g -d1Il{ a { b } { } { { x } } { e } { f } g -d1Il} a { b } { } { { x } } { e } { f } g -d1IlB a { b } { } { { x } } { e } { f } g -d1il{ a { b } {} { { x } } { e } { f } g -d1il} a { b } {} { { x } } { e } { f } g -d1ilB a { b } {} { { x } } { e } { f } g -d1al{ a { b } { { x } } { e } { f } g -d1al} a { b } { { x } } { e } { f } g -d1alB a { b } { { x } } { e } { f } g -d1Al{ a { b } { { x } } { e } { f } g -d1Al} a { b } { { x } } { e } { f } g -d1AlB a { b } { { x } } { e } { f } g -d1I{ a { b } { c } { { } } { e } { f } g -d1I} a { b } { c } { { } } { e } { f } g -d1IB a { b } { c } { { } } { e } { f } g -d1i{ a { b } { c } { {} } { e } { f } g -d1i} a { b } { c } { {} } { e } { f } g -d1iB a { b } { c } { {} } { e } { f } g -d1a{ a { b } { c } { } { e } { f } g -d1a} a { b } { c } { } { e } { f } g -d1aB a { b } { c } { } { e } { f } g -d1A{ a { b } { c } { } { e } { f } g -d1A} a { b } { c } { } { e } { f } g -d1AB a { b } { c } { } { e } { f } g -d1In{ a { b } { c } { { x } } { } { f } g -d1In} a { b } { c } { { x } } { } { f } g -d1InB a { b } { c } { { x } } { } { f } g -d1in{ a { b } { c } { { x } } {} { f } g -d1in} a { b } { c } { { x } } {} { f } g -d1inB a { b } { c } { { x } } {} { f } g -d1an{ a { b } { c } { { x } } { f } g -d1an} a { b } { c } { { x } } { f } g -d1anB a { b } { c } { { x } } { f } g -d1An{ a { b } { c } { { x } } { f } g -d1An} a { b } { c } { { x } } { f } g -d1AnB a { b } { c } { { x } } { f } g -d2Il{ a { } { c } { { x } } { e } { f } g -d2Il} a { } { c } { { x } } { e } { f } g -d2IlB a { } { c } { { x } } { e } { f } g -d2il{ a {} { c } { { x } } { e } { f } g -d2il} a {} { c } { { x } } { e } { f } g -d2ilB a {} { c } { { x } } { e } { f } g -d2al{ a { c } { { x } } { e } { f } g -d2al} a { c } { { x } } { e } { f } g -d2alB a { c } { { x } } { e } { f } g -d2Al{ a { c } { { x } } { e } { f } g -d2Al} a { c } { { x } } { e } { f } g -d2AlB a { c } { { x } } { e } { f } g -d2I{ a { b } { c } { } { e } { f } g -d2I} a { b } { c } { } { e } { f } g -d2IB a { b } { c } { } { e } { f } g -d2i{ a { b } { c } {} { e } { f } g -d2i} a { b } { c } {} { e } { f } g -d2iB a { b } { c } {} { e } { f } g -d2a{ a { b } { c } { e } { f } g -d2a} a { b } { c } { e } { f } g -d2aB a { b } { c } { e } { f } g -d2A{ a { b } { c } { e } { f } g -d2A} a { b } { c } { e } { f } g -d2AB a { b } { c } { e } { f } g -d2In{ a { b } { c } { { x } } { e } { } g -d2In} a { b } { c } { { x } } { e } { } g -d2InB a { b } { c } { { x } } { e } { } g -d2in{ a { b } { c } { { x } } { e } {} g -d2in} a { b } { c } { { x } } { e } {} g -d2inB a { b } { c } { { x } } { e } {} g -d2an{ a { b } { c } { { x } } { e } g -d2an} a { b } { c } { { x } } { e } g -d2anB a { b } { c } { { x } } { e } g -d2An{ a { b } { c } { { x } } { e } g -d2An} a { b } { c } { { x } } { e } g -d2AnB a { b } { c } { { x } } { e } g -yIl{ a { b } { c } { { x } } { e } { f } g 'c' -yIl} a { b } { c } { { x } } { e } { f } g 'c' -yIlB a { b } { c } { { x } } { e } { f } g 'c' -yil{ a { b } { c } { { x } } { e } { f } g ' c ' -yil} a { b } { c } { { x } } { e } { f } g ' c ' -yilB a { b } { c } { { x } } { e } { f } g ' c ' -yal{ a { b } { c } { { x } } { e } { f } g '{ c }' -yal} a { b } { c } { { x } } { e } { f } g '{ c }' -yalB a { b } { c } { { x } } { e } { f } g '{ c }' -yAl{ a { b } { c } { { x } } { e } { f } g '{ c } ' -yAl} a { b } { c } { { x } } { e } { f } g '{ c } ' -yAlB a { b } { c } { { x } } { e } { f } g '{ c } ' -yI{ a { b } { c } { { x } } { e } { f } g 'x' -yI} a { b } { c } { { x } } { e } { f } g 'x' -yIB a { b } { c } { { x } } { e } { f } g 'x' -yi{ a { b } { c } { { x } } { e } { f } g ' x ' -yi} a { b } { c } { { x } } { e } { f } g ' x ' -yiB a { b } { c } { { x } } { e } { f } g ' x ' -ya{ a { b } { c } { { x } } { e } { f } g '{ x }' -ya} a { b } { c } { { x } } { e } { f } g '{ x }' -yaB a { b } { c } { { x } } { e } { f } g '{ x }' -yA{ a { b } { c } { { x } } { e } { f } g '{ x } ' -yA} a { b } { c } { { x } } { e } { f } g '{ x } ' -yAB a { b } { c } { { x } } { e } { f } g '{ x } ' -yIn{ a { b } { c } { { x } } { e } { f } g 'e' -yIn} a { b } { c } { { x } } { e } { f } g 'e' -yInB a { b } { c } { { x } } { e } { f } g 'e' -yin{ a { b } { c } { { x } } { e } { f } g ' e ' -yin} a { b } { c } { { x } } { e } { f } g ' e ' -yinB a { b } { c } { { x } } { e } { f } g ' e ' -yan{ a { b } { c } { { x } } { e } { f } g '{ e }' -yan} a { b } { c } { { x } } { e } { f } g '{ e }' -yanB a { b } { c } { { x } } { e } { f } g '{ e }' -yAn{ a { b } { c } { { x } } { e } { f } g '{ e } ' -yAn} a { b } { c } { { x } } { e } { f } g '{ e } ' -yAnB a { b } { c } { { x } } { e } { f } g '{ e } ' -y1Il{ a { b } { c } { { x } } { e } { f } g 'c' -y1Il} a { b } { c } { { x } } { e } { f } g 'c' -y1IlB a { b } { c } { { x } } { e } { f } g 'c' -y1il{ a { b } { c } { { x } } { e } { f } g ' c ' -y1il} a { b } { c } { { x } } { e } { f } g ' c ' -y1ilB a { b } { c } { { x } } { e } { f } g ' c ' -y1al{ a { b } { c } { { x } } { e } { f } g '{ c }' -y1al} a { b } { c } { { x } } { e } { f } g '{ c }' -y1alB a { b } { c } { { x } } { e } { f } g '{ c }' -y1Al{ a { b } { c } { { x } } { e } { f } g '{ c } ' -y1Al} a { b } { c } { { x } } { e } { f } g '{ c } ' -y1AlB a { b } { c } { { x } } { e } { f } g '{ c } ' -y1I{ a { b } { c } { { x } } { e } { f } g 'x' -y1I} a { b } { c } { { x } } { e } { f } g 'x' -y1IB a { b } { c } { { x } } { e } { f } g 'x' -y1i{ a { b } { c } { { x } } { e } { f } g ' x ' -y1i} a { b } { c } { { x } } { e } { f } g ' x ' -y1iB a { b } { c } { { x } } { e } { f } g ' x ' -y1a{ a { b } { c } { { x } } { e } { f } g '{ x }' -y1a} a { b } { c } { { x } } { e } { f } g '{ x }' -y1aB a { b } { c } { { x } } { e } { f } g '{ x }' -y1A{ a { b } { c } { { x } } { e } { f } g '{ x } ' -y1A} a { b } { c } { { x } } { e } { f } g '{ x } ' -y1AB a { b } { c } { { x } } { e } { f } g '{ x } ' -y1In{ a { b } { c } { { x } } { e } { f } g 'e' -y1In} a { b } { c } { { x } } { e } { f } g 'e' -y1InB a { b } { c } { { x } } { e } { f } g 'e' -y1in{ a { b } { c } { { x } } { e } { f } g ' e ' -y1in} a { b } { c } { { x } } { e } { f } g ' e ' -y1inB a { b } { c } { { x } } { e } { f } g ' e ' -y1an{ a { b } { c } { { x } } { e } { f } g '{ e }' -y1an} a { b } { c } { { x } } { e } { f } g '{ e }' -y1anB a { b } { c } { { x } } { e } { f } g '{ e }' -y1An{ a { b } { c } { { x } } { e } { f } g '{ e } ' -y1An} a { b } { c } { { x } } { e } { f } g '{ e } ' -y1AnB a { b } { c } { { x } } { e } { f } g '{ e } ' -y2Il{ a { b } { c } { { x } } { e } { f } g 'b' -y2Il} a { b } { c } { { x } } { e } { f } g 'b' -y2IlB a { b } { c } { { x } } { e } { f } g 'b' -y2il{ a { b } { c } { { x } } { e } { f } g ' b ' -y2il} a { b } { c } { { x } } { e } { f } g ' b ' -y2ilB a { b } { c } { { x } } { e } { f } g ' b ' -y2al{ a { b } { c } { { x } } { e } { f } g '{ b }' -y2al} a { b } { c } { { x } } { e } { f } g '{ b }' -y2alB a { b } { c } { { x } } { e } { f } g '{ b }' -y2Al{ a { b } { c } { { x } } { e } { f } g '{ b } ' -y2Al} a { b } { c } { { x } } { e } { f } g '{ b } ' -y2AlB a { b } { c } { { x } } { e } { f } g '{ b } ' -y2I{ a { b } { c } { { x } } { e } { f } g '{ x }' -y2I} a { b } { c } { { x } } { e } { f } g '{ x }' -y2IB a { b } { c } { { x } } { e } { f } g '{ x }' -y2i{ a { b } { c } { { x } } { e } { f } g ' { x } ' -y2i} a { b } { c } { { x } } { e } { f } g ' { x } ' -y2iB a { b } { c } { { x } } { e } { f } g ' { x } ' -y2a{ a { b } { c } { { x } } { e } { f } g '{ { x } }' -y2a} a { b } { c } { { x } } { e } { f } g '{ { x } }' -y2aB a { b } { c } { { x } } { e } { f } g '{ { x } }' -y2A{ a { b } { c } { { x } } { e } { f } g '{ { x } } ' -y2A} a { b } { c } { { x } } { e } { f } g '{ { x } } ' -y2AB a { b } { c } { { x } } { e } { f } g '{ { x } } ' -y2In{ a { b } { c } { { x } } { e } { f } g 'f' -y2In} a { b } { c } { { x } } { e } { f } g 'f' -y2InB a { b } { c } { { x } } { e } { f } g 'f' -y2in{ a { b } { c } { { x } } { e } { f } g ' f ' -y2in} a { b } { c } { { x } } { e } { f } g ' f ' -y2inB a { b } { c } { { x } } { e } { f } g ' f ' -y2an{ a { b } { c } { { x } } { e } { f } g '{ f }' -y2an} a { b } { c } { { x } } { e } { f } g '{ f }' -y2anB a { b } { c } { { x } } { e } { f } g '{ f }' -y2An{ a { b } { c } { { x } } { e } { f } g '{ f } ' -y2An} a { b } { c } { { x } } { e } { f } g '{ f } ' -y2AnB a { b } { c } { { x } } { e } { f } g '{ f } ' -vIl{ a { b } { _ } { { x } } { e } { f } g -vIl} a { b } { _ } { { x } } { e } { f } g -vIlB a { b } { _ } { { x } } { e } { f } g -vil{ a { b } {___} { { x } } { e } { f } g -vil} a { b } {___} { { x } } { e } { f } g -vilB a { b } {___} { { x } } { e } { f } g -val{ a { b } _____ { { x } } { e } { f } g -val} a { b } _____ { { x } } { e } { f } g -valB a { b } _____ { { x } } { e } { f } g -vAl{ a { b } ______{ { x } } { e } { f } g -vAl} a { b } ______{ { x } } { e } { f } g -vAlB a { b } ______{ { x } } { e } { f } g -vI{ a { b } { c } { { _ } } { e } { f } g -vI} a { b } { c } { { _ } } { e } { f } g -vIB a { b } { c } { { _ } } { e } { f } g -vi{ a { b } { c } { {___} } { e } { f } g -vi} a { b } { c } { {___} } { e } { f } g -viB a { b } { c } { {___} } { e } { f } g -va{ a { b } { c } { _____ } { e } { f } g -va} a { b } { c } { _____ } { e } { f } g -vaB a { b } { c } { _____ } { e } { f } g -vA{ a { b } { c } { ______} { e } { f } g -vA} a { b } { c } { ______} { e } { f } g -vAB a { b } { c } { ______} { e } { f } g -vIn{ a { b } { c } { { x } } { _ } { f } g -vIn} a { b } { c } { { x } } { _ } { f } g -vInB a { b } { c } { { x } } { _ } { f } g -vin{ a { b } { c } { { x } } {___} { f } g -vin} a { b } { c } { { x } } {___} { f } g -vinB a { b } { c } { { x } } {___} { f } g -van{ a { b } { c } { { x } } _____ { f } g -van} a { b } { c } { { x } } _____ { f } g -vanB a { b } { c } { { x } } _____ { f } g -vAn{ a { b } { c } { { x } } ______{ f } g -vAn} a { b } { c } { { x } } ______{ f } g -vAnB a { b } { c } { { x } } ______{ f } g -v1Il{ a { b } { _ } { { x } } { e } { f } g -v1Il} a { b } { _ } { { x } } { e } { f } g -v1IlB a { b } { _ } { { x } } { e } { f } g -v1il{ a { b } {___} { { x } } { e } { f } g -v1il} a { b } {___} { { x } } { e } { f } g -v1ilB a { b } {___} { { x } } { e } { f } g -v1al{ a { b } _____ { { x } } { e } { f } g -v1al} a { b } _____ { { x } } { e } { f } g -v1alB a { b } _____ { { x } } { e } { f } g -v1Al{ a { b } ______{ { x } } { e } { f } g -v1Al} a { b } ______{ { x } } { e } { f } g -v1AlB a { b } ______{ { x } } { e } { f } g -v1I{ a { b } { c } { { _ } } { e } { f } g -v1I} a { b } { c } { { _ } } { e } { f } g -v1IB a { b } { c } { { _ } } { e } { f } g -v1i{ a { b } { c } { {___} } { e } { f } g -v1i} a { b } { c } { {___} } { e } { f } g -v1iB a { b } { c } { {___} } { e } { f } g -v1a{ a { b } { c } { _____ } { e } { f } g -v1a} a { b } { c } { _____ } { e } { f } g -v1aB a { b } { c } { _____ } { e } { f } g -v1A{ a { b } { c } { ______} { e } { f } g -v1A} a { b } { c } { ______} { e } { f } g -v1AB a { b } { c } { ______} { e } { f } g -v1In{ a { b } { c } { { x } } { _ } { f } g -v1In} a { b } { c } { { x } } { _ } { f } g -v1InB a { b } { c } { { x } } { _ } { f } g -v1in{ a { b } { c } { { x } } {___} { f } g -v1in} a { b } { c } { { x } } {___} { f } g -v1inB a { b } { c } { { x } } {___} { f } g -v1an{ a { b } { c } { { x } } _____ { f } g -v1an} a { b } { c } { { x } } _____ { f } g -v1anB a { b } { c } { { x } } _____ { f } g -v1An{ a { b } { c } { { x } } ______{ f } g -v1An} a { b } { c } { { x } } ______{ f } g -v1AnB a { b } { c } { { x } } ______{ f } g -v2Il{ a { _ } { c } { { x } } { e } { f } g -v2Il} a { _ } { c } { { x } } { e } { f } g -v2IlB a { _ } { c } { { x } } { e } { f } g -v2il{ a {___} { c } { { x } } { e } { f } g -v2il} a {___} { c } { { x } } { e } { f } g -v2ilB a {___} { c } { { x } } { e } { f } g -v2al{ a _____ { c } { { x } } { e } { f } g -v2al} a _____ { c } { { x } } { e } { f } g -v2alB a _____ { c } { { x } } { e } { f } g -v2Al{ a ______{ c } { { x } } { e } { f } g -v2Al} a ______{ c } { { x } } { e } { f } g -v2AlB a ______{ c } { { x } } { e } { f } g -v2I{ a { b } { c } { _____ } { e } { f } g -v2I} a { b } { c } { _____ } { e } { f } g -v2IB a { b } { c } { _____ } { e } { f } g -v2i{ a { b } { c } {_______} { e } { f } g -v2i} a { b } { c } {_______} { e } { f } g -v2iB a { b } { c } {_______} { e } { f } g -v2a{ a { b } { c } _________ { e } { f } g -v2a} a { b } { c } _________ { e } { f } g -v2aB a { b } { c } _________ { e } { f } g -v2A{ a { b } { c } __________{ e } { f } g -v2A} a { b } { c } __________{ e } { f } g -v2AB a { b } { c } __________{ e } { f } g -v2In{ a { b } { c } { { x } } { e } { _ } g -v2In} a { b } { c } { { x } } { e } { _ } g -v2InB a { b } { c } { { x } } { e } { _ } g -v2in{ a { b } { c } { { x } } { e } {___} g -v2in} a { b } { c } { { x } } { e } {___} g -v2inB a { b } { c } { { x } } { e } {___} g -v2an{ a { b } { c } { { x } } { e } _____ g -v2an} a { b } { c } { { x } } { e } _____ g -v2anB a { b } { c } { { x } } { e } _____ g -v2An{ a { b } { c } { { x } } { e } ______g -v2An} a { b } { c } { { x } } { e } ______g -v2AnB a { b } { c } { { x } } { e } ______g -a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g -cIl[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -cIl] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -cil[ a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -cil] a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -cal[ a [ b ] _ [ [ x ] ] [ e ] [ f ] g -cal] a [ b ] _ [ [ x ] ] [ e ] [ f ] g -cAl[ a [ b ] _[ [ x ] ] [ e ] [ f ] g -cAl] a [ b ] _[ [ x ] ] [ e ] [ f ] g -cI[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -cI] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -ci[ a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -ci] a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -ca[ a [ b ] [ c ] [ _ ] [ e ] [ f ] g -ca] a [ b ] [ c ] [ _ ] [ e ] [ f ] g -cA[ a [ b ] [ c ] [ _] [ e ] [ f ] g -cA] a [ b ] [ c ] [ _] [ e ] [ f ] g -cIn[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -cIn] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -cin[ a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -cin] a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -can[ a [ b ] [ c ] [ [ x ] ] _ [ f ] g -can] a [ b ] [ c ] [ [ x ] ] _ [ f ] g -cAn[ a [ b ] [ c ] [ [ x ] ] _[ f ] g -cAn] a [ b ] [ c ] [ [ x ] ] _[ f ] g -c1Il[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -c1Il] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -c1il[ a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -c1il] a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -c1al[ a [ b ] _ [ [ x ] ] [ e ] [ f ] g -c1al] a [ b ] _ [ [ x ] ] [ e ] [ f ] g -c1Al[ a [ b ] _[ [ x ] ] [ e ] [ f ] g -c1Al] a [ b ] _[ [ x ] ] [ e ] [ f ] g -c1I[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -c1I] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -c1i[ a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -c1i] a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -c1a[ a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c1a] a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c1A[ a [ b ] [ c ] [ _] [ e ] [ f ] g -c1A] a [ b ] [ c ] [ _] [ e ] [ f ] g -c1In[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -c1In] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -c1in[ a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -c1in] a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -c1an[ a [ b ] [ c ] [ [ x ] ] _ [ f ] g -c1an] a [ b ] [ c ] [ [ x ] ] _ [ f ] g -c1An[ a [ b ] [ c ] [ [ x ] ] _[ f ] g -c1An] a [ b ] [ c ] [ [ x ] ] _[ f ] g -c2Il[ a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -c2Il] a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -c2il[ a [_] [ c ] [ [ x ] ] [ e ] [ f ] g -c2il] a [_] [ c ] [ [ x ] ] [ e ] [ f ] g -c2al[ a _ [ c ] [ [ x ] ] [ e ] [ f ] g -c2al] a _ [ c ] [ [ x ] ] [ e ] [ f ] g -c2Al[ a _[ c ] [ [ x ] ] [ e ] [ f ] g -c2Al] a _[ c ] [ [ x ] ] [ e ] [ f ] g -c2I[ a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c2I] a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c2i[ a [ b ] [ c ] [_] [ e ] [ f ] g -c2i] a [ b ] [ c ] [_] [ e ] [ f ] g -c2a[ a [ b ] [ c ] _ [ e ] [ f ] g -c2a] a [ b ] [ c ] _ [ e ] [ f ] g -c2A[ a [ b ] [ c ] _[ e ] [ f ] g -c2A] a [ b ] [ c ] _[ e ] [ f ] g -c2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -c2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -c2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [_] g -c2in] a [ b ] [ c ] [ [ x ] ] [ e ] [_] g -c2an[ a [ b ] [ c ] [ [ x ] ] [ e ] _ g -c2an] a [ b ] [ c ] [ [ x ] ] [ e ] _ g -c2An[ a [ b ] [ c ] [ [ x ] ] [ e ] _g -c2An] a [ b ] [ c ] [ [ x ] ] [ e ] _g -dIl[ a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -dIl] a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -dil[ a [ b ] [] [ [ x ] ] [ e ] [ f ] g -dil] a [ b ] [] [ [ x ] ] [ e ] [ f ] g -dal[ a [ b ] [ [ x ] ] [ e ] [ f ] g -dal] a [ b ] [ [ x ] ] [ e ] [ f ] g -dAl[ a [ b ] [ [ x ] ] [ e ] [ f ] g -dAl] a [ b ] [ [ x ] ] [ e ] [ f ] g -dI[ a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -dI] a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -di[ a [ b ] [ c ] [ [] ] [ e ] [ f ] g -di] a [ b ] [ c ] [ [] ] [ e ] [ f ] g -da[ a [ b ] [ c ] [ ] [ e ] [ f ] g -da] a [ b ] [ c ] [ ] [ e ] [ f ] g -dA[ a [ b ] [ c ] [ ] [ e ] [ f ] g -dA] a [ b ] [ c ] [ ] [ e ] [ f ] g -dIn[ a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -dIn] a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -din[ a [ b ] [ c ] [ [ x ] ] [] [ f ] g -din] a [ b ] [ c ] [ [ x ] ] [] [ f ] g -dan[ a [ b ] [ c ] [ [ x ] ] [ f ] g -dan] a [ b ] [ c ] [ [ x ] ] [ f ] g -dAn[ a [ b ] [ c ] [ [ x ] ] [ f ] g -dAn] a [ b ] [ c ] [ [ x ] ] [ f ] g -d1Il[ a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -d1Il] a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -d1il[ a [ b ] [] [ [ x ] ] [ e ] [ f ] g -d1il] a [ b ] [] [ [ x ] ] [ e ] [ f ] g -d1al[ a [ b ] [ [ x ] ] [ e ] [ f ] g -d1al] a [ b ] [ [ x ] ] [ e ] [ f ] g -d1Al[ a [ b ] [ [ x ] ] [ e ] [ f ] g -d1Al] a [ b ] [ [ x ] ] [ e ] [ f ] g -d1I[ a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -d1I] a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -d1i[ a [ b ] [ c ] [ [] ] [ e ] [ f ] g -d1i] a [ b ] [ c ] [ [] ] [ e ] [ f ] g -d1a[ a [ b ] [ c ] [ ] [ e ] [ f ] g -d1a] a [ b ] [ c ] [ ] [ e ] [ f ] g -d1A[ a [ b ] [ c ] [ ] [ e ] [ f ] g -d1A] a [ b ] [ c ] [ ] [ e ] [ f ] g -d1In[ a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -d1In] a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -d1in[ a [ b ] [ c ] [ [ x ] ] [] [ f ] g -d1in] a [ b ] [ c ] [ [ x ] ] [] [ f ] g -d1an[ a [ b ] [ c ] [ [ x ] ] [ f ] g -d1an] a [ b ] [ c ] [ [ x ] ] [ f ] g -d1An[ a [ b ] [ c ] [ [ x ] ] [ f ] g -d1An] a [ b ] [ c ] [ [ x ] ] [ f ] g -d2Il[ a [ ] [ c ] [ [ x ] ] [ e ] [ f ] g -d2Il] a [ ] [ c ] [ [ x ] ] [ e ] [ f ] g -d2il[ a [] [ c ] [ [ x ] ] [ e ] [ f ] g -d2il] a [] [ c ] [ [ x ] ] [ e ] [ f ] g -d2al[ a [ c ] [ [ x ] ] [ e ] [ f ] g -d2al] a [ c ] [ [ x ] ] [ e ] [ f ] g -d2Al[ a [ c ] [ [ x ] ] [ e ] [ f ] g -d2Al] a [ c ] [ [ x ] ] [ e ] [ f ] g -d2I[ a [ b ] [ c ] [ ] [ e ] [ f ] g -d2I] a [ b ] [ c ] [ ] [ e ] [ f ] g -d2i[ a [ b ] [ c ] [] [ e ] [ f ] g -d2i] a [ b ] [ c ] [] [ e ] [ f ] g -d2a[ a [ b ] [ c ] [ e ] [ f ] g -d2a] a [ b ] [ c ] [ e ] [ f ] g -d2A[ a [ b ] [ c ] [ e ] [ f ] g -d2A] a [ b ] [ c ] [ e ] [ f ] g -d2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ ] g -d2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ ] g -d2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [] g -d2in] a [ b ] [ c ] [ [ x ] ] [ e ] [] g -d2an[ a [ b ] [ c ] [ [ x ] ] [ e ] g -d2an] a [ b ] [ c ] [ [ x ] ] [ e ] g -d2An[ a [ b ] [ c ] [ [ x ] ] [ e ] g -d2An] a [ b ] [ c ] [ [ x ] ] [ e ] g -yIl[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -yIl] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -yil[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -yil] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -yal[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -yal] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -yAl[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -yAl] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -yI[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -yI] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -yi[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -yi] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -ya[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -ya] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -yA[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -yA] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -yIn[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -yIn] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -yin[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -yin] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -yan[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -yan] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -yAn[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -yAn] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -y1Il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -y1Il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -y1il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -y1il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -y1al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -y1al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -y1Al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -y1Al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -y1I[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -y1I] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -y1i[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -y1i] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -y1a[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y1a] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y1A[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -y1A] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -y1In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -y1In] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -y1in[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -y1in] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -y1an[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -y1an] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -y1An[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -y1An] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -y2Il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'b' -y2Il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'b' -y2il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' b ' -y2il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' b ' -y2al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ]' -y2al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ]' -y2Al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ] ' -y2Al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ] ' -y2I[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y2I] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y2i[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' [ x ] ' -y2i] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' [ x ] ' -y2a[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ]' -y2a] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ]' -y2A[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ] ' -y2A] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ] ' -y2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'f' -y2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'f' -y2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' f ' -y2in] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' f ' -y2an[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ]' -y2an] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ]' -y2An[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ] ' -y2An] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ] ' -vIl[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -vIl] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -vil[ a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -vil] a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -val[ a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -val] a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -vAl[ a [ b ] ______[ [ x ] ] [ e ] [ f ] g -vAl] a [ b ] ______[ [ x ] ] [ e ] [ f ] g -vI[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -vI] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -vi[ a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -vi] a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -va[ a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -va] a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -vA[ a [ b ] [ c ] [ ______] [ e ] [ f ] g -vA] a [ b ] [ c ] [ ______] [ e ] [ f ] g -vIn[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -vIn] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -vin[ a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -vin] a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -van[ a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -van] a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -vAn[ a [ b ] [ c ] [ [ x ] ] ______[ f ] g -vAn] a [ b ] [ c ] [ [ x ] ] ______[ f ] g -v1Il[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -v1Il] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -v1il[ a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -v1il] a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -v1al[ a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -v1al] a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -v1Al[ a [ b ] ______[ [ x ] ] [ e ] [ f ] g -v1Al] a [ b ] ______[ [ x ] ] [ e ] [ f ] g -v1I[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -v1I] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -v1i[ a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -v1i] a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -v1a[ a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v1a] a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v1A[ a [ b ] [ c ] [ ______] [ e ] [ f ] g -v1A] a [ b ] [ c ] [ ______] [ e ] [ f ] g -v1In[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -v1In] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -v1in[ a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -v1in] a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -v1an[ a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -v1an] a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -v1An[ a [ b ] [ c ] [ [ x ] ] ______[ f ] g -v1An] a [ b ] [ c ] [ [ x ] ] ______[ f ] g -v2Il[ a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -v2Il] a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -v2il[ a [___] [ c ] [ [ x ] ] [ e ] [ f ] g -v2il] a [___] [ c ] [ [ x ] ] [ e ] [ f ] g -v2al[ a _____ [ c ] [ [ x ] ] [ e ] [ f ] g -v2al] a _____ [ c ] [ [ x ] ] [ e ] [ f ] g -v2Al[ a ______[ c ] [ [ x ] ] [ e ] [ f ] g -v2Al] a ______[ c ] [ [ x ] ] [ e ] [ f ] g -v2I[ a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v2I] a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v2i[ a [ b ] [ c ] [_______] [ e ] [ f ] g -v2i] a [ b ] [ c ] [_______] [ e ] [ f ] g -v2a[ a [ b ] [ c ] _________ [ e ] [ f ] g -v2a] a [ b ] [ c ] _________ [ e ] [ f ] g -v2A[ a [ b ] [ c ] __________[ e ] [ f ] g -v2A] a [ b ] [ c ] __________[ e ] [ f ] g -v2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -v2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -v2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [___] g -v2in] a [ b ] [ c ] [ [ x ] ] [ e ] [___] g -v2an[ a [ b ] [ c ] [ [ x ] ] [ e ] _____ g -v2an] a [ b ] [ c ] [ [ x ] ] [ e ] _____ g -v2An[ a [ b ] [ c ] [ [ x ] ] [ e ] ______g -v2An] a [ b ] [ c ] [ [ x ] ] [ e ] ______g -a < b > < c > < < x > > < e > < f > g -cIl< a < b > < _ > < < x > > < e > < f > g -cIl> a < b > < _ > < < x > > < e > < f > g -cil< a < b > <_> < < x > > < e > < f > g -cil> a < b > <_> < < x > > < e > < f > g -cal< a < b > _ < < x > > < e > < f > g -cal> a < b > _ < < x > > < e > < f > g -cAl< a < b > _< < x > > < e > < f > g -cAl> a < b > _< < x > > < e > < f > g -cI< a < b > < c > < < _ > > < e > < f > g -cI> a < b > < c > < < _ > > < e > < f > g -ci< a < b > < c > < <_> > < e > < f > g -ci> a < b > < c > < <_> > < e > < f > g -ca< a < b > < c > < _ > < e > < f > g -ca> a < b > < c > < _ > < e > < f > g -cA< a < b > < c > < _> < e > < f > g -cA> a < b > < c > < _> < e > < f > g -cIn< a < b > < c > < < x > > < _ > < f > g -cIn> a < b > < c > < < x > > < _ > < f > g -cin< a < b > < c > < < x > > <_> < f > g -cin> a < b > < c > < < x > > <_> < f > g -can< a < b > < c > < < x > > _ < f > g -can> a < b > < c > < < x > > _ < f > g -cAn< a < b > < c > < < x > > _< f > g -cAn> a < b > < c > < < x > > _< f > g -c1Il< a < b > < _ > < < x > > < e > < f > g -c1Il> a < b > < _ > < < x > > < e > < f > g -c1il< a < b > <_> < < x > > < e > < f > g -c1il> a < b > <_> < < x > > < e > < f > g -c1al< a < b > _ < < x > > < e > < f > g -c1al> a < b > _ < < x > > < e > < f > g -c1Al< a < b > _< < x > > < e > < f > g -c1Al> a < b > _< < x > > < e > < f > g -c1I< a < b > < c > < < _ > > < e > < f > g -c1I> a < b > < c > < < _ > > < e > < f > g -c1i< a < b > < c > < <_> > < e > < f > g -c1i> a < b > < c > < <_> > < e > < f > g -c1a< a < b > < c > < _ > < e > < f > g -c1a> a < b > < c > < _ > < e > < f > g -c1A< a < b > < c > < _> < e > < f > g -c1A> a < b > < c > < _> < e > < f > g -c1In< a < b > < c > < < x > > < _ > < f > g -c1In> a < b > < c > < < x > > < _ > < f > g -c1in< a < b > < c > < < x > > <_> < f > g -c1in> a < b > < c > < < x > > <_> < f > g -c1an< a < b > < c > < < x > > _ < f > g -c1an> a < b > < c > < < x > > _ < f > g -c1An< a < b > < c > < < x > > _< f > g -c1An> a < b > < c > < < x > > _< f > g -c2Il< a < _ > < c > < < x > > < e > < f > g -c2Il> a < _ > < c > < < x > > < e > < f > g -c2il< a <_> < c > < < x > > < e > < f > g -c2il> a <_> < c > < < x > > < e > < f > g -c2al< a _ < c > < < x > > < e > < f > g -c2al> a _ < c > < < x > > < e > < f > g -c2Al< a _< c > < < x > > < e > < f > g -c2Al> a _< c > < < x > > < e > < f > g -c2I< a < b > < c > < _ > < e > < f > g -c2I> a < b > < c > < _ > < e > < f > g -c2i< a < b > < c > <_> < e > < f > g -c2i> a < b > < c > <_> < e > < f > g -c2a< a < b > < c > _ < e > < f > g -c2a> a < b > < c > _ < e > < f > g -c2A< a < b > < c > _< e > < f > g -c2A> a < b > < c > _< e > < f > g -c2In< a < b > < c > < < x > > < e > < _ > g -c2In> a < b > < c > < < x > > < e > < _ > g -c2in< a < b > < c > < < x > > < e > <_> g -c2in> a < b > < c > < < x > > < e > <_> g -c2an< a < b > < c > < < x > > < e > _ g -c2an> a < b > < c > < < x > > < e > _ g -c2An< a < b > < c > < < x > > < e > _g -c2An> a < b > < c > < < x > > < e > _g -dIl< a < b > < > < < x > > < e > < f > g -dIl> a < b > < > < < x > > < e > < f > g -dil< a < b > <> < < x > > < e > < f > g -dil> a < b > <> < < x > > < e > < f > g -dal< a < b > < < x > > < e > < f > g -dal> a < b > < < x > > < e > < f > g -dAl< a < b > < < x > > < e > < f > g -dAl> a < b > < < x > > < e > < f > g -dI< a < b > < c > < < > > < e > < f > g -dI> a < b > < c > < < > > < e > < f > g -di< a < b > < c > < <> > < e > < f > g -di> a < b > < c > < <> > < e > < f > g -da< a < b > < c > < > < e > < f > g -da> a < b > < c > < > < e > < f > g -dA< a < b > < c > < > < e > < f > g -dA> a < b > < c > < > < e > < f > g -dIn< a < b > < c > < < x > > < > < f > g -dIn> a < b > < c > < < x > > < > < f > g -din< a < b > < c > < < x > > <> < f > g -din> a < b > < c > < < x > > <> < f > g -dan< a < b > < c > < < x > > < f > g -dan> a < b > < c > < < x > > < f > g -dAn< a < b > < c > < < x > > < f > g -dAn> a < b > < c > < < x > > < f > g -d1Il< a < b > < > < < x > > < e > < f > g -d1Il> a < b > < > < < x > > < e > < f > g -d1il< a < b > <> < < x > > < e > < f > g -d1il> a < b > <> < < x > > < e > < f > g -d1al< a < b > < < x > > < e > < f > g -d1al> a < b > < < x > > < e > < f > g -d1Al< a < b > < < x > > < e > < f > g -d1Al> a < b > < < x > > < e > < f > g -d1I< a < b > < c > < < > > < e > < f > g -d1I> a < b > < c > < < > > < e > < f > g -d1i< a < b > < c > < <> > < e > < f > g -d1i> a < b > < c > < <> > < e > < f > g -d1a< a < b > < c > < > < e > < f > g -d1a> a < b > < c > < > < e > < f > g -d1A< a < b > < c > < > < e > < f > g -d1A> a < b > < c > < > < e > < f > g -d1In< a < b > < c > < < x > > < > < f > g -d1In> a < b > < c > < < x > > < > < f > g -d1in< a < b > < c > < < x > > <> < f > g -d1in> a < b > < c > < < x > > <> < f > g -d1an< a < b > < c > < < x > > < f > g -d1an> a < b > < c > < < x > > < f > g -d1An< a < b > < c > < < x > > < f > g -d1An> a < b > < c > < < x > > < f > g -d2Il< a < > < c > < < x > > < e > < f > g -d2Il> a < > < c > < < x > > < e > < f > g -d2il< a <> < c > < < x > > < e > < f > g -d2il> a <> < c > < < x > > < e > < f > g -d2al< a < c > < < x > > < e > < f > g -d2al> a < c > < < x > > < e > < f > g -d2Al< a < c > < < x > > < e > < f > g -d2Al> a < c > < < x > > < e > < f > g -d2I< a < b > < c > < > < e > < f > g -d2I> a < b > < c > < > < e > < f > g -d2i< a < b > < c > <> < e > < f > g -d2i> a < b > < c > <> < e > < f > g -d2a< a < b > < c > < e > < f > g -d2a> a < b > < c > < e > < f > g -d2A< a < b > < c > < e > < f > g -d2A> a < b > < c > < e > < f > g -d2In< a < b > < c > < < x > > < e > < > g -d2In> a < b > < c > < < x > > < e > < > g -d2in< a < b > < c > < < x > > < e > <> g -d2in> a < b > < c > < < x > > < e > <> g -d2an< a < b > < c > < < x > > < e > g -d2an> a < b > < c > < < x > > < e > g -d2An< a < b > < c > < < x > > < e > g -d2An> a < b > < c > < < x > > < e > g -yIl< a < b > < c > < < x > > < e > < f > g 'c' -yIl> a < b > < c > < < x > > < e > < f > g 'c' -yil< a < b > < c > < < x > > < e > < f > g ' c ' -yil> a < b > < c > < < x > > < e > < f > g ' c ' -yal< a < b > < c > < < x > > < e > < f > g '< c >' -yal> a < b > < c > < < x > > < e > < f > g '< c >' -yAl< a < b > < c > < < x > > < e > < f > g '< c > ' -yAl> a < b > < c > < < x > > < e > < f > g '< c > ' -yI< a < b > < c > < < x > > < e > < f > g 'x' -yI> a < b > < c > < < x > > < e > < f > g 'x' -yi< a < b > < c > < < x > > < e > < f > g ' x ' -yi> a < b > < c > < < x > > < e > < f > g ' x ' -ya< a < b > < c > < < x > > < e > < f > g '< x >' -ya> a < b > < c > < < x > > < e > < f > g '< x >' -yA< a < b > < c > < < x > > < e > < f > g '< x > ' -yA> a < b > < c > < < x > > < e > < f > g '< x > ' -yIn< a < b > < c > < < x > > < e > < f > g 'e' -yIn> a < b > < c > < < x > > < e > < f > g 'e' -yin< a < b > < c > < < x > > < e > < f > g ' e ' -yin> a < b > < c > < < x > > < e > < f > g ' e ' -yan< a < b > < c > < < x > > < e > < f > g '< e >' -yan> a < b > < c > < < x > > < e > < f > g '< e >' -yAn< a < b > < c > < < x > > < e > < f > g '< e > ' -yAn> a < b > < c > < < x > > < e > < f > g '< e > ' -y1Il< a < b > < c > < < x > > < e > < f > g 'c' -y1Il> a < b > < c > < < x > > < e > < f > g 'c' -y1il< a < b > < c > < < x > > < e > < f > g ' c ' -y1il> a < b > < c > < < x > > < e > < f > g ' c ' -y1al< a < b > < c > < < x > > < e > < f > g '< c >' -y1al> a < b > < c > < < x > > < e > < f > g '< c >' -y1Al< a < b > < c > < < x > > < e > < f > g '< c > ' -y1Al> a < b > < c > < < x > > < e > < f > g '< c > ' -y1I< a < b > < c > < < x > > < e > < f > g 'x' -y1I> a < b > < c > < < x > > < e > < f > g 'x' -y1i< a < b > < c > < < x > > < e > < f > g ' x ' -y1i> a < b > < c > < < x > > < e > < f > g ' x ' -y1a< a < b > < c > < < x > > < e > < f > g '< x >' -y1a> a < b > < c > < < x > > < e > < f > g '< x >' -y1A< a < b > < c > < < x > > < e > < f > g '< x > ' -y1A> a < b > < c > < < x > > < e > < f > g '< x > ' -y1In< a < b > < c > < < x > > < e > < f > g 'e' -y1In> a < b > < c > < < x > > < e > < f > g 'e' -y1in< a < b > < c > < < x > > < e > < f > g ' e ' -y1in> a < b > < c > < < x > > < e > < f > g ' e ' -y1an< a < b > < c > < < x > > < e > < f > g '< e >' -y1an> a < b > < c > < < x > > < e > < f > g '< e >' -y1An< a < b > < c > < < x > > < e > < f > g '< e > ' -y1An> a < b > < c > < < x > > < e > < f > g '< e > ' -y2Il< a < b > < c > < < x > > < e > < f > g 'b' -y2Il> a < b > < c > < < x > > < e > < f > g 'b' -y2il< a < b > < c > < < x > > < e > < f > g ' b ' -y2il> a < b > < c > < < x > > < e > < f > g ' b ' -y2al< a < b > < c > < < x > > < e > < f > g '< b >' -y2al> a < b > < c > < < x > > < e > < f > g '< b >' -y2Al< a < b > < c > < < x > > < e > < f > g '< b > ' -y2Al> a < b > < c > < < x > > < e > < f > g '< b > ' -y2I< a < b > < c > < < x > > < e > < f > g '< x >' -y2I> a < b > < c > < < x > > < e > < f > g '< x >' -y2i< a < b > < c > < < x > > < e > < f > g ' < x > ' -y2i> a < b > < c > < < x > > < e > < f > g ' < x > ' -y2a< a < b > < c > < < x > > < e > < f > g '< < x > >' -y2a> a < b > < c > < < x > > < e > < f > g '< < x > >' -y2A< a < b > < c > < < x > > < e > < f > g '< < x > > ' -y2A> a < b > < c > < < x > > < e > < f > g '< < x > > ' -y2In< a < b > < c > < < x > > < e > < f > g 'f' -y2In> a < b > < c > < < x > > < e > < f > g 'f' -y2in< a < b > < c > < < x > > < e > < f > g ' f ' -y2in> a < b > < c > < < x > > < e > < f > g ' f ' -y2an< a < b > < c > < < x > > < e > < f > g '< f >' -y2an> a < b > < c > < < x > > < e > < f > g '< f >' -y2An< a < b > < c > < < x > > < e > < f > g '< f > ' -y2An> a < b > < c > < < x > > < e > < f > g '< f > ' -vIl< a < b > < _ > < < x > > < e > < f > g -vIl> a < b > < _ > < < x > > < e > < f > g -vil< a < b > <___> < < x > > < e > < f > g -vil> a < b > <___> < < x > > < e > < f > g -val< a < b > _____ < < x > > < e > < f > g -val> a < b > _____ < < x > > < e > < f > g -vAl< a < b > ______< < x > > < e > < f > g -vAl> a < b > ______< < x > > < e > < f > g -vI< a < b > < c > < < _ > > < e > < f > g -vI> a < b > < c > < < _ > > < e > < f > g -vi< a < b > < c > < <___> > < e > < f > g -vi> a < b > < c > < <___> > < e > < f > g -va< a < b > < c > < _____ > < e > < f > g -va> a < b > < c > < _____ > < e > < f > g -vA< a < b > < c > < ______> < e > < f > g -vA> a < b > < c > < ______> < e > < f > g -vIn< a < b > < c > < < x > > < _ > < f > g -vIn> a < b > < c > < < x > > < _ > < f > g -vin< a < b > < c > < < x > > <___> < f > g -vin> a < b > < c > < < x > > <___> < f > g -van< a < b > < c > < < x > > _____ < f > g -van> a < b > < c > < < x > > _____ < f > g -vAn< a < b > < c > < < x > > ______< f > g -vAn> a < b > < c > < < x > > ______< f > g -v1Il< a < b > < _ > < < x > > < e > < f > g -v1Il> a < b > < _ > < < x > > < e > < f > g -v1il< a < b > <___> < < x > > < e > < f > g -v1il> a < b > <___> < < x > > < e > < f > g -v1al< a < b > _____ < < x > > < e > < f > g -v1al> a < b > _____ < < x > > < e > < f > g -v1Al< a < b > ______< < x > > < e > < f > g -v1Al> a < b > ______< < x > > < e > < f > g -v1I< a < b > < c > < < _ > > < e > < f > g -v1I> a < b > < c > < < _ > > < e > < f > g -v1i< a < b > < c > < <___> > < e > < f > g -v1i> a < b > < c > < <___> > < e > < f > g -v1a< a < b > < c > < _____ > < e > < f > g -v1a> a < b > < c > < _____ > < e > < f > g -v1A< a < b > < c > < ______> < e > < f > g -v1A> a < b > < c > < ______> < e > < f > g -v1In< a < b > < c > < < x > > < _ > < f > g -v1In> a < b > < c > < < x > > < _ > < f > g -v1in< a < b > < c > < < x > > <___> < f > g -v1in> a < b > < c > < < x > > <___> < f > g -v1an< a < b > < c > < < x > > _____ < f > g -v1an> a < b > < c > < < x > > _____ < f > g -v1An< a < b > < c > < < x > > ______< f > g -v1An> a < b > < c > < < x > > ______< f > g -v2Il< a < _ > < c > < < x > > < e > < f > g -v2Il> a < _ > < c > < < x > > < e > < f > g -v2il< a <___> < c > < < x > > < e > < f > g -v2il> a <___> < c > < < x > > < e > < f > g -v2al< a _____ < c > < < x > > < e > < f > g -v2al> a _____ < c > < < x > > < e > < f > g -v2Al< a ______< c > < < x > > < e > < f > g -v2Al> a ______< c > < < x > > < e > < f > g -v2I< a < b > < c > < _____ > < e > < f > g -v2I> a < b > < c > < _____ > < e > < f > g -v2i< a < b > < c > <_______> < e > < f > g -v2i> a < b > < c > <_______> < e > < f > g -v2a< a < b > < c > _________ < e > < f > g -v2a> a < b > < c > _________ < e > < f > g -v2A< a < b > < c > __________< e > < f > g -v2A> a < b > < c > __________< e > < f > g -v2In< a < b > < c > < < x > > < e > < _ > g -v2In> a < b > < c > < < x > > < e > < _ > g -v2in< a < b > < c > < < x > > < e > <___> g -v2in> a < b > < c > < < x > > < e > <___> g -v2an< a < b > < c > < < x > > < e > _____ g -v2an> a < b > < c > < < x > > < e > _____ g -v2An< a < b > < c > < < x > > < e > ______g -v2An> a < b > < c > < < x > > < e > ______g -a b c x e f g -cIlt a b _ x e f g -cilt a b _ x e f g -calt a b _ x e f g -cAlt a b _ x e f g -cIt a b c _ e f g -cit a b c _ e f g -cat a b c _ e f g -cAt a b c _ e f g -cInt a b c x _ f g -cint a b c x _ f g -cant a b c x _ f g -cAnt a b c x _ f g -c1Ilt a b _ x e f g -c1ilt a b _ x e f g -c1alt a b _ x e f g -c1Alt a b _ x e f g -c1It a b c _ e f g -c1it a b c _ e f g -c1at a b c _ e f g -c1At a b c _ e f g -c1Int a b c x _ f g -c1int a b c x _ f g -c1ant a b c x _ f g -c1Ant a b c x _ f g -c2Ilt a _ c x e f g -c2ilt a _ c x e f g -c2alt a _ c x e f g -c2Alt a _ c x e f g -c2It a b c _ e f g -c2it a b c _ e f g -c2at a b c _ e f g -c2At a b c _ e f g -c2Int a b c x e _ g -c2int a b c x e _ g -c2ant a b c x e _ g -c2Ant a b c x e _g -dIlt a b x e f g -dilt a b x e f g -dalt a b x e f g -dAlt a b x e f g -dIt a b c e f g -dit a b c e f g -dat a b c e f g -dAt a b c e f g -dInt a b c x f g -dint a b c x f g -dant a b c x f g -dAnt a b c x f g -d1Ilt a b x e f g -d1ilt a b x e f g -d1alt a b x e f g -d1Alt a b x e f g -d1It a b c e f g -d1it a b c e f g -d1at a b c e f g -d1At a b c e f g -d1Int a b c x f g -d1int a b c x f g -d1ant a b c x f g -d1Ant a b c x f g -d2Ilt a c x e f g -d2ilt a c x e f g -d2alt a c x e f g -d2Alt a c x e f g -d2It a b c e f g -d2it a b c e f g -d2at a b c e f g -d2At a b c e f g -d2Int a b c x e g -d2int a b c x e g -d2ant a b c x e g -d2Ant a b c x e g -yIlt a b c x e f g 'c' -yilt a b c x e f g ' c ' -yalt a b c x e f g ' c ' -yAlt a b c x e f g ' c ' -yIt a b c x e f g 'x' -yit a b c x e f g ' x ' -yat a b c x e f g ' x ' -yAt a b c x e f g ' x ' -yInt a b c x e f g 'e' -yint a b c x e f g ' e ' -yant a b c x e f g ' e ' -yAnt a b c x e f g ' e ' -y1Ilt a b c x e f g 'c' -y1ilt a b c x e f g ' c ' -y1alt a b c x e f g ' c ' -y1Alt a b c x e f g ' c ' -y1It a b c x e f g 'x' -y1it a b c x e f g ' x ' -y1at a b c x e f g ' x ' -y1At a b c x e f g ' x ' -y1Int a b c x e f g 'e' -y1int a b c x e f g ' e ' -y1ant a b c x e f g ' e ' -y1Ant a b c x e f g ' e ' -y2Ilt a b c x e f g 'b' -y2ilt a b c x e f g ' b ' -y2alt a b c x e f g ' b ' -y2Alt a b c x e f g ' b ' -y2It a b c x e f g ' x ' -y2it a b c x e f g ' x ' -y2at a b c x e f g ' x ' -y2At a b c x e f g ' x ' -y2Int a b c x e f g 'f' -y2int a b c x e f g ' f ' -y2ant a b c x e f g ' f ' -y2Ant a b c x e f g ' f ' -vIlt a b _ x e f g -vilt a b ___ x e f g -valt a b __________ x e f g -vAlt a b ___________ x e f g -vIt a b c _ e f g -vit a b c ___ e f g -vat a b c __________ e f g -vAt a b c ___________ e f g -vInt a b c x _ f g -vint a b c x ___ f g -vant a b c x __________ f g -vAnt a b c x ___________ f g -v1Ilt a b _ x e f g -v1ilt a b ___ x e f g -v1alt a b __________ x e f g -v1Alt a b ___________ x e f g -v1It a b c _ e f g -v1it a b c ___ e f g -v1at a b c __________ e f g -v1At a b c ___________ e f g -v1Int a b c x _ f g -v1int a b c x ___ f g -v1ant a b c x __________ f g -v1Ant a b c x ___________ f g -v2Ilt a _ c x e f g -v2ilt a ___ c x e f g -v2alt a __________ c x e f g -v2Alt a ___________ c x e f g -v2It a b c __________ e f g -v2it a b c ____________ e f g -v2at a b c ___________________ e f g -v2At a b c ____________________ e f g -v2Int a b c x e _ g -v2int a b c x e ___ g -v2ant a b c x e __________ g -v2Ant a b c x e ___________g - -a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l -cIL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -ciL' a ' b ' c '_' e ' x ' g ' h ' i ' k ' l -caL' a ' b ' c _ e ' x ' g ' h ' i ' k ' l -cAL' a ' b ' c _e ' x ' g ' h ' i ' k ' l -cIl' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -cil' a ' b ' c ' d '_' x ' g ' h ' i ' k ' l -cal' a ' b ' c ' d _ x ' g ' h ' i ' k ' l -cAl' a ' b ' c ' d _x ' g ' h ' i ' k ' l -cI' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -ci' a ' b ' c ' d ' e '_' g ' h ' i ' k ' l -ca' a ' b ' c ' d ' e _ g ' h ' i ' k ' l -cA' a ' b ' c ' d ' e _g ' h ' i ' k ' l -cIn' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -cin' a ' b ' c ' d ' e ' x '_' h ' i ' k ' l -can' a ' b ' c ' d ' e ' x _ h ' i ' k ' l -cAn' a ' b ' c ' d ' e ' x _h ' i ' k ' l -cIN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -ciN' a ' b ' c ' d ' e ' x ' g '_' i ' k ' l -caN' a ' b ' c ' d ' e ' x ' g _ i ' k ' l -cAN' a ' b ' c ' d ' e ' x ' g _i ' k ' l -c1IL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -c1iL' a ' b ' c '_' e ' x ' g ' h ' i ' k ' l -c1aL' a ' b ' c _ e ' x ' g ' h ' i ' k ' l -c1AL' a ' b ' c _e ' x ' g ' h ' i ' k ' l -c1Il' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -c1il' a ' b ' c ' d '_' x ' g ' h ' i ' k ' l -c1al' a ' b ' c ' d _ x ' g ' h ' i ' k ' l -c1Al' a ' b ' c ' d _x ' g ' h ' i ' k ' l -c1I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -c1i' a ' b ' c ' d ' e '_' g ' h ' i ' k ' l -c1a' a ' b ' c ' d ' e _ g ' h ' i ' k ' l -c1A' a ' b ' c ' d ' e _g ' h ' i ' k ' l -c1In' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -c1in' a ' b ' c ' d ' e ' x '_' h ' i ' k ' l -c1an' a ' b ' c ' d ' e ' x _ h ' i ' k ' l -c1An' a ' b ' c ' d ' e ' x _h ' i ' k ' l -c1IN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -c1iN' a ' b ' c ' d ' e ' x ' g '_' i ' k ' l -c1aN' a ' b ' c ' d ' e ' x ' g _ i ' k ' l -c1AN' a ' b ' c ' d ' e ' x ' g _i ' k ' l -c2IL' a ' _ ' c ' d ' e ' x ' g ' h ' i ' k ' l -c2iL' a '_' c ' d ' e ' x ' g ' h ' i ' k ' l -c2aL' a _ c ' d ' e ' x ' g ' h ' i ' k ' l -c2AL' a _c ' d ' e ' x ' g ' h ' i ' k ' l -c2Il' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -c2il' a ' b ' c '_' e ' x ' g ' h ' i ' k ' l -c2al' a ' b ' c _ e ' x ' g ' h ' i ' k ' l -c2Al' a ' b ' c _e ' x ' g ' h ' i ' k ' l -c2I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -c2i' a ' b ' c ' d ' e '_' g ' h ' i ' k ' l -c2a' a ' b ' c ' d ' e _ g ' h ' i ' k ' l -c2A' a ' b ' c ' d ' e _g ' h ' i ' k ' l -c2In' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -c2in' a ' b ' c ' d ' e ' x ' g '_' i ' k ' l -c2an' a ' b ' c ' d ' e ' x ' g _ i ' k ' l -c2An' a ' b ' c ' d ' e ' x ' g _i ' k ' l -c2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' _ ' l -c2iN' a ' b ' c ' d ' e ' x ' g ' h ' i '_' l -c2aN' a ' b ' c ' d ' e ' x ' g ' h ' i _ l -c2AN' a ' b ' c ' d ' e ' x ' g ' h ' i _l -dIL' a ' b ' c ' ' e ' x ' g ' h ' i ' k ' l -diL' a ' b ' c '' e ' x ' g ' h ' i ' k ' l -daL' a ' b ' c e ' x ' g ' h ' i ' k ' l -dAL' a ' b ' c e ' x ' g ' h ' i ' k ' l -dIl' a ' b ' c ' d ' ' x ' g ' h ' i ' k ' l -dil' a ' b ' c ' d '' x ' g ' h ' i ' k ' l -dal' a ' b ' c ' d x ' g ' h ' i ' k ' l -dAl' a ' b ' c ' d x ' g ' h ' i ' k ' l -dI' a ' b ' c ' d ' e ' ' g ' h ' i ' k ' l -di' a ' b ' c ' d ' e '' g ' h ' i ' k ' l -da' a ' b ' c ' d ' e g ' h ' i ' k ' l -dA' a ' b ' c ' d ' e g ' h ' i ' k ' l -dIn' a ' b ' c ' d ' e ' x ' ' h ' i ' k ' l -din' a ' b ' c ' d ' e ' x '' h ' i ' k ' l -dan' a ' b ' c ' d ' e ' x h ' i ' k ' l -dAn' a ' b ' c ' d ' e ' x h ' i ' k ' l -dIN' a ' b ' c ' d ' e ' x ' g ' ' i ' k ' l -diN' a ' b ' c ' d ' e ' x ' g '' i ' k ' l -daN' a ' b ' c ' d ' e ' x ' g i ' k ' l -dAN' a ' b ' c ' d ' e ' x ' g i ' k ' l -d1IL' a ' b ' c ' ' e ' x ' g ' h ' i ' k ' l -d1iL' a ' b ' c '' e ' x ' g ' h ' i ' k ' l -d1aL' a ' b ' c e ' x ' g ' h ' i ' k ' l -d1AL' a ' b ' c e ' x ' g ' h ' i ' k ' l -d1Il' a ' b ' c ' d ' ' x ' g ' h ' i ' k ' l -d1il' a ' b ' c ' d '' x ' g ' h ' i ' k ' l -d1al' a ' b ' c ' d x ' g ' h ' i ' k ' l -d1Al' a ' b ' c ' d x ' g ' h ' i ' k ' l -d1I' a ' b ' c ' d ' e ' ' g ' h ' i ' k ' l -d1i' a ' b ' c ' d ' e '' g ' h ' i ' k ' l -d1a' a ' b ' c ' d ' e g ' h ' i ' k ' l -d1A' a ' b ' c ' d ' e g ' h ' i ' k ' l -d1In' a ' b ' c ' d ' e ' x ' ' h ' i ' k ' l -d1in' a ' b ' c ' d ' e ' x '' h ' i ' k ' l -d1an' a ' b ' c ' d ' e ' x h ' i ' k ' l -d1An' a ' b ' c ' d ' e ' x h ' i ' k ' l -d1IN' a ' b ' c ' d ' e ' x ' g ' ' i ' k ' l -d1iN' a ' b ' c ' d ' e ' x ' g '' i ' k ' l -d1aN' a ' b ' c ' d ' e ' x ' g i ' k ' l -d1AN' a ' b ' c ' d ' e ' x ' g i ' k ' l -d2IL' a ' ' c ' d ' e ' x ' g ' h ' i ' k ' l -d2iL' a '' c ' d ' e ' x ' g ' h ' i ' k ' l -d2aL' a c ' d ' e ' x ' g ' h ' i ' k ' l -d2AL' a c ' d ' e ' x ' g ' h ' i ' k ' l -d2Il' a ' b ' c ' ' e ' x ' g ' h ' i ' k ' l -d2il' a ' b ' c '' e ' x ' g ' h ' i ' k ' l -d2al' a ' b ' c e ' x ' g ' h ' i ' k ' l -d2Al' a ' b ' c e ' x ' g ' h ' i ' k ' l -d2I' a ' b ' c ' d ' e ' ' g ' h ' i ' k ' l -d2i' a ' b ' c ' d ' e '' g ' h ' i ' k ' l -d2a' a ' b ' c ' d ' e g ' h ' i ' k ' l -d2A' a ' b ' c ' d ' e g ' h ' i ' k ' l -d2In' a ' b ' c ' d ' e ' x ' g ' ' i ' k ' l -d2in' a ' b ' c ' d ' e ' x ' g '' i ' k ' l -d2an' a ' b ' c ' d ' e ' x ' g i ' k ' l -d2An' a ' b ' c ' d ' e ' x ' g i ' k ' l -d2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' ' l -d2iN' a ' b ' c ' d ' e ' x ' g ' h ' i '' l -d2aN' a ' b ' c ' d ' e ' x ' g ' h ' i l -d2AN' a ' b ' c ' d ' e ' x ' g ' h ' i l -yIL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'd' -yiL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' d ' -yaL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d '' -yAL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d ' ' -yIl' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'e' -yil' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' e ' -yal' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e '' -yAl' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e ' ' -yI' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'x' -yi' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' x ' -ya' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x '' -yA' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x ' ' -yIn' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'g' -yin' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' g ' -yan' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g '' -yAn' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g ' ' -yIN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'h' -yiN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' h ' -yaN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h '' -yAN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h ' ' -y1IL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'd' -y1iL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' d ' -y1aL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d '' -y1AL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d ' ' -y1Il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'e' -y1il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' e ' -y1al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e '' -y1Al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e ' ' -y1I' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'x' -y1i' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' x ' -y1a' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x '' -y1A' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x ' ' -y1In' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'g' -y1in' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' g ' -y1an' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g '' -y1An' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g ' ' -y1IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'h' -y1iN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' h ' -y1aN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h '' -y1AN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h ' ' -y2IL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'b' -y2iL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' b ' -y2aL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' b '' -y2AL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' b ' ' -y2Il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'd' -y2il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' d ' -y2al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d '' -y2Al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d ' ' -y2I' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'x' -y2i' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' x ' -y2a' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x '' -y2A' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x ' ' -y2In' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'h' -y2in' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' h ' -y2an' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h '' -y2An' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h ' ' -y2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'k' -y2iN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' k ' -y2aN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' k '' -y2AN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' k ' ' -vIL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -viL' a ' b ' c '___' e ' x ' g ' h ' i ' k ' l -vaL' a ' b ' c _____ e ' x ' g ' h ' i ' k ' l -vAL' a ' b ' c ______e ' x ' g ' h ' i ' k ' l -vIl' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -vil' a ' b ' c ' d '___' x ' g ' h ' i ' k ' l -val' a ' b ' c ' d _____ x ' g ' h ' i ' k ' l -vAl' a ' b ' c ' d ______x ' g ' h ' i ' k ' l -vI' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -vi' a ' b ' c ' d ' e '___' g ' h ' i ' k ' l -va' a ' b ' c ' d ' e _____ g ' h ' i ' k ' l -vA' a ' b ' c ' d ' e ______g ' h ' i ' k ' l -vIn' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -vin' a ' b ' c ' d ' e ' x '___' h ' i ' k ' l -van' a ' b ' c ' d ' e ' x _____ h ' i ' k ' l -vAn' a ' b ' c ' d ' e ' x ______h ' i ' k ' l -vIN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -viN' a ' b ' c ' d ' e ' x ' g '___' i ' k ' l -vaN' a ' b ' c ' d ' e ' x ' g _____ i ' k ' l -vAN' a ' b ' c ' d ' e ' x ' g ______i ' k ' l -v1IL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -v1iL' a ' b ' c '___' e ' x ' g ' h ' i ' k ' l -v1aL' a ' b ' c _____ e ' x ' g ' h ' i ' k ' l -v1AL' a ' b ' c ______e ' x ' g ' h ' i ' k ' l -v1Il' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -v1il' a ' b ' c ' d '___' x ' g ' h ' i ' k ' l -v1al' a ' b ' c ' d _____ x ' g ' h ' i ' k ' l -v1Al' a ' b ' c ' d ______x ' g ' h ' i ' k ' l -v1I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -v1i' a ' b ' c ' d ' e '___' g ' h ' i ' k ' l -v1a' a ' b ' c ' d ' e _____ g ' h ' i ' k ' l -v1A' a ' b ' c ' d ' e ______g ' h ' i ' k ' l -v1In' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -v1in' a ' b ' c ' d ' e ' x '___' h ' i ' k ' l -v1an' a ' b ' c ' d ' e ' x _____ h ' i ' k ' l -v1An' a ' b ' c ' d ' e ' x ______h ' i ' k ' l -v1IN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -v1iN' a ' b ' c ' d ' e ' x ' g '___' i ' k ' l -v1aN' a ' b ' c ' d ' e ' x ' g _____ i ' k ' l -v1AN' a ' b ' c ' d ' e ' x ' g ______i ' k ' l -v2IL' a ' _ ' c ' d ' e ' x ' g ' h ' i ' k ' l -v2iL' a '___' c ' d ' e ' x ' g ' h ' i ' k ' l -v2aL' a _____ c ' d ' e ' x ' g ' h ' i ' k ' l -v2AL' a ______c ' d ' e ' x ' g ' h ' i ' k ' l -v2Il' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -v2il' a ' b ' c '___' e ' x ' g ' h ' i ' k ' l -v2al' a ' b ' c _____ e ' x ' g ' h ' i ' k ' l -v2Al' a ' b ' c ______e ' x ' g ' h ' i ' k ' l -v2I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -v2i' a ' b ' c ' d ' e '___' g ' h ' i ' k ' l -v2a' a ' b ' c ' d ' e _____ g ' h ' i ' k ' l -v2A' a ' b ' c ' d ' e ______g ' h ' i ' k ' l -v2In' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -v2in' a ' b ' c ' d ' e ' x ' g '___' i ' k ' l -v2an' a ' b ' c ' d ' e ' x ' g _____ i ' k ' l -v2An' a ' b ' c ' d ' e ' x ' g ______i ' k ' l -v2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' _ ' l -v2iN' a ' b ' c ' d ' e ' x ' g ' h ' i '___' l -v2aN' a ' b ' c ' d ' e ' x ' g ' h ' i _____ l -v2AN' a ' b ' c ' d ' e ' x ' g ' h ' i ______l -a " b " c " d " e " x " g " h " i " k " l -cIL" a " b " c " _ " e " x " g " h " i " k " l -ciL" a " b " c "_" e " x " g " h " i " k " l -caL" a " b " c _ e " x " g " h " i " k " l -cAL" a " b " c _e " x " g " h " i " k " l -cIl" a " b " c " d " _ " x " g " h " i " k " l -cil" a " b " c " d "_" x " g " h " i " k " l -cal" a " b " c " d _ x " g " h " i " k " l -cAl" a " b " c " d _x " g " h " i " k " l -cI" a " b " c " d " e " _ " g " h " i " k " l -ci" a " b " c " d " e "_" g " h " i " k " l -ca" a " b " c " d " e _ g " h " i " k " l -cA" a " b " c " d " e _g " h " i " k " l -cIn" a " b " c " d " e " x " _ " h " i " k " l -cin" a " b " c " d " e " x "_" h " i " k " l -can" a " b " c " d " e " x _ h " i " k " l -cAn" a " b " c " d " e " x _h " i " k " l -cIN" a " b " c " d " e " x " g " _ " i " k " l -ciN" a " b " c " d " e " x " g "_" i " k " l -caN" a " b " c " d " e " x " g _ i " k " l -cAN" a " b " c " d " e " x " g _i " k " l -c1IL" a " b " c " _ " e " x " g " h " i " k " l -c1iL" a " b " c "_" e " x " g " h " i " k " l -c1aL" a " b " c _ e " x " g " h " i " k " l -c1AL" a " b " c _e " x " g " h " i " k " l -c1Il" a " b " c " d " _ " x " g " h " i " k " l -c1il" a " b " c " d "_" x " g " h " i " k " l -c1al" a " b " c " d _ x " g " h " i " k " l -c1Al" a " b " c " d _x " g " h " i " k " l -c1I" a " b " c " d " e " _ " g " h " i " k " l -c1i" a " b " c " d " e "_" g " h " i " k " l -c1a" a " b " c " d " e _ g " h " i " k " l -c1A" a " b " c " d " e _g " h " i " k " l -c1In" a " b " c " d " e " x " _ " h " i " k " l -c1in" a " b " c " d " e " x "_" h " i " k " l -c1an" a " b " c " d " e " x _ h " i " k " l -c1An" a " b " c " d " e " x _h " i " k " l -c1IN" a " b " c " d " e " x " g " _ " i " k " l -c1iN" a " b " c " d " e " x " g "_" i " k " l -c1aN" a " b " c " d " e " x " g _ i " k " l -c1AN" a " b " c " d " e " x " g _i " k " l -c2IL" a " _ " c " d " e " x " g " h " i " k " l -c2iL" a "_" c " d " e " x " g " h " i " k " l -c2aL" a _ c " d " e " x " g " h " i " k " l -c2AL" a _c " d " e " x " g " h " i " k " l -c2Il" a " b " c " _ " e " x " g " h " i " k " l -c2il" a " b " c "_" e " x " g " h " i " k " l -c2al" a " b " c _ e " x " g " h " i " k " l -c2Al" a " b " c _e " x " g " h " i " k " l -c2I" a " b " c " d " e " _ " g " h " i " k " l -c2i" a " b " c " d " e "_" g " h " i " k " l -c2a" a " b " c " d " e _ g " h " i " k " l -c2A" a " b " c " d " e _g " h " i " k " l -c2In" a " b " c " d " e " x " g " _ " i " k " l -c2in" a " b " c " d " e " x " g "_" i " k " l -c2an" a " b " c " d " e " x " g _ i " k " l -c2An" a " b " c " d " e " x " g _i " k " l -c2IN" a " b " c " d " e " x " g " h " i " _ " l -c2iN" a " b " c " d " e " x " g " h " i "_" l -c2aN" a " b " c " d " e " x " g " h " i _ l -c2AN" a " b " c " d " e " x " g " h " i _l -dIL" a " b " c " " e " x " g " h " i " k " l -diL" a " b " c "" e " x " g " h " i " k " l -daL" a " b " c e " x " g " h " i " k " l -dAL" a " b " c e " x " g " h " i " k " l -dIl" a " b " c " d " " x " g " h " i " k " l -dil" a " b " c " d "" x " g " h " i " k " l -dal" a " b " c " d x " g " h " i " k " l -dAl" a " b " c " d x " g " h " i " k " l -dI" a " b " c " d " e " " g " h " i " k " l -di" a " b " c " d " e "" g " h " i " k " l -da" a " b " c " d " e g " h " i " k " l -dA" a " b " c " d " e g " h " i " k " l -dIn" a " b " c " d " e " x " " h " i " k " l -din" a " b " c " d " e " x "" h " i " k " l -dan" a " b " c " d " e " x h " i " k " l -dAn" a " b " c " d " e " x h " i " k " l -dIN" a " b " c " d " e " x " g " " i " k " l -diN" a " b " c " d " e " x " g "" i " k " l -daN" a " b " c " d " e " x " g i " k " l -dAN" a " b " c " d " e " x " g i " k " l -d1IL" a " b " c " " e " x " g " h " i " k " l -d1iL" a " b " c "" e " x " g " h " i " k " l -d1aL" a " b " c e " x " g " h " i " k " l -d1AL" a " b " c e " x " g " h " i " k " l -d1Il" a " b " c " d " " x " g " h " i " k " l -d1il" a " b " c " d "" x " g " h " i " k " l -d1al" a " b " c " d x " g " h " i " k " l -d1Al" a " b " c " d x " g " h " i " k " l -d1I" a " b " c " d " e " " g " h " i " k " l -d1i" a " b " c " d " e "" g " h " i " k " l -d1a" a " b " c " d " e g " h " i " k " l -d1A" a " b " c " d " e g " h " i " k " l -d1In" a " b " c " d " e " x " " h " i " k " l -d1in" a " b " c " d " e " x "" h " i " k " l -d1an" a " b " c " d " e " x h " i " k " l -d1An" a " b " c " d " e " x h " i " k " l -d1IN" a " b " c " d " e " x " g " " i " k " l -d1iN" a " b " c " d " e " x " g "" i " k " l -d1aN" a " b " c " d " e " x " g i " k " l -d1AN" a " b " c " d " e " x " g i " k " l -d2IL" a " " c " d " e " x " g " h " i " k " l -d2iL" a "" c " d " e " x " g " h " i " k " l -d2aL" a c " d " e " x " g " h " i " k " l -d2AL" a c " d " e " x " g " h " i " k " l -d2Il" a " b " c " " e " x " g " h " i " k " l -d2il" a " b " c "" e " x " g " h " i " k " l -d2al" a " b " c e " x " g " h " i " k " l -d2Al" a " b " c e " x " g " h " i " k " l -d2I" a " b " c " d " e " " g " h " i " k " l -d2i" a " b " c " d " e "" g " h " i " k " l -d2a" a " b " c " d " e g " h " i " k " l -d2A" a " b " c " d " e g " h " i " k " l -d2In" a " b " c " d " e " x " g " " i " k " l -d2in" a " b " c " d " e " x " g "" i " k " l -d2an" a " b " c " d " e " x " g i " k " l -d2An" a " b " c " d " e " x " g i " k " l -d2IN" a " b " c " d " e " x " g " h " i " " l -d2iN" a " b " c " d " e " x " g " h " i "" l -d2aN" a " b " c " d " e " x " g " h " i l -d2AN" a " b " c " d " e " x " g " h " i l -yIL" a " b " c " d " e " x " g " h " i " k " l 'd' -yiL" a " b " c " d " e " x " g " h " i " k " l ' d ' -yaL" a " b " c " d " e " x " g " h " i " k " l '" d "' -yAL" a " b " c " d " e " x " g " h " i " k " l '" d " ' -yIl" a " b " c " d " e " x " g " h " i " k " l 'e' -yil" a " b " c " d " e " x " g " h " i " k " l ' e ' -yal" a " b " c " d " e " x " g " h " i " k " l '" e "' -yAl" a " b " c " d " e " x " g " h " i " k " l '" e " ' -yI" a " b " c " d " e " x " g " h " i " k " l 'x' -yi" a " b " c " d " e " x " g " h " i " k " l ' x ' -ya" a " b " c " d " e " x " g " h " i " k " l '" x "' -yA" a " b " c " d " e " x " g " h " i " k " l '" x " ' -yIn" a " b " c " d " e " x " g " h " i " k " l 'g' -yin" a " b " c " d " e " x " g " h " i " k " l ' g ' -yan" a " b " c " d " e " x " g " h " i " k " l '" g "' -yAn" a " b " c " d " e " x " g " h " i " k " l '" g " ' -yIN" a " b " c " d " e " x " g " h " i " k " l 'h' -yiN" a " b " c " d " e " x " g " h " i " k " l ' h ' -yaN" a " b " c " d " e " x " g " h " i " k " l '" h "' -yAN" a " b " c " d " e " x " g " h " i " k " l '" h " ' -y1IL" a " b " c " d " e " x " g " h " i " k " l 'd' -y1iL" a " b " c " d " e " x " g " h " i " k " l ' d ' -y1aL" a " b " c " d " e " x " g " h " i " k " l '" d "' -y1AL" a " b " c " d " e " x " g " h " i " k " l '" d " ' -y1Il" a " b " c " d " e " x " g " h " i " k " l 'e' -y1il" a " b " c " d " e " x " g " h " i " k " l ' e ' -y1al" a " b " c " d " e " x " g " h " i " k " l '" e "' -y1Al" a " b " c " d " e " x " g " h " i " k " l '" e " ' -y1I" a " b " c " d " e " x " g " h " i " k " l 'x' -y1i" a " b " c " d " e " x " g " h " i " k " l ' x ' -y1a" a " b " c " d " e " x " g " h " i " k " l '" x "' -y1A" a " b " c " d " e " x " g " h " i " k " l '" x " ' -y1In" a " b " c " d " e " x " g " h " i " k " l 'g' -y1in" a " b " c " d " e " x " g " h " i " k " l ' g ' -y1an" a " b " c " d " e " x " g " h " i " k " l '" g "' -y1An" a " b " c " d " e " x " g " h " i " k " l '" g " ' -y1IN" a " b " c " d " e " x " g " h " i " k " l 'h' -y1iN" a " b " c " d " e " x " g " h " i " k " l ' h ' -y1aN" a " b " c " d " e " x " g " h " i " k " l '" h "' -y1AN" a " b " c " d " e " x " g " h " i " k " l '" h " ' -y2IL" a " b " c " d " e " x " g " h " i " k " l 'b' -y2iL" a " b " c " d " e " x " g " h " i " k " l ' b ' -y2aL" a " b " c " d " e " x " g " h " i " k " l '" b "' -y2AL" a " b " c " d " e " x " g " h " i " k " l '" b " ' -y2Il" a " b " c " d " e " x " g " h " i " k " l 'd' -y2il" a " b " c " d " e " x " g " h " i " k " l ' d ' -y2al" a " b " c " d " e " x " g " h " i " k " l '" d "' -y2Al" a " b " c " d " e " x " g " h " i " k " l '" d " ' -y2I" a " b " c " d " e " x " g " h " i " k " l 'x' -y2i" a " b " c " d " e " x " g " h " i " k " l ' x ' -y2a" a " b " c " d " e " x " g " h " i " k " l '" x "' -y2A" a " b " c " d " e " x " g " h " i " k " l '" x " ' -y2In" a " b " c " d " e " x " g " h " i " k " l 'h' -y2in" a " b " c " d " e " x " g " h " i " k " l ' h ' -y2an" a " b " c " d " e " x " g " h " i " k " l '" h "' -y2An" a " b " c " d " e " x " g " h " i " k " l '" h " ' -y2IN" a " b " c " d " e " x " g " h " i " k " l 'k' -y2iN" a " b " c " d " e " x " g " h " i " k " l ' k ' -y2aN" a " b " c " d " e " x " g " h " i " k " l '" k "' -y2AN" a " b " c " d " e " x " g " h " i " k " l '" k " ' -vIL" a " b " c " _ " e " x " g " h " i " k " l -viL" a " b " c "___" e " x " g " h " i " k " l -vaL" a " b " c _____ e " x " g " h " i " k " l -vAL" a " b " c ______e " x " g " h " i " k " l -vIl" a " b " c " d " _ " x " g " h " i " k " l -vil" a " b " c " d "___" x " g " h " i " k " l -val" a " b " c " d _____ x " g " h " i " k " l -vAl" a " b " c " d ______x " g " h " i " k " l -vI" a " b " c " d " e " _ " g " h " i " k " l -vi" a " b " c " d " e "___" g " h " i " k " l -va" a " b " c " d " e _____ g " h " i " k " l -vA" a " b " c " d " e ______g " h " i " k " l -vIn" a " b " c " d " e " x " _ " h " i " k " l -vin" a " b " c " d " e " x "___" h " i " k " l -van" a " b " c " d " e " x _____ h " i " k " l -vAn" a " b " c " d " e " x ______h " i " k " l -vIN" a " b " c " d " e " x " g " _ " i " k " l -viN" a " b " c " d " e " x " g "___" i " k " l -vaN" a " b " c " d " e " x " g _____ i " k " l -vAN" a " b " c " d " e " x " g ______i " k " l -v1IL" a " b " c " _ " e " x " g " h " i " k " l -v1iL" a " b " c "___" e " x " g " h " i " k " l -v1aL" a " b " c _____ e " x " g " h " i " k " l -v1AL" a " b " c ______e " x " g " h " i " k " l -v1Il" a " b " c " d " _ " x " g " h " i " k " l -v1il" a " b " c " d "___" x " g " h " i " k " l -v1al" a " b " c " d _____ x " g " h " i " k " l -v1Al" a " b " c " d ______x " g " h " i " k " l -v1I" a " b " c " d " e " _ " g " h " i " k " l -v1i" a " b " c " d " e "___" g " h " i " k " l -v1a" a " b " c " d " e _____ g " h " i " k " l -v1A" a " b " c " d " e ______g " h " i " k " l -v1In" a " b " c " d " e " x " _ " h " i " k " l -v1in" a " b " c " d " e " x "___" h " i " k " l -v1an" a " b " c " d " e " x _____ h " i " k " l -v1An" a " b " c " d " e " x ______h " i " k " l -v1IN" a " b " c " d " e " x " g " _ " i " k " l -v1iN" a " b " c " d " e " x " g "___" i " k " l -v1aN" a " b " c " d " e " x " g _____ i " k " l -v1AN" a " b " c " d " e " x " g ______i " k " l -v2IL" a " _ " c " d " e " x " g " h " i " k " l -v2iL" a "___" c " d " e " x " g " h " i " k " l -v2aL" a _____ c " d " e " x " g " h " i " k " l -v2AL" a ______c " d " e " x " g " h " i " k " l -v2Il" a " b " c " _ " e " x " g " h " i " k " l -v2il" a " b " c "___" e " x " g " h " i " k " l -v2al" a " b " c _____ e " x " g " h " i " k " l -v2Al" a " b " c ______e " x " g " h " i " k " l -v2I" a " b " c " d " e " _ " g " h " i " k " l -v2i" a " b " c " d " e "___" g " h " i " k " l -v2a" a " b " c " d " e _____ g " h " i " k " l -v2A" a " b " c " d " e ______g " h " i " k " l -v2In" a " b " c " d " e " x " g " _ " i " k " l -v2in" a " b " c " d " e " x " g "___" i " k " l -v2an" a " b " c " d " e " x " g _____ i " k " l -v2An" a " b " c " d " e " x " g ______i " k " l -v2IN" a " b " c " d " e " x " g " h " i " _ " l -v2iN" a " b " c " d " e " x " g " h " i "___" l -v2aN" a " b " c " d " e " x " g " h " i _____ l -v2AN" a " b " c " d " e " x " g " h " i ______l -a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l -cIL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -ciL` a ` b ` c `_` e ` x ` g ` h ` i ` k ` l -caL` a ` b ` c _ e ` x ` g ` h ` i ` k ` l -cAL` a ` b ` c _e ` x ` g ` h ` i ` k ` l -cIl` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -cil` a ` b ` c ` d `_` x ` g ` h ` i ` k ` l -cal` a ` b ` c ` d _ x ` g ` h ` i ` k ` l -cAl` a ` b ` c ` d _x ` g ` h ` i ` k ` l -cI` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -ci` a ` b ` c ` d ` e `_` g ` h ` i ` k ` l -ca` a ` b ` c ` d ` e _ g ` h ` i ` k ` l -cA` a ` b ` c ` d ` e _g ` h ` i ` k ` l -cIn` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -cin` a ` b ` c ` d ` e ` x `_` h ` i ` k ` l -can` a ` b ` c ` d ` e ` x _ h ` i ` k ` l -cAn` a ` b ` c ` d ` e ` x _h ` i ` k ` l -cIN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -ciN` a ` b ` c ` d ` e ` x ` g `_` i ` k ` l -caN` a ` b ` c ` d ` e ` x ` g _ i ` k ` l -cAN` a ` b ` c ` d ` e ` x ` g _i ` k ` l -c1IL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -c1iL` a ` b ` c `_` e ` x ` g ` h ` i ` k ` l -c1aL` a ` b ` c _ e ` x ` g ` h ` i ` k ` l -c1AL` a ` b ` c _e ` x ` g ` h ` i ` k ` l -c1Il` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -c1il` a ` b ` c ` d `_` x ` g ` h ` i ` k ` l -c1al` a ` b ` c ` d _ x ` g ` h ` i ` k ` l -c1Al` a ` b ` c ` d _x ` g ` h ` i ` k ` l -c1I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -c1i` a ` b ` c ` d ` e `_` g ` h ` i ` k ` l -c1a` a ` b ` c ` d ` e _ g ` h ` i ` k ` l -c1A` a ` b ` c ` d ` e _g ` h ` i ` k ` l -c1In` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -c1in` a ` b ` c ` d ` e ` x `_` h ` i ` k ` l -c1an` a ` b ` c ` d ` e ` x _ h ` i ` k ` l -c1An` a ` b ` c ` d ` e ` x _h ` i ` k ` l -c1IN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -c1iN` a ` b ` c ` d ` e ` x ` g `_` i ` k ` l -c1aN` a ` b ` c ` d ` e ` x ` g _ i ` k ` l -c1AN` a ` b ` c ` d ` e ` x ` g _i ` k ` l -c2IL` a ` _ ` c ` d ` e ` x ` g ` h ` i ` k ` l -c2iL` a `_` c ` d ` e ` x ` g ` h ` i ` k ` l -c2aL` a _ c ` d ` e ` x ` g ` h ` i ` k ` l -c2AL` a _c ` d ` e ` x ` g ` h ` i ` k ` l -c2Il` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -c2il` a ` b ` c `_` e ` x ` g ` h ` i ` k ` l -c2al` a ` b ` c _ e ` x ` g ` h ` i ` k ` l -c2Al` a ` b ` c _e ` x ` g ` h ` i ` k ` l -c2I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -c2i` a ` b ` c ` d ` e `_` g ` h ` i ` k ` l -c2a` a ` b ` c ` d ` e _ g ` h ` i ` k ` l -c2A` a ` b ` c ` d ` e _g ` h ` i ` k ` l -c2In` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -c2in` a ` b ` c ` d ` e ` x ` g `_` i ` k ` l -c2an` a ` b ` c ` d ` e ` x ` g _ i ` k ` l -c2An` a ` b ` c ` d ` e ` x ` g _i ` k ` l -c2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` _ ` l -c2iN` a ` b ` c ` d ` e ` x ` g ` h ` i `_` l -c2aN` a ` b ` c ` d ` e ` x ` g ` h ` i _ l -c2AN` a ` b ` c ` d ` e ` x ` g ` h ` i _l -dIL` a ` b ` c ` ` e ` x ` g ` h ` i ` k ` l -diL` a ` b ` c `` e ` x ` g ` h ` i ` k ` l -daL` a ` b ` c e ` x ` g ` h ` i ` k ` l -dAL` a ` b ` c e ` x ` g ` h ` i ` k ` l -dIl` a ` b ` c ` d ` ` x ` g ` h ` i ` k ` l -dil` a ` b ` c ` d `` x ` g ` h ` i ` k ` l -dal` a ` b ` c ` d x ` g ` h ` i ` k ` l -dAl` a ` b ` c ` d x ` g ` h ` i ` k ` l -dI` a ` b ` c ` d ` e ` ` g ` h ` i ` k ` l -di` a ` b ` c ` d ` e `` g ` h ` i ` k ` l -da` a ` b ` c ` d ` e g ` h ` i ` k ` l -dA` a ` b ` c ` d ` e g ` h ` i ` k ` l -dIn` a ` b ` c ` d ` e ` x ` ` h ` i ` k ` l -din` a ` b ` c ` d ` e ` x `` h ` i ` k ` l -dan` a ` b ` c ` d ` e ` x h ` i ` k ` l -dAn` a ` b ` c ` d ` e ` x h ` i ` k ` l -dIN` a ` b ` c ` d ` e ` x ` g ` ` i ` k ` l -diN` a ` b ` c ` d ` e ` x ` g `` i ` k ` l -daN` a ` b ` c ` d ` e ` x ` g i ` k ` l -dAN` a ` b ` c ` d ` e ` x ` g i ` k ` l -d1IL` a ` b ` c ` ` e ` x ` g ` h ` i ` k ` l -d1iL` a ` b ` c `` e ` x ` g ` h ` i ` k ` l -d1aL` a ` b ` c e ` x ` g ` h ` i ` k ` l -d1AL` a ` b ` c e ` x ` g ` h ` i ` k ` l -d1Il` a ` b ` c ` d ` ` x ` g ` h ` i ` k ` l -d1il` a ` b ` c ` d `` x ` g ` h ` i ` k ` l -d1al` a ` b ` c ` d x ` g ` h ` i ` k ` l -d1Al` a ` b ` c ` d x ` g ` h ` i ` k ` l -d1I` a ` b ` c ` d ` e ` ` g ` h ` i ` k ` l -d1i` a ` b ` c ` d ` e `` g ` h ` i ` k ` l -d1a` a ` b ` c ` d ` e g ` h ` i ` k ` l -d1A` a ` b ` c ` d ` e g ` h ` i ` k ` l -d1In` a ` b ` c ` d ` e ` x ` ` h ` i ` k ` l -d1in` a ` b ` c ` d ` e ` x `` h ` i ` k ` l -d1an` a ` b ` c ` d ` e ` x h ` i ` k ` l -d1An` a ` b ` c ` d ` e ` x h ` i ` k ` l -d1IN` a ` b ` c ` d ` e ` x ` g ` ` i ` k ` l -d1iN` a ` b ` c ` d ` e ` x ` g `` i ` k ` l -d1aN` a ` b ` c ` d ` e ` x ` g i ` k ` l -d1AN` a ` b ` c ` d ` e ` x ` g i ` k ` l -d2IL` a ` ` c ` d ` e ` x ` g ` h ` i ` k ` l -d2iL` a `` c ` d ` e ` x ` g ` h ` i ` k ` l -d2aL` a c ` d ` e ` x ` g ` h ` i ` k ` l -d2AL` a c ` d ` e ` x ` g ` h ` i ` k ` l -d2Il` a ` b ` c ` ` e ` x ` g ` h ` i ` k ` l -d2il` a ` b ` c `` e ` x ` g ` h ` i ` k ` l -d2al` a ` b ` c e ` x ` g ` h ` i ` k ` l -d2Al` a ` b ` c e ` x ` g ` h ` i ` k ` l -d2I` a ` b ` c ` d ` e ` ` g ` h ` i ` k ` l -d2i` a ` b ` c ` d ` e `` g ` h ` i ` k ` l -d2a` a ` b ` c ` d ` e g ` h ` i ` k ` l -d2A` a ` b ` c ` d ` e g ` h ` i ` k ` l -d2In` a ` b ` c ` d ` e ` x ` g ` ` i ` k ` l -d2in` a ` b ` c ` d ` e ` x ` g `` i ` k ` l -d2an` a ` b ` c ` d ` e ` x ` g i ` k ` l -d2An` a ` b ` c ` d ` e ` x ` g i ` k ` l -d2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` ` l -d2iN` a ` b ` c ` d ` e ` x ` g ` h ` i `` l -d2aN` a ` b ` c ` d ` e ` x ` g ` h ` i l -d2AN` a ` b ` c ` d ` e ` x ` g ` h ` i l -yIL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'd' -yiL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' d ' -yaL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d `' -yAL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d ` ' -yIl` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'e' -yil` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' e ' -yal` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e `' -yAl` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e ` ' -yI` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'x' -yi` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' x ' -ya` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x `' -yA` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x ` ' -yIn` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'g' -yin` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' g ' -yan` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g `' -yAn` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g ` ' -yIN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'h' -yiN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' h ' -yaN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h `' -yAN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h ` ' -y1IL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'd' -y1iL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' d ' -y1aL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d `' -y1AL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d ` ' -y1Il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'e' -y1il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' e ' -y1al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e `' -y1Al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e ` ' -y1I` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'x' -y1i` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' x ' -y1a` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x `' -y1A` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x ` ' -y1In` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'g' -y1in` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' g ' -y1an` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g `' -y1An` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g ` ' -y1IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'h' -y1iN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' h ' -y1aN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h `' -y1AN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h ` ' -y2IL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'b' -y2iL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' b ' -y2aL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` b `' -y2AL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` b ` ' -y2Il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'd' -y2il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' d ' -y2al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d `' -y2Al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d ` ' -y2I` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'x' -y2i` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' x ' -y2a` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x `' -y2A` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x ` ' -y2In` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'h' -y2in` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' h ' -y2an` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h `' -y2An` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h ` ' -y2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'k' -y2iN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' k ' -y2aN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` k `' -y2AN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` k ` ' -vIL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -viL` a ` b ` c `___` e ` x ` g ` h ` i ` k ` l -vaL` a ` b ` c _____ e ` x ` g ` h ` i ` k ` l -vAL` a ` b ` c ______e ` x ` g ` h ` i ` k ` l -vIl` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -vil` a ` b ` c ` d `___` x ` g ` h ` i ` k ` l -val` a ` b ` c ` d _____ x ` g ` h ` i ` k ` l -vAl` a ` b ` c ` d ______x ` g ` h ` i ` k ` l -vI` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -vi` a ` b ` c ` d ` e `___` g ` h ` i ` k ` l -va` a ` b ` c ` d ` e _____ g ` h ` i ` k ` l -vA` a ` b ` c ` d ` e ______g ` h ` i ` k ` l -vIn` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -vin` a ` b ` c ` d ` e ` x `___` h ` i ` k ` l -van` a ` b ` c ` d ` e ` x _____ h ` i ` k ` l -vAn` a ` b ` c ` d ` e ` x ______h ` i ` k ` l -vIN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -viN` a ` b ` c ` d ` e ` x ` g `___` i ` k ` l -vaN` a ` b ` c ` d ` e ` x ` g _____ i ` k ` l -vAN` a ` b ` c ` d ` e ` x ` g ______i ` k ` l -v1IL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -v1iL` a ` b ` c `___` e ` x ` g ` h ` i ` k ` l -v1aL` a ` b ` c _____ e ` x ` g ` h ` i ` k ` l -v1AL` a ` b ` c ______e ` x ` g ` h ` i ` k ` l -v1Il` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -v1il` a ` b ` c ` d `___` x ` g ` h ` i ` k ` l -v1al` a ` b ` c ` d _____ x ` g ` h ` i ` k ` l -v1Al` a ` b ` c ` d ______x ` g ` h ` i ` k ` l -v1I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -v1i` a ` b ` c ` d ` e `___` g ` h ` i ` k ` l -v1a` a ` b ` c ` d ` e _____ g ` h ` i ` k ` l -v1A` a ` b ` c ` d ` e ______g ` h ` i ` k ` l -v1In` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -v1in` a ` b ` c ` d ` e ` x `___` h ` i ` k ` l -v1an` a ` b ` c ` d ` e ` x _____ h ` i ` k ` l -v1An` a ` b ` c ` d ` e ` x ______h ` i ` k ` l -v1IN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -v1iN` a ` b ` c ` d ` e ` x ` g `___` i ` k ` l -v1aN` a ` b ` c ` d ` e ` x ` g _____ i ` k ` l -v1AN` a ` b ` c ` d ` e ` x ` g ______i ` k ` l -v2IL` a ` _ ` c ` d ` e ` x ` g ` h ` i ` k ` l -v2iL` a `___` c ` d ` e ` x ` g ` h ` i ` k ` l -v2aL` a _____ c ` d ` e ` x ` g ` h ` i ` k ` l -v2AL` a ______c ` d ` e ` x ` g ` h ` i ` k ` l -v2Il` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -v2il` a ` b ` c `___` e ` x ` g ` h ` i ` k ` l -v2al` a ` b ` c _____ e ` x ` g ` h ` i ` k ` l -v2Al` a ` b ` c ______e ` x ` g ` h ` i ` k ` l -v2I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -v2i` a ` b ` c ` d ` e `___` g ` h ` i ` k ` l -v2a` a ` b ` c ` d ` e _____ g ` h ` i ` k ` l -v2A` a ` b ` c ` d ` e ______g ` h ` i ` k ` l -v2In` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -v2in` a ` b ` c ` d ` e ` x ` g `___` i ` k ` l -v2an` a ` b ` c ` d ` e ` x ` g _____ i ` k ` l -v2An` a ` b ` c ` d ` e ` x ` g ______i ` k ` l -v2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` _ ` l -v2iN` a ` b ` c ` d ` e ` x ` g ` h ` i `___` l -v2aN` a ` b ` c ` d ` e ` x ` g ` h ` i _____ l -v2AN` a ` b ` c ` d ` e ` x ` g ` h ` i ______l - -a , b , c , d , e , x , g , h , i , k , l -cIL, a , b , c , _ , e , x , g , h , i , k , l -ciL, a , b , c ,_, e , x , g , h , i , k , l -caL, a , b , c _, e , x , g , h , i , k , l -cAL, a , b , c _e , x , g , h , i , k , l -cIl, a , b , c , d , _ , x , g , h , i , k , l -cil, a , b , c , d ,_, x , g , h , i , k , l -cal, a , b , c , d _, x , g , h , i , k , l -cAl, a , b , c , d _x , g , h , i , k , l -cI, a , b , c , d , e , _ , g , h , i , k , l -ci, a , b , c , d , e ,_, g , h , i , k , l -ca, a , b , c , d , e _, g , h , i , k , l -cA, a , b , c , d , e _g , h , i , k , l -cIn, a , b , c , d , e , x , _ , h , i , k , l -cin, a , b , c , d , e , x ,_, h , i , k , l -can, a , b , c , d , e , x _, h , i , k , l -cAn, a , b , c , d , e , x _h , i , k , l -cIN, a , b , c , d , e , x , g , _ , i , k , l -ciN, a , b , c , d , e , x , g ,_, i , k , l -caN, a , b , c , d , e , x , g _, i , k , l -cAN, a , b , c , d , e , x , g _i , k , l -c1IL, a , b , c , _ , e , x , g , h , i , k , l -c1iL, a , b , c ,_, e , x , g , h , i , k , l -c1aL, a , b , c _, e , x , g , h , i , k , l -c1AL, a , b , c _e , x , g , h , i , k , l -c1Il, a , b , c , d , _ , x , g , h , i , k , l -c1il, a , b , c , d ,_, x , g , h , i , k , l -c1al, a , b , c , d _, x , g , h , i , k , l -c1Al, a , b , c , d _x , g , h , i , k , l -c1I, a , b , c , d , e , _ , g , h , i , k , l -c1i, a , b , c , d , e ,_, g , h , i , k , l -c1a, a , b , c , d , e _, g , h , i , k , l -c1A, a , b , c , d , e _g , h , i , k , l -c1In, a , b , c , d , e , x , _ , h , i , k , l -c1in, a , b , c , d , e , x ,_, h , i , k , l -c1an, a , b , c , d , e , x _, h , i , k , l -c1An, a , b , c , d , e , x _h , i , k , l -c1IN, a , b , c , d , e , x , g , _ , i , k , l -c1iN, a , b , c , d , e , x , g ,_, i , k , l -c1aN, a , b , c , d , e , x , g _, i , k , l -c1AN, a , b , c , d , e , x , g _i , k , l -c2IL, a , _ , c , d , e , x , g , h , i , k , l -c2iL, a ,_, c , d , e , x , g , h , i , k , l -c2aL, a _, c , d , e , x , g , h , i , k , l -c2AL, a _c , d , e , x , g , h , i , k , l -c2Il, a , b , c , _ , e , x , g , h , i , k , l -c2il, a , b , c ,_, e , x , g , h , i , k , l -c2al, a , b , c _, e , x , g , h , i , k , l -c2Al, a , b , c _e , x , g , h , i , k , l -c2I, a , b , c , d , e , _ , g , h , i , k , l -c2i, a , b , c , d , e ,_, g , h , i , k , l -c2a, a , b , c , d , e _, g , h , i , k , l -c2A, a , b , c , d , e _g , h , i , k , l -c2In, a , b , c , d , e , x , g , _ , i , k , l -c2in, a , b , c , d , e , x , g ,_, i , k , l -c2an, a , b , c , d , e , x , g _, i , k , l -c2An, a , b , c , d , e , x , g _i , k , l -c2IN, a , b , c , d , e , x , g , h , i , _ , l -c2iN, a , b , c , d , e , x , g , h , i ,_, l -c2aN, a , b , c , d , e , x , g , h , i _, l -c2AN, a , b , c , d , e , x , g , h , i _l -dIL, a , b , c , , e , x , g , h , i , k , l -diL, a , b , c ,, e , x , g , h , i , k , l -daL, a , b , c , e , x , g , h , i , k , l -dAL, a , b , c e , x , g , h , i , k , l -dIl, a , b , c , d , , x , g , h , i , k , l -dil, a , b , c , d ,, x , g , h , i , k , l -dal, a , b , c , d , x , g , h , i , k , l -dAl, a , b , c , d x , g , h , i , k , l -dI, a , b , c , d , e , , g , h , i , k , l -di, a , b , c , d , e ,, g , h , i , k , l -da, a , b , c , d , e , g , h , i , k , l -dA, a , b , c , d , e g , h , i , k , l -dIn, a , b , c , d , e , x , , h , i , k , l -din, a , b , c , d , e , x ,, h , i , k , l -dan, a , b , c , d , e , x , h , i , k , l -dAn, a , b , c , d , e , x h , i , k , l -dIN, a , b , c , d , e , x , g , , i , k , l -diN, a , b , c , d , e , x , g ,, i , k , l -daN, a , b , c , d , e , x , g , i , k , l -dAN, a , b , c , d , e , x , g i , k , l -d1IL, a , b , c , , e , x , g , h , i , k , l -d1iL, a , b , c ,, e , x , g , h , i , k , l -d1aL, a , b , c , e , x , g , h , i , k , l -d1AL, a , b , c e , x , g , h , i , k , l -d1Il, a , b , c , d , , x , g , h , i , k , l -d1il, a , b , c , d ,, x , g , h , i , k , l -d1al, a , b , c , d , x , g , h , i , k , l -d1Al, a , b , c , d x , g , h , i , k , l -d1I, a , b , c , d , e , , g , h , i , k , l -d1i, a , b , c , d , e ,, g , h , i , k , l -d1a, a , b , c , d , e , g , h , i , k , l -d1A, a , b , c , d , e g , h , i , k , l -d1In, a , b , c , d , e , x , , h , i , k , l -d1in, a , b , c , d , e , x ,, h , i , k , l -d1an, a , b , c , d , e , x , h , i , k , l -d1An, a , b , c , d , e , x h , i , k , l -d1IN, a , b , c , d , e , x , g , , i , k , l -d1iN, a , b , c , d , e , x , g ,, i , k , l -d1aN, a , b , c , d , e , x , g , i , k , l -d1AN, a , b , c , d , e , x , g i , k , l -d2IL, a , , c , d , e , x , g , h , i , k , l -d2iL, a ,, c , d , e , x , g , h , i , k , l -d2aL, a , c , d , e , x , g , h , i , k , l -d2AL, a c , d , e , x , g , h , i , k , l -d2Il, a , b , c , , e , x , g , h , i , k , l -d2il, a , b , c ,, e , x , g , h , i , k , l -d2al, a , b , c , e , x , g , h , i , k , l -d2Al, a , b , c e , x , g , h , i , k , l -d2I, a , b , c , d , e , , g , h , i , k , l -d2i, a , b , c , d , e ,, g , h , i , k , l -d2a, a , b , c , d , e , g , h , i , k , l -d2A, a , b , c , d , e g , h , i , k , l -d2In, a , b , c , d , e , x , g , , i , k , l -d2in, a , b , c , d , e , x , g ,, i , k , l -d2an, a , b , c , d , e , x , g , i , k , l -d2An, a , b , c , d , e , x , g i , k , l -d2IN, a , b , c , d , e , x , g , h , i , , l -d2iN, a , b , c , d , e , x , g , h , i ,, l -d2aN, a , b , c , d , e , x , g , h , i , l -d2AN, a , b , c , d , e , x , g , h , i l -yIL, a , b , c , d , e , x , g , h , i , k , l 'd' -yiL, a , b , c , d , e , x , g , h , i , k , l ' d ' -yaL, a , b , c , d , e , x , g , h , i , k , l ', d ' -yAL, a , b , c , d , e , x , g , h , i , k , l ', d , ' -yIl, a , b , c , d , e , x , g , h , i , k , l 'e' -yil, a , b , c , d , e , x , g , h , i , k , l ' e ' -yal, a , b , c , d , e , x , g , h , i , k , l ', e ' -yAl, a , b , c , d , e , x , g , h , i , k , l ', e , ' -yI, a , b , c , d , e , x , g , h , i , k , l 'x' -yi, a , b , c , d , e , x , g , h , i , k , l ' x ' -ya, a , b , c , d , e , x , g , h , i , k , l ', x ' -yA, a , b , c , d , e , x , g , h , i , k , l ', x , ' -yIn, a , b , c , d , e , x , g , h , i , k , l 'g' -yin, a , b , c , d , e , x , g , h , i , k , l ' g ' -yan, a , b , c , d , e , x , g , h , i , k , l ', g ' -yAn, a , b , c , d , e , x , g , h , i , k , l ', g , ' -yIN, a , b , c , d , e , x , g , h , i , k , l 'h' -yiN, a , b , c , d , e , x , g , h , i , k , l ' h ' -yaN, a , b , c , d , e , x , g , h , i , k , l ', h ' -yAN, a , b , c , d , e , x , g , h , i , k , l ', h , ' -y1IL, a , b , c , d , e , x , g , h , i , k , l 'd' -y1iL, a , b , c , d , e , x , g , h , i , k , l ' d ' -y1aL, a , b , c , d , e , x , g , h , i , k , l ', d ' -y1AL, a , b , c , d , e , x , g , h , i , k , l ', d , ' -y1Il, a , b , c , d , e , x , g , h , i , k , l 'e' -y1il, a , b , c , d , e , x , g , h , i , k , l ' e ' -y1al, a , b , c , d , e , x , g , h , i , k , l ', e ' -y1Al, a , b , c , d , e , x , g , h , i , k , l ', e , ' -y1I, a , b , c , d , e , x , g , h , i , k , l 'x' -y1i, a , b , c , d , e , x , g , h , i , k , l ' x ' -y1a, a , b , c , d , e , x , g , h , i , k , l ', x ' -y1A, a , b , c , d , e , x , g , h , i , k , l ', x , ' -y1In, a , b , c , d , e , x , g , h , i , k , l 'g' -y1in, a , b , c , d , e , x , g , h , i , k , l ' g ' -y1an, a , b , c , d , e , x , g , h , i , k , l ', g ' -y1An, a , b , c , d , e , x , g , h , i , k , l ', g , ' -y1IN, a , b , c , d , e , x , g , h , i , k , l 'h' -y1iN, a , b , c , d , e , x , g , h , i , k , l ' h ' -y1aN, a , b , c , d , e , x , g , h , i , k , l ', h ' -y1AN, a , b , c , d , e , x , g , h , i , k , l ', h , ' -y2IL, a , b , c , d , e , x , g , h , i , k , l 'b' -y2iL, a , b , c , d , e , x , g , h , i , k , l ' b ' -y2aL, a , b , c , d , e , x , g , h , i , k , l ', b ' -y2AL, a , b , c , d , e , x , g , h , i , k , l ', b , ' -y2Il, a , b , c , d , e , x , g , h , i , k , l 'd' -y2il, a , b , c , d , e , x , g , h , i , k , l ' d ' -y2al, a , b , c , d , e , x , g , h , i , k , l ', d ' -y2Al, a , b , c , d , e , x , g , h , i , k , l ', d , ' -y2I, a , b , c , d , e , x , g , h , i , k , l 'x' -y2i, a , b , c , d , e , x , g , h , i , k , l ' x ' -y2a, a , b , c , d , e , x , g , h , i , k , l ', x ' -y2A, a , b , c , d , e , x , g , h , i , k , l ', x , ' -y2In, a , b , c , d , e , x , g , h , i , k , l 'h' -y2in, a , b , c , d , e , x , g , h , i , k , l ' h ' -y2an, a , b , c , d , e , x , g , h , i , k , l ', h ' -y2An, a , b , c , d , e , x , g , h , i , k , l ', h , ' -y2IN, a , b , c , d , e , x , g , h , i , k , l 'k' -y2iN, a , b , c , d , e , x , g , h , i , k , l ' k ' -y2aN, a , b , c , d , e , x , g , h , i , k , l ', k ' -y2AN, a , b , c , d , e , x , g , h , i , k , l ', k , ' -vIL, a , b , c , _ , e , x , g , h , i , k , l -viL, a , b , c ,___, e , x , g , h , i , k , l -vaL, a , b , c ____, e , x , g , h , i , k , l -vAL, a , b , c ______e , x , g , h , i , k , l -vIl, a , b , c , d , _ , x , g , h , i , k , l -vil, a , b , c , d ,___, x , g , h , i , k , l -val, a , b , c , d ____, x , g , h , i , k , l -vAl, a , b , c , d ______x , g , h , i , k , l -vI, a , b , c , d , e , _ , g , h , i , k , l -vi, a , b , c , d , e ,___, g , h , i , k , l -va, a , b , c , d , e ____, g , h , i , k , l -vA, a , b , c , d , e ______g , h , i , k , l -vIn, a , b , c , d , e , x , _ , h , i , k , l -vin, a , b , c , d , e , x ,___, h , i , k , l -van, a , b , c , d , e , x ____, h , i , k , l -vAn, a , b , c , d , e , x ______h , i , k , l -vIN, a , b , c , d , e , x , g , _ , i , k , l -viN, a , b , c , d , e , x , g ,___, i , k , l -vaN, a , b , c , d , e , x , g ____, i , k , l -vAN, a , b , c , d , e , x , g ______i , k , l -v1IL, a , b , c , _ , e , x , g , h , i , k , l -v1iL, a , b , c ,___, e , x , g , h , i , k , l -v1aL, a , b , c ____, e , x , g , h , i , k , l -v1AL, a , b , c ______e , x , g , h , i , k , l -v1Il, a , b , c , d , _ , x , g , h , i , k , l -v1il, a , b , c , d ,___, x , g , h , i , k , l -v1al, a , b , c , d ____, x , g , h , i , k , l -v1Al, a , b , c , d ______x , g , h , i , k , l -v1I, a , b , c , d , e , _ , g , h , i , k , l -v1i, a , b , c , d , e ,___, g , h , i , k , l -v1a, a , b , c , d , e ____, g , h , i , k , l -v1A, a , b , c , d , e ______g , h , i , k , l -v1In, a , b , c , d , e , x , _ , h , i , k , l -v1in, a , b , c , d , e , x ,___, h , i , k , l -v1an, a , b , c , d , e , x ____, h , i , k , l -v1An, a , b , c , d , e , x ______h , i , k , l -v1IN, a , b , c , d , e , x , g , _ , i , k , l -v1iN, a , b , c , d , e , x , g ,___, i , k , l -v1aN, a , b , c , d , e , x , g ____, i , k , l -v1AN, a , b , c , d , e , x , g ______i , k , l -v2IL, a , _ , c , d , e , x , g , h , i , k , l -v2iL, a ,___, c , d , e , x , g , h , i , k , l -v2aL, a ____, c , d , e , x , g , h , i , k , l -v2AL, a ______c , d , e , x , g , h , i , k , l -v2Il, a , b , c , _ , e , x , g , h , i , k , l -v2il, a , b , c ,___, e , x , g , h , i , k , l -v2al, a , b , c ____, e , x , g , h , i , k , l -v2Al, a , b , c ______e , x , g , h , i , k , l -v2I, a , b , c , d , e , _ , g , h , i , k , l -v2i, a , b , c , d , e ,___, g , h , i , k , l -v2a, a , b , c , d , e ____, g , h , i , k , l -v2A, a , b , c , d , e ______g , h , i , k , l -v2In, a , b , c , d , e , x , g , _ , i , k , l -v2in, a , b , c , d , e , x , g ,___, i , k , l -v2an, a , b , c , d , e , x , g ____, i , k , l -v2An, a , b , c , d , e , x , g ______i , k , l -v2IN, a , b , c , d , e , x , g , h , i , _ , l -v2iN, a , b , c , d , e , x , g , h , i ,___, l -v2aN, a , b , c , d , e , x , g , h , i ____, l -v2AN, a , b , c , d , e , x , g , h , i ______l -a . b . c . d . e . x . g . h . i . k . l -cIL. a . b . c . _ . e . x . g . h . i . k . l -ciL. a . b . c ._. e . x . g . h . i . k . l -caL. a . b . c _. e . x . g . h . i . k . l -cAL. a . b . c _e . x . g . h . i . k . l -cIl. a . b . c . d . _ . x . g . h . i . k . l -cil. a . b . c . d ._. x . g . h . i . k . l -cal. a . b . c . d _. x . g . h . i . k . l -cAl. a . b . c . d _x . g . h . i . k . l -cI. a . b . c . d . e . _ . g . h . i . k . l -ci. a . b . c . d . e ._. g . h . i . k . l -ca. a . b . c . d . e _. g . h . i . k . l -cA. a . b . c . d . e _g . h . i . k . l -cIn. a . b . c . d . e . x . _ . h . i . k . l -cin. a . b . c . d . e . x ._. h . i . k . l -can. a . b . c . d . e . x _. h . i . k . l -cAn. a . b . c . d . e . x _h . i . k . l -cIN. a . b . c . d . e . x . g . _ . i . k . l -ciN. a . b . c . d . e . x . g ._. i . k . l -caN. a . b . c . d . e . x . g _. i . k . l -cAN. a . b . c . d . e . x . g _i . k . l -c1IL. a . b . c . _ . e . x . g . h . i . k . l -c1iL. a . b . c ._. e . x . g . h . i . k . l -c1aL. a . b . c _. e . x . g . h . i . k . l -c1AL. a . b . c _e . x . g . h . i . k . l -c1Il. a . b . c . d . _ . x . g . h . i . k . l -c1il. a . b . c . d ._. x . g . h . i . k . l -c1al. a . b . c . d _. x . g . h . i . k . l -c1Al. a . b . c . d _x . g . h . i . k . l -c1I. a . b . c . d . e . _ . g . h . i . k . l -c1i. a . b . c . d . e ._. g . h . i . k . l -c1a. a . b . c . d . e _. g . h . i . k . l -c1A. a . b . c . d . e _g . h . i . k . l -c1In. a . b . c . d . e . x . _ . h . i . k . l -c1in. a . b . c . d . e . x ._. h . i . k . l -c1an. a . b . c . d . e . x _. h . i . k . l -c1An. a . b . c . d . e . x _h . i . k . l -c1IN. a . b . c . d . e . x . g . _ . i . k . l -c1iN. a . b . c . d . e . x . g ._. i . k . l -c1aN. a . b . c . d . e . x . g _. i . k . l -c1AN. a . b . c . d . e . x . g _i . k . l -c2IL. a . _ . c . d . e . x . g . h . i . k . l -c2iL. a ._. c . d . e . x . g . h . i . k . l -c2aL. a _. c . d . e . x . g . h . i . k . l -c2AL. a _c . d . e . x . g . h . i . k . l -c2Il. a . b . c . _ . e . x . g . h . i . k . l -c2il. a . b . c ._. e . x . g . h . i . k . l -c2al. a . b . c _. e . x . g . h . i . k . l -c2Al. a . b . c _e . x . g . h . i . k . l -c2I. a . b . c . d . e . _ . g . h . i . k . l -c2i. a . b . c . d . e ._. g . h . i . k . l -c2a. a . b . c . d . e _. g . h . i . k . l -c2A. a . b . c . d . e _g . h . i . k . l -c2In. a . b . c . d . e . x . g . _ . i . k . l -c2in. a . b . c . d . e . x . g ._. i . k . l -c2an. a . b . c . d . e . x . g _. i . k . l -c2An. a . b . c . d . e . x . g _i . k . l -c2IN. a . b . c . d . e . x . g . h . i . _ . l -c2iN. a . b . c . d . e . x . g . h . i ._. l -c2aN. a . b . c . d . e . x . g . h . i _. l -c2AN. a . b . c . d . e . x . g . h . i _l -dIL. a . b . c . . e . x . g . h . i . k . l -diL. a . b . c .. e . x . g . h . i . k . l -daL. a . b . c . e . x . g . h . i . k . l -dAL. a . b . c e . x . g . h . i . k . l -dIl. a . b . c . d . . x . g . h . i . k . l -dil. a . b . c . d .. x . g . h . i . k . l -dal. a . b . c . d . x . g . h . i . k . l -dAl. a . b . c . d x . g . h . i . k . l -dI. a . b . c . d . e . . g . h . i . k . l -di. a . b . c . d . e .. g . h . i . k . l -da. a . b . c . d . e . g . h . i . k . l -dA. a . b . c . d . e g . h . i . k . l -dIn. a . b . c . d . e . x . . h . i . k . l -din. a . b . c . d . e . x .. h . i . k . l -dan. a . b . c . d . e . x . h . i . k . l -dAn. a . b . c . d . e . x h . i . k . l -dIN. a . b . c . d . e . x . g . . i . k . l -diN. a . b . c . d . e . x . g .. i . k . l -daN. a . b . c . d . e . x . g . i . k . l -dAN. a . b . c . d . e . x . g i . k . l -d1IL. a . b . c . . e . x . g . h . i . k . l -d1iL. a . b . c .. e . x . g . h . i . k . l -d1aL. a . b . c . e . x . g . h . i . k . l -d1AL. a . b . c e . x . g . h . i . k . l -d1Il. a . b . c . d . . x . g . h . i . k . l -d1il. a . b . c . d .. x . g . h . i . k . l -d1al. a . b . c . d . x . g . h . i . k . l -d1Al. a . b . c . d x . g . h . i . k . l -d1I. a . b . c . d . e . . g . h . i . k . l -d1i. a . b . c . d . e .. g . h . i . k . l -d1a. a . b . c . d . e . g . h . i . k . l -d1A. a . b . c . d . e g . h . i . k . l -d1In. a . b . c . d . e . x . . h . i . k . l -d1in. a . b . c . d . e . x .. h . i . k . l -d1an. a . b . c . d . e . x . h . i . k . l -d1An. a . b . c . d . e . x h . i . k . l -d1IN. a . b . c . d . e . x . g . . i . k . l -d1iN. a . b . c . d . e . x . g .. i . k . l -d1aN. a . b . c . d . e . x . g . i . k . l -d1AN. a . b . c . d . e . x . g i . k . l -d2IL. a . . c . d . e . x . g . h . i . k . l -d2iL. a .. c . d . e . x . g . h . i . k . l -d2aL. a . c . d . e . x . g . h . i . k . l -d2AL. a c . d . e . x . g . h . i . k . l -d2Il. a . b . c . . e . x . g . h . i . k . l -d2il. a . b . c .. e . x . g . h . i . k . l -d2al. a . b . c . e . x . g . h . i . k . l -d2Al. a . b . c e . x . g . h . i . k . l -d2I. a . b . c . d . e . . g . h . i . k . l -d2i. a . b . c . d . e .. g . h . i . k . l -d2a. a . b . c . d . e . g . h . i . k . l -d2A. a . b . c . d . e g . h . i . k . l -d2In. a . b . c . d . e . x . g . . i . k . l -d2in. a . b . c . d . e . x . g .. i . k . l -d2an. a . b . c . d . e . x . g . i . k . l -d2An. a . b . c . d . e . x . g i . k . l -d2IN. a . b . c . d . e . x . g . h . i . . l -d2iN. a . b . c . d . e . x . g . h . i .. l -d2aN. a . b . c . d . e . x . g . h . i . l -d2AN. a . b . c . d . e . x . g . h . i l -yIL. a . b . c . d . e . x . g . h . i . k . l 'd' -yiL. a . b . c . d . e . x . g . h . i . k . l ' d ' -yaL. a . b . c . d . e . x . g . h . i . k . l '. d ' -yAL. a . b . c . d . e . x . g . h . i . k . l '. d . ' -yIl. a . b . c . d . e . x . g . h . i . k . l 'e' -yil. a . b . c . d . e . x . g . h . i . k . l ' e ' -yal. a . b . c . d . e . x . g . h . i . k . l '. e ' -yAl. a . b . c . d . e . x . g . h . i . k . l '. e . ' -yI. a . b . c . d . e . x . g . h . i . k . l 'x' -yi. a . b . c . d . e . x . g . h . i . k . l ' x ' -ya. a . b . c . d . e . x . g . h . i . k . l '. x ' -yA. a . b . c . d . e . x . g . h . i . k . l '. x . ' -yIn. a . b . c . d . e . x . g . h . i . k . l 'g' -yin. a . b . c . d . e . x . g . h . i . k . l ' g ' -yan. a . b . c . d . e . x . g . h . i . k . l '. g ' -yAn. a . b . c . d . e . x . g . h . i . k . l '. g . ' -yIN. a . b . c . d . e . x . g . h . i . k . l 'h' -yiN. a . b . c . d . e . x . g . h . i . k . l ' h ' -yaN. a . b . c . d . e . x . g . h . i . k . l '. h ' -yAN. a . b . c . d . e . x . g . h . i . k . l '. h . ' -y1IL. a . b . c . d . e . x . g . h . i . k . l 'd' -y1iL. a . b . c . d . e . x . g . h . i . k . l ' d ' -y1aL. a . b . c . d . e . x . g . h . i . k . l '. d ' -y1AL. a . b . c . d . e . x . g . h . i . k . l '. d . ' -y1Il. a . b . c . d . e . x . g . h . i . k . l 'e' -y1il. a . b . c . d . e . x . g . h . i . k . l ' e ' -y1al. a . b . c . d . e . x . g . h . i . k . l '. e ' -y1Al. a . b . c . d . e . x . g . h . i . k . l '. e . ' -y1I. a . b . c . d . e . x . g . h . i . k . l 'x' -y1i. a . b . c . d . e . x . g . h . i . k . l ' x ' -y1a. a . b . c . d . e . x . g . h . i . k . l '. x ' -y1A. a . b . c . d . e . x . g . h . i . k . l '. x . ' -y1In. a . b . c . d . e . x . g . h . i . k . l 'g' -y1in. a . b . c . d . e . x . g . h . i . k . l ' g ' -y1an. a . b . c . d . e . x . g . h . i . k . l '. g ' -y1An. a . b . c . d . e . x . g . h . i . k . l '. g . ' -y1IN. a . b . c . d . e . x . g . h . i . k . l 'h' -y1iN. a . b . c . d . e . x . g . h . i . k . l ' h ' -y1aN. a . b . c . d . e . x . g . h . i . k . l '. h ' -y1AN. a . b . c . d . e . x . g . h . i . k . l '. h . ' -y2IL. a . b . c . d . e . x . g . h . i . k . l 'b' -y2iL. a . b . c . d . e . x . g . h . i . k . l ' b ' -y2aL. a . b . c . d . e . x . g . h . i . k . l '. b ' -y2AL. a . b . c . d . e . x . g . h . i . k . l '. b . ' -y2Il. a . b . c . d . e . x . g . h . i . k . l 'd' -y2il. a . b . c . d . e . x . g . h . i . k . l ' d ' -y2al. a . b . c . d . e . x . g . h . i . k . l '. d ' -y2Al. a . b . c . d . e . x . g . h . i . k . l '. d . ' -y2I. a . b . c . d . e . x . g . h . i . k . l 'x' -y2i. a . b . c . d . e . x . g . h . i . k . l ' x ' -y2a. a . b . c . d . e . x . g . h . i . k . l '. x ' -y2A. a . b . c . d . e . x . g . h . i . k . l '. x . ' -y2In. a . b . c . d . e . x . g . h . i . k . l 'h' -y2in. a . b . c . d . e . x . g . h . i . k . l ' h ' -y2an. a . b . c . d . e . x . g . h . i . k . l '. h ' -y2An. a . b . c . d . e . x . g . h . i . k . l '. h . ' -y2IN. a . b . c . d . e . x . g . h . i . k . l 'k' -y2iN. a . b . c . d . e . x . g . h . i . k . l ' k ' -y2aN. a . b . c . d . e . x . g . h . i . k . l '. k ' -y2AN. a . b . c . d . e . x . g . h . i . k . l '. k . ' -vIL. a . b . c . _ . e . x . g . h . i . k . l -viL. a . b . c .___. e . x . g . h . i . k . l -vaL. a . b . c ____. e . x . g . h . i . k . l -vAL. a . b . c ______e . x . g . h . i . k . l -vIl. a . b . c . d . _ . x . g . h . i . k . l -vil. a . b . c . d .___. x . g . h . i . k . l -val. a . b . c . d ____. x . g . h . i . k . l -vAl. a . b . c . d ______x . g . h . i . k . l -vI. a . b . c . d . e . _ . g . h . i . k . l -vi. a . b . c . d . e .___. g . h . i . k . l -va. a . b . c . d . e ____. g . h . i . k . l -vA. a . b . c . d . e ______g . h . i . k . l -vIn. a . b . c . d . e . x . _ . h . i . k . l -vin. a . b . c . d . e . x .___. h . i . k . l -van. a . b . c . d . e . x ____. h . i . k . l -vAn. a . b . c . d . e . x ______h . i . k . l -vIN. a . b . c . d . e . x . g . _ . i . k . l -viN. a . b . c . d . e . x . g .___. i . k . l -vaN. a . b . c . d . e . x . g ____. i . k . l -vAN. a . b . c . d . e . x . g ______i . k . l -v1IL. a . b . c . _ . e . x . g . h . i . k . l -v1iL. a . b . c .___. e . x . g . h . i . k . l -v1aL. a . b . c ____. e . x . g . h . i . k . l -v1AL. a . b . c ______e . x . g . h . i . k . l -v1Il. a . b . c . d . _ . x . g . h . i . k . l -v1il. a . b . c . d .___. x . g . h . i . k . l -v1al. a . b . c . d ____. x . g . h . i . k . l -v1Al. a . b . c . d ______x . g . h . i . k . l -v1I. a . b . c . d . e . _ . g . h . i . k . l -v1i. a . b . c . d . e .___. g . h . i . k . l -v1a. a . b . c . d . e ____. g . h . i . k . l -v1A. a . b . c . d . e ______g . h . i . k . l -v1In. a . b . c . d . e . x . _ . h . i . k . l -v1in. a . b . c . d . e . x .___. h . i . k . l -v1an. a . b . c . d . e . x ____. h . i . k . l -v1An. a . b . c . d . e . x ______h . i . k . l -v1IN. a . b . c . d . e . x . g . _ . i . k . l -v1iN. a . b . c . d . e . x . g .___. i . k . l -v1aN. a . b . c . d . e . x . g ____. i . k . l -v1AN. a . b . c . d . e . x . g ______i . k . l -v2IL. a . _ . c . d . e . x . g . h . i . k . l -v2iL. a .___. c . d . e . x . g . h . i . k . l -v2aL. a ____. c . d . e . x . g . h . i . k . l -v2AL. a ______c . d . e . x . g . h . i . k . l -v2Il. a . b . c . _ . e . x . g . h . i . k . l -v2il. a . b . c .___. e . x . g . h . i . k . l -v2al. a . b . c ____. e . x . g . h . i . k . l -v2Al. a . b . c ______e . x . g . h . i . k . l -v2I. a . b . c . d . e . _ . g . h . i . k . l -v2i. a . b . c . d . e .___. g . h . i . k . l -v2a. a . b . c . d . e ____. g . h . i . k . l -v2A. a . b . c . d . e ______g . h . i . k . l -v2In. a . b . c . d . e . x . g . _ . i . k . l -v2in. a . b . c . d . e . x . g .___. i . k . l -v2an. a . b . c . d . e . x . g ____. i . k . l -v2An. a . b . c . d . e . x . g ______i . k . l -v2IN. a . b . c . d . e . x . g . h . i . _ . l -v2iN. a . b . c . d . e . x . g . h . i .___. l -v2aN. a . b . c . d . e . x . g . h . i ____. l -v2AN. a . b . c . d . e . x . g . h . i ______l -a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l -cIL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -ciL; a ; b ; c ;_; e ; x ; g ; h ; i ; k ; l -caL; a ; b ; c _; e ; x ; g ; h ; i ; k ; l -cAL; a ; b ; c _e ; x ; g ; h ; i ; k ; l -cIl; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -cil; a ; b ; c ; d ;_; x ; g ; h ; i ; k ; l -cal; a ; b ; c ; d _; x ; g ; h ; i ; k ; l -cAl; a ; b ; c ; d _x ; g ; h ; i ; k ; l -cI; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -ci; a ; b ; c ; d ; e ;_; g ; h ; i ; k ; l -ca; a ; b ; c ; d ; e _; g ; h ; i ; k ; l -cA; a ; b ; c ; d ; e _g ; h ; i ; k ; l -cIn; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -cin; a ; b ; c ; d ; e ; x ;_; h ; i ; k ; l -can; a ; b ; c ; d ; e ; x _; h ; i ; k ; l -cAn; a ; b ; c ; d ; e ; x _h ; i ; k ; l -cIN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -ciN; a ; b ; c ; d ; e ; x ; g ;_; i ; k ; l -caN; a ; b ; c ; d ; e ; x ; g _; i ; k ; l -cAN; a ; b ; c ; d ; e ; x ; g _i ; k ; l -c1IL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -c1iL; a ; b ; c ;_; e ; x ; g ; h ; i ; k ; l -c1aL; a ; b ; c _; e ; x ; g ; h ; i ; k ; l -c1AL; a ; b ; c _e ; x ; g ; h ; i ; k ; l -c1Il; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -c1il; a ; b ; c ; d ;_; x ; g ; h ; i ; k ; l -c1al; a ; b ; c ; d _; x ; g ; h ; i ; k ; l -c1Al; a ; b ; c ; d _x ; g ; h ; i ; k ; l -c1I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -c1i; a ; b ; c ; d ; e ;_; g ; h ; i ; k ; l -c1a; a ; b ; c ; d ; e _; g ; h ; i ; k ; l -c1A; a ; b ; c ; d ; e _g ; h ; i ; k ; l -c1In; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -c1in; a ; b ; c ; d ; e ; x ;_; h ; i ; k ; l -c1an; a ; b ; c ; d ; e ; x _; h ; i ; k ; l -c1An; a ; b ; c ; d ; e ; x _h ; i ; k ; l -c1IN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -c1iN; a ; b ; c ; d ; e ; x ; g ;_; i ; k ; l -c1aN; a ; b ; c ; d ; e ; x ; g _; i ; k ; l -c1AN; a ; b ; c ; d ; e ; x ; g _i ; k ; l -c2IL; a ; _ ; c ; d ; e ; x ; g ; h ; i ; k ; l -c2iL; a ;_; c ; d ; e ; x ; g ; h ; i ; k ; l -c2aL; a _; c ; d ; e ; x ; g ; h ; i ; k ; l -c2AL; a _c ; d ; e ; x ; g ; h ; i ; k ; l -c2Il; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -c2il; a ; b ; c ;_; e ; x ; g ; h ; i ; k ; l -c2al; a ; b ; c _; e ; x ; g ; h ; i ; k ; l -c2Al; a ; b ; c _e ; x ; g ; h ; i ; k ; l -c2I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -c2i; a ; b ; c ; d ; e ;_; g ; h ; i ; k ; l -c2a; a ; b ; c ; d ; e _; g ; h ; i ; k ; l -c2A; a ; b ; c ; d ; e _g ; h ; i ; k ; l -c2In; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -c2in; a ; b ; c ; d ; e ; x ; g ;_; i ; k ; l -c2an; a ; b ; c ; d ; e ; x ; g _; i ; k ; l -c2An; a ; b ; c ; d ; e ; x ; g _i ; k ; l -c2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; _ ; l -c2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ;_; l -c2aN; a ; b ; c ; d ; e ; x ; g ; h ; i _; l -c2AN; a ; b ; c ; d ; e ; x ; g ; h ; i _l -dIL; a ; b ; c ; ; e ; x ; g ; h ; i ; k ; l -diL; a ; b ; c ;; e ; x ; g ; h ; i ; k ; l -daL; a ; b ; c ; e ; x ; g ; h ; i ; k ; l -dAL; a ; b ; c e ; x ; g ; h ; i ; k ; l -dIl; a ; b ; c ; d ; ; x ; g ; h ; i ; k ; l -dil; a ; b ; c ; d ;; x ; g ; h ; i ; k ; l -dal; a ; b ; c ; d ; x ; g ; h ; i ; k ; l -dAl; a ; b ; c ; d x ; g ; h ; i ; k ; l -dI; a ; b ; c ; d ; e ; ; g ; h ; i ; k ; l -di; a ; b ; c ; d ; e ;; g ; h ; i ; k ; l -da; a ; b ; c ; d ; e ; g ; h ; i ; k ; l -dA; a ; b ; c ; d ; e g ; h ; i ; k ; l -dIn; a ; b ; c ; d ; e ; x ; ; h ; i ; k ; l -din; a ; b ; c ; d ; e ; x ;; h ; i ; k ; l -dan; a ; b ; c ; d ; e ; x ; h ; i ; k ; l -dAn; a ; b ; c ; d ; e ; x h ; i ; k ; l -dIN; a ; b ; c ; d ; e ; x ; g ; ; i ; k ; l -diN; a ; b ; c ; d ; e ; x ; g ;; i ; k ; l -daN; a ; b ; c ; d ; e ; x ; g ; i ; k ; l -dAN; a ; b ; c ; d ; e ; x ; g i ; k ; l -d1IL; a ; b ; c ; ; e ; x ; g ; h ; i ; k ; l -d1iL; a ; b ; c ;; e ; x ; g ; h ; i ; k ; l -d1aL; a ; b ; c ; e ; x ; g ; h ; i ; k ; l -d1AL; a ; b ; c e ; x ; g ; h ; i ; k ; l -d1Il; a ; b ; c ; d ; ; x ; g ; h ; i ; k ; l -d1il; a ; b ; c ; d ;; x ; g ; h ; i ; k ; l -d1al; a ; b ; c ; d ; x ; g ; h ; i ; k ; l -d1Al; a ; b ; c ; d x ; g ; h ; i ; k ; l -d1I; a ; b ; c ; d ; e ; ; g ; h ; i ; k ; l -d1i; a ; b ; c ; d ; e ;; g ; h ; i ; k ; l -d1a; a ; b ; c ; d ; e ; g ; h ; i ; k ; l -d1A; a ; b ; c ; d ; e g ; h ; i ; k ; l -d1In; a ; b ; c ; d ; e ; x ; ; h ; i ; k ; l -d1in; a ; b ; c ; d ; e ; x ;; h ; i ; k ; l -d1an; a ; b ; c ; d ; e ; x ; h ; i ; k ; l -d1An; a ; b ; c ; d ; e ; x h ; i ; k ; l -d1IN; a ; b ; c ; d ; e ; x ; g ; ; i ; k ; l -d1iN; a ; b ; c ; d ; e ; x ; g ;; i ; k ; l -d1aN; a ; b ; c ; d ; e ; x ; g ; i ; k ; l -d1AN; a ; b ; c ; d ; e ; x ; g i ; k ; l -d2IL; a ; ; c ; d ; e ; x ; g ; h ; i ; k ; l -d2iL; a ;; c ; d ; e ; x ; g ; h ; i ; k ; l -d2aL; a ; c ; d ; e ; x ; g ; h ; i ; k ; l -d2AL; a c ; d ; e ; x ; g ; h ; i ; k ; l -d2Il; a ; b ; c ; ; e ; x ; g ; h ; i ; k ; l -d2il; a ; b ; c ;; e ; x ; g ; h ; i ; k ; l -d2al; a ; b ; c ; e ; x ; g ; h ; i ; k ; l -d2Al; a ; b ; c e ; x ; g ; h ; i ; k ; l -d2I; a ; b ; c ; d ; e ; ; g ; h ; i ; k ; l -d2i; a ; b ; c ; d ; e ;; g ; h ; i ; k ; l -d2a; a ; b ; c ; d ; e ; g ; h ; i ; k ; l -d2A; a ; b ; c ; d ; e g ; h ; i ; k ; l -d2In; a ; b ; c ; d ; e ; x ; g ; ; i ; k ; l -d2in; a ; b ; c ; d ; e ; x ; g ;; i ; k ; l -d2an; a ; b ; c ; d ; e ; x ; g ; i ; k ; l -d2An; a ; b ; c ; d ; e ; x ; g i ; k ; l -d2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; ; l -d2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ;; l -d2aN; a ; b ; c ; d ; e ; x ; g ; h ; i ; l -d2AN; a ; b ; c ; d ; e ; x ; g ; h ; i l -yIL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'd' -yiL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' d ' -yaL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ' -yAL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ; ' -yIl; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'e' -yil; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' e ' -yal; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ' -yAl; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ; ' -yI; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'x' -yi; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' x ' -ya; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ' -yA; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ; ' -yIn; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'g' -yin; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' g ' -yan; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ' -yAn; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ; ' -yIN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'h' -yiN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' h ' -yaN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ' -yAN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ; ' -y1IL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'd' -y1iL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' d ' -y1aL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ' -y1AL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ; ' -y1Il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'e' -y1il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' e ' -y1al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ' -y1Al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ; ' -y1I; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'x' -y1i; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' x ' -y1a; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ' -y1A; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ; ' -y1In; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'g' -y1in; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' g ' -y1an; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ' -y1An; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ; ' -y1IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'h' -y1iN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' h ' -y1aN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ' -y1AN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ; ' -y2IL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'b' -y2iL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' b ' -y2aL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; b ' -y2AL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; b ; ' -y2Il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'd' -y2il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' d ' -y2al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ' -y2Al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ; ' -y2I; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'x' -y2i; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' x ' -y2a; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ' -y2A; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ; ' -y2In; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'h' -y2in; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' h ' -y2an; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ' -y2An; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ; ' -y2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'k' -y2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' k ' -y2aN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; k ' -y2AN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; k ; ' -vIL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -viL; a ; b ; c ;___; e ; x ; g ; h ; i ; k ; l -vaL; a ; b ; c ____; e ; x ; g ; h ; i ; k ; l -vAL; a ; b ; c ______e ; x ; g ; h ; i ; k ; l -vIl; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -vil; a ; b ; c ; d ;___; x ; g ; h ; i ; k ; l -val; a ; b ; c ; d ____; x ; g ; h ; i ; k ; l -vAl; a ; b ; c ; d ______x ; g ; h ; i ; k ; l -vI; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -vi; a ; b ; c ; d ; e ;___; g ; h ; i ; k ; l -va; a ; b ; c ; d ; e ____; g ; h ; i ; k ; l -vA; a ; b ; c ; d ; e ______g ; h ; i ; k ; l -vIn; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -vin; a ; b ; c ; d ; e ; x ;___; h ; i ; k ; l -van; a ; b ; c ; d ; e ; x ____; h ; i ; k ; l -vAn; a ; b ; c ; d ; e ; x ______h ; i ; k ; l -vIN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -viN; a ; b ; c ; d ; e ; x ; g ;___; i ; k ; l -vaN; a ; b ; c ; d ; e ; x ; g ____; i ; k ; l -vAN; a ; b ; c ; d ; e ; x ; g ______i ; k ; l -v1IL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -v1iL; a ; b ; c ;___; e ; x ; g ; h ; i ; k ; l -v1aL; a ; b ; c ____; e ; x ; g ; h ; i ; k ; l -v1AL; a ; b ; c ______e ; x ; g ; h ; i ; k ; l -v1Il; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -v1il; a ; b ; c ; d ;___; x ; g ; h ; i ; k ; l -v1al; a ; b ; c ; d ____; x ; g ; h ; i ; k ; l -v1Al; a ; b ; c ; d ______x ; g ; h ; i ; k ; l -v1I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -v1i; a ; b ; c ; d ; e ;___; g ; h ; i ; k ; l -v1a; a ; b ; c ; d ; e ____; g ; h ; i ; k ; l -v1A; a ; b ; c ; d ; e ______g ; h ; i ; k ; l -v1In; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -v1in; a ; b ; c ; d ; e ; x ;___; h ; i ; k ; l -v1an; a ; b ; c ; d ; e ; x ____; h ; i ; k ; l -v1An; a ; b ; c ; d ; e ; x ______h ; i ; k ; l -v1IN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -v1iN; a ; b ; c ; d ; e ; x ; g ;___; i ; k ; l -v1aN; a ; b ; c ; d ; e ; x ; g ____; i ; k ; l -v1AN; a ; b ; c ; d ; e ; x ; g ______i ; k ; l -v2IL; a ; _ ; c ; d ; e ; x ; g ; h ; i ; k ; l -v2iL; a ;___; c ; d ; e ; x ; g ; h ; i ; k ; l -v2aL; a ____; c ; d ; e ; x ; g ; h ; i ; k ; l -v2AL; a ______c ; d ; e ; x ; g ; h ; i ; k ; l -v2Il; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -v2il; a ; b ; c ;___; e ; x ; g ; h ; i ; k ; l -v2al; a ; b ; c ____; e ; x ; g ; h ; i ; k ; l -v2Al; a ; b ; c ______e ; x ; g ; h ; i ; k ; l -v2I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -v2i; a ; b ; c ; d ; e ;___; g ; h ; i ; k ; l -v2a; a ; b ; c ; d ; e ____; g ; h ; i ; k ; l -v2A; a ; b ; c ; d ; e ______g ; h ; i ; k ; l -v2In; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -v2in; a ; b ; c ; d ; e ; x ; g ;___; i ; k ; l -v2an; a ; b ; c ; d ; e ; x ; g ____; i ; k ; l -v2An; a ; b ; c ; d ; e ; x ; g ______i ; k ; l -v2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; _ ; l -v2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ;___; l -v2aN; a ; b ; c ; d ; e ; x ; g ; h ; i ____; l -v2AN; a ; b ; c ; d ; e ; x ; g ; h ; i ______l -a : b : c : d : e : x : g : h : i : k : l -cIL: a : b : c : _ : e : x : g : h : i : k : l -ciL: a : b : c :_: e : x : g : h : i : k : l -caL: a : b : c _: e : x : g : h : i : k : l -cAL: a : b : c _e : x : g : h : i : k : l -cIl: a : b : c : d : _ : x : g : h : i : k : l -cil: a : b : c : d :_: x : g : h : i : k : l -cal: a : b : c : d _: x : g : h : i : k : l -cAl: a : b : c : d _x : g : h : i : k : l -cI: a : b : c : d : e : _ : g : h : i : k : l -ci: a : b : c : d : e :_: g : h : i : k : l -ca: a : b : c : d : e _: g : h : i : k : l -cA: a : b : c : d : e _g : h : i : k : l -cIn: a : b : c : d : e : x : _ : h : i : k : l -cin: a : b : c : d : e : x :_: h : i : k : l -can: a : b : c : d : e : x _: h : i : k : l -cAn: a : b : c : d : e : x _h : i : k : l -cIN: a : b : c : d : e : x : g : _ : i : k : l -ciN: a : b : c : d : e : x : g :_: i : k : l -caN: a : b : c : d : e : x : g _: i : k : l -cAN: a : b : c : d : e : x : g _i : k : l -c1IL: a : b : c : _ : e : x : g : h : i : k : l -c1iL: a : b : c :_: e : x : g : h : i : k : l -c1aL: a : b : c _: e : x : g : h : i : k : l -c1AL: a : b : c _e : x : g : h : i : k : l -c1Il: a : b : c : d : _ : x : g : h : i : k : l -c1il: a : b : c : d :_: x : g : h : i : k : l -c1al: a : b : c : d _: x : g : h : i : k : l -c1Al: a : b : c : d _x : g : h : i : k : l -c1I: a : b : c : d : e : _ : g : h : i : k : l -c1i: a : b : c : d : e :_: g : h : i : k : l -c1a: a : b : c : d : e _: g : h : i : k : l -c1A: a : b : c : d : e _g : h : i : k : l -c1In: a : b : c : d : e : x : _ : h : i : k : l -c1in: a : b : c : d : e : x :_: h : i : k : l -c1an: a : b : c : d : e : x _: h : i : k : l -c1An: a : b : c : d : e : x _h : i : k : l -c1IN: a : b : c : d : e : x : g : _ : i : k : l -c1iN: a : b : c : d : e : x : g :_: i : k : l -c1aN: a : b : c : d : e : x : g _: i : k : l -c1AN: a : b : c : d : e : x : g _i : k : l -c2IL: a : _ : c : d : e : x : g : h : i : k : l -c2iL: a :_: c : d : e : x : g : h : i : k : l -c2aL: a _: c : d : e : x : g : h : i : k : l -c2AL: a _c : d : e : x : g : h : i : k : l -c2Il: a : b : c : _ : e : x : g : h : i : k : l -c2il: a : b : c :_: e : x : g : h : i : k : l -c2al: a : b : c _: e : x : g : h : i : k : l -c2Al: a : b : c _e : x : g : h : i : k : l -c2I: a : b : c : d : e : _ : g : h : i : k : l -c2i: a : b : c : d : e :_: g : h : i : k : l -c2a: a : b : c : d : e _: g : h : i : k : l -c2A: a : b : c : d : e _g : h : i : k : l -c2In: a : b : c : d : e : x : g : _ : i : k : l -c2in: a : b : c : d : e : x : g :_: i : k : l -c2an: a : b : c : d : e : x : g _: i : k : l -c2An: a : b : c : d : e : x : g _i : k : l -c2IN: a : b : c : d : e : x : g : h : i : _ : l -c2iN: a : b : c : d : e : x : g : h : i :_: l -c2aN: a : b : c : d : e : x : g : h : i _: l -c2AN: a : b : c : d : e : x : g : h : i _l -dIL: a : b : c : : e : x : g : h : i : k : l -diL: a : b : c :: e : x : g : h : i : k : l -daL: a : b : c : e : x : g : h : i : k : l -dAL: a : b : c e : x : g : h : i : k : l -dIl: a : b : c : d : : x : g : h : i : k : l -dil: a : b : c : d :: x : g : h : i : k : l -dal: a : b : c : d : x : g : h : i : k : l -dAl: a : b : c : d x : g : h : i : k : l -dI: a : b : c : d : e : : g : h : i : k : l -di: a : b : c : d : e :: g : h : i : k : l -da: a : b : c : d : e : g : h : i : k : l -dA: a : b : c : d : e g : h : i : k : l -dIn: a : b : c : d : e : x : : h : i : k : l -din: a : b : c : d : e : x :: h : i : k : l -dan: a : b : c : d : e : x : h : i : k : l -dAn: a : b : c : d : e : x h : i : k : l -dIN: a : b : c : d : e : x : g : : i : k : l -diN: a : b : c : d : e : x : g :: i : k : l -daN: a : b : c : d : e : x : g : i : k : l -dAN: a : b : c : d : e : x : g i : k : l -d1IL: a : b : c : : e : x : g : h : i : k : l -d1iL: a : b : c :: e : x : g : h : i : k : l -d1aL: a : b : c : e : x : g : h : i : k : l -d1AL: a : b : c e : x : g : h : i : k : l -d1Il: a : b : c : d : : x : g : h : i : k : l -d1il: a : b : c : d :: x : g : h : i : k : l -d1al: a : b : c : d : x : g : h : i : k : l -d1Al: a : b : c : d x : g : h : i : k : l -d1I: a : b : c : d : e : : g : h : i : k : l -d1i: a : b : c : d : e :: g : h : i : k : l -d1a: a : b : c : d : e : g : h : i : k : l -d1A: a : b : c : d : e g : h : i : k : l -d1In: a : b : c : d : e : x : : h : i : k : l -d1in: a : b : c : d : e : x :: h : i : k : l -d1an: a : b : c : d : e : x : h : i : k : l -d1An: a : b : c : d : e : x h : i : k : l -d1IN: a : b : c : d : e : x : g : : i : k : l -d1iN: a : b : c : d : e : x : g :: i : k : l -d1aN: a : b : c : d : e : x : g : i : k : l -d1AN: a : b : c : d : e : x : g i : k : l -d2IL: a : : c : d : e : x : g : h : i : k : l -d2iL: a :: c : d : e : x : g : h : i : k : l -d2aL: a : c : d : e : x : g : h : i : k : l -d2AL: a c : d : e : x : g : h : i : k : l -d2Il: a : b : c : : e : x : g : h : i : k : l -d2il: a : b : c :: e : x : g : h : i : k : l -d2al: a : b : c : e : x : g : h : i : k : l -d2Al: a : b : c e : x : g : h : i : k : l -d2I: a : b : c : d : e : : g : h : i : k : l -d2i: a : b : c : d : e :: g : h : i : k : l -d2a: a : b : c : d : e : g : h : i : k : l -d2A: a : b : c : d : e g : h : i : k : l -d2In: a : b : c : d : e : x : g : : i : k : l -d2in: a : b : c : d : e : x : g :: i : k : l -d2an: a : b : c : d : e : x : g : i : k : l -d2An: a : b : c : d : e : x : g i : k : l -d2IN: a : b : c : d : e : x : g : h : i : : l -d2iN: a : b : c : d : e : x : g : h : i :: l -d2aN: a : b : c : d : e : x : g : h : i : l -d2AN: a : b : c : d : e : x : g : h : i l -yIL: a : b : c : d : e : x : g : h : i : k : l 'd' -yiL: a : b : c : d : e : x : g : h : i : k : l ' d ' -yaL: a : b : c : d : e : x : g : h : i : k : l ': d ' -yAL: a : b : c : d : e : x : g : h : i : k : l ': d : ' -yIl: a : b : c : d : e : x : g : h : i : k : l 'e' -yil: a : b : c : d : e : x : g : h : i : k : l ' e ' -yal: a : b : c : d : e : x : g : h : i : k : l ': e ' -yAl: a : b : c : d : e : x : g : h : i : k : l ': e : ' -yI: a : b : c : d : e : x : g : h : i : k : l 'x' -yi: a : b : c : d : e : x : g : h : i : k : l ' x ' -ya: a : b : c : d : e : x : g : h : i : k : l ': x ' -yA: a : b : c : d : e : x : g : h : i : k : l ': x : ' -yIn: a : b : c : d : e : x : g : h : i : k : l 'g' -yin: a : b : c : d : e : x : g : h : i : k : l ' g ' -yan: a : b : c : d : e : x : g : h : i : k : l ': g ' -yAn: a : b : c : d : e : x : g : h : i : k : l ': g : ' -yIN: a : b : c : d : e : x : g : h : i : k : l 'h' -yiN: a : b : c : d : e : x : g : h : i : k : l ' h ' -yaN: a : b : c : d : e : x : g : h : i : k : l ': h ' -yAN: a : b : c : d : e : x : g : h : i : k : l ': h : ' -y1IL: a : b : c : d : e : x : g : h : i : k : l 'd' -y1iL: a : b : c : d : e : x : g : h : i : k : l ' d ' -y1aL: a : b : c : d : e : x : g : h : i : k : l ': d ' -y1AL: a : b : c : d : e : x : g : h : i : k : l ': d : ' -y1Il: a : b : c : d : e : x : g : h : i : k : l 'e' -y1il: a : b : c : d : e : x : g : h : i : k : l ' e ' -y1al: a : b : c : d : e : x : g : h : i : k : l ': e ' -y1Al: a : b : c : d : e : x : g : h : i : k : l ': e : ' -y1I: a : b : c : d : e : x : g : h : i : k : l 'x' -y1i: a : b : c : d : e : x : g : h : i : k : l ' x ' -y1a: a : b : c : d : e : x : g : h : i : k : l ': x ' -y1A: a : b : c : d : e : x : g : h : i : k : l ': x : ' -y1In: a : b : c : d : e : x : g : h : i : k : l 'g' -y1in: a : b : c : d : e : x : g : h : i : k : l ' g ' -y1an: a : b : c : d : e : x : g : h : i : k : l ': g ' -y1An: a : b : c : d : e : x : g : h : i : k : l ': g : ' -y1IN: a : b : c : d : e : x : g : h : i : k : l 'h' -y1iN: a : b : c : d : e : x : g : h : i : k : l ' h ' -y1aN: a : b : c : d : e : x : g : h : i : k : l ': h ' -y1AN: a : b : c : d : e : x : g : h : i : k : l ': h : ' -y2IL: a : b : c : d : e : x : g : h : i : k : l 'b' -y2iL: a : b : c : d : e : x : g : h : i : k : l ' b ' -y2aL: a : b : c : d : e : x : g : h : i : k : l ': b ' -y2AL: a : b : c : d : e : x : g : h : i : k : l ': b : ' -y2Il: a : b : c : d : e : x : g : h : i : k : l 'd' -y2il: a : b : c : d : e : x : g : h : i : k : l ' d ' -y2al: a : b : c : d : e : x : g : h : i : k : l ': d ' -y2Al: a : b : c : d : e : x : g : h : i : k : l ': d : ' -y2I: a : b : c : d : e : x : g : h : i : k : l 'x' -y2i: a : b : c : d : e : x : g : h : i : k : l ' x ' -y2a: a : b : c : d : e : x : g : h : i : k : l ': x ' -y2A: a : b : c : d : e : x : g : h : i : k : l ': x : ' -y2In: a : b : c : d : e : x : g : h : i : k : l 'h' -y2in: a : b : c : d : e : x : g : h : i : k : l ' h ' -y2an: a : b : c : d : e : x : g : h : i : k : l ': h ' -y2An: a : b : c : d : e : x : g : h : i : k : l ': h : ' -y2IN: a : b : c : d : e : x : g : h : i : k : l 'k' -y2iN: a : b : c : d : e : x : g : h : i : k : l ' k ' -y2aN: a : b : c : d : e : x : g : h : i : k : l ': k ' -y2AN: a : b : c : d : e : x : g : h : i : k : l ': k : ' -vIL: a : b : c : _ : e : x : g : h : i : k : l -viL: a : b : c :___: e : x : g : h : i : k : l -vaL: a : b : c ____: e : x : g : h : i : k : l -vAL: a : b : c ______e : x : g : h : i : k : l -vIl: a : b : c : d : _ : x : g : h : i : k : l -vil: a : b : c : d :___: x : g : h : i : k : l -val: a : b : c : d ____: x : g : h : i : k : l -vAl: a : b : c : d ______x : g : h : i : k : l -vI: a : b : c : d : e : _ : g : h : i : k : l -vi: a : b : c : d : e :___: g : h : i : k : l -va: a : b : c : d : e ____: g : h : i : k : l -vA: a : b : c : d : e ______g : h : i : k : l -vIn: a : b : c : d : e : x : _ : h : i : k : l -vin: a : b : c : d : e : x :___: h : i : k : l -van: a : b : c : d : e : x ____: h : i : k : l -vAn: a : b : c : d : e : x ______h : i : k : l -vIN: a : b : c : d : e : x : g : _ : i : k : l -viN: a : b : c : d : e : x : g :___: i : k : l -vaN: a : b : c : d : e : x : g ____: i : k : l -vAN: a : b : c : d : e : x : g ______i : k : l -v1IL: a : b : c : _ : e : x : g : h : i : k : l -v1iL: a : b : c :___: e : x : g : h : i : k : l -v1aL: a : b : c ____: e : x : g : h : i : k : l -v1AL: a : b : c ______e : x : g : h : i : k : l -v1Il: a : b : c : d : _ : x : g : h : i : k : l -v1il: a : b : c : d :___: x : g : h : i : k : l -v1al: a : b : c : d ____: x : g : h : i : k : l -v1Al: a : b : c : d ______x : g : h : i : k : l -v1I: a : b : c : d : e : _ : g : h : i : k : l -v1i: a : b : c : d : e :___: g : h : i : k : l -v1a: a : b : c : d : e ____: g : h : i : k : l -v1A: a : b : c : d : e ______g : h : i : k : l -v1In: a : b : c : d : e : x : _ : h : i : k : l -v1in: a : b : c : d : e : x :___: h : i : k : l -v1an: a : b : c : d : e : x ____: h : i : k : l -v1An: a : b : c : d : e : x ______h : i : k : l -v1IN: a : b : c : d : e : x : g : _ : i : k : l -v1iN: a : b : c : d : e : x : g :___: i : k : l -v1aN: a : b : c : d : e : x : g ____: i : k : l -v1AN: a : b : c : d : e : x : g ______i : k : l -v2IL: a : _ : c : d : e : x : g : h : i : k : l -v2iL: a :___: c : d : e : x : g : h : i : k : l -v2aL: a ____: c : d : e : x : g : h : i : k : l -v2AL: a ______c : d : e : x : g : h : i : k : l -v2Il: a : b : c : _ : e : x : g : h : i : k : l -v2il: a : b : c :___: e : x : g : h : i : k : l -v2al: a : b : c ____: e : x : g : h : i : k : l -v2Al: a : b : c ______e : x : g : h : i : k : l -v2I: a : b : c : d : e : _ : g : h : i : k : l -v2i: a : b : c : d : e :___: g : h : i : k : l -v2a: a : b : c : d : e ____: g : h : i : k : l -v2A: a : b : c : d : e ______g : h : i : k : l -v2In: a : b : c : d : e : x : g : _ : i : k : l -v2in: a : b : c : d : e : x : g :___: i : k : l -v2an: a : b : c : d : e : x : g ____: i : k : l -v2An: a : b : c : d : e : x : g ______i : k : l -v2IN: a : b : c : d : e : x : g : h : i : _ : l -v2iN: a : b : c : d : e : x : g : h : i :___: l -v2aN: a : b : c : d : e : x : g : h : i ____: l -v2AN: a : b : c : d : e : x : g : h : i ______l -a + b + c + d + e + x + g + h + i + k + l -cIL+ a + b + c + _ + e + x + g + h + i + k + l -ciL+ a + b + c +_+ e + x + g + h + i + k + l -caL+ a + b + c _+ e + x + g + h + i + k + l -cAL+ a + b + c _e + x + g + h + i + k + l -cIl+ a + b + c + d + _ + x + g + h + i + k + l -cil+ a + b + c + d +_+ x + g + h + i + k + l -cal+ a + b + c + d _+ x + g + h + i + k + l -cAl+ a + b + c + d _x + g + h + i + k + l -cI+ a + b + c + d + e + _ + g + h + i + k + l -ci+ a + b + c + d + e +_+ g + h + i + k + l -ca+ a + b + c + d + e _+ g + h + i + k + l -cA+ a + b + c + d + e _g + h + i + k + l -cIn+ a + b + c + d + e + x + _ + h + i + k + l -cin+ a + b + c + d + e + x +_+ h + i + k + l -can+ a + b + c + d + e + x _+ h + i + k + l -cAn+ a + b + c + d + e + x _h + i + k + l -cIN+ a + b + c + d + e + x + g + _ + i + k + l -ciN+ a + b + c + d + e + x + g +_+ i + k + l -caN+ a + b + c + d + e + x + g _+ i + k + l -cAN+ a + b + c + d + e + x + g _i + k + l -c1IL+ a + b + c + _ + e + x + g + h + i + k + l -c1iL+ a + b + c +_+ e + x + g + h + i + k + l -c1aL+ a + b + c _+ e + x + g + h + i + k + l -c1AL+ a + b + c _e + x + g + h + i + k + l -c1Il+ a + b + c + d + _ + x + g + h + i + k + l -c1il+ a + b + c + d +_+ x + g + h + i + k + l -c1al+ a + b + c + d _+ x + g + h + i + k + l -c1Al+ a + b + c + d _x + g + h + i + k + l -c1I+ a + b + c + d + e + _ + g + h + i + k + l -c1i+ a + b + c + d + e +_+ g + h + i + k + l -c1a+ a + b + c + d + e _+ g + h + i + k + l -c1A+ a + b + c + d + e _g + h + i + k + l -c1In+ a + b + c + d + e + x + _ + h + i + k + l -c1in+ a + b + c + d + e + x +_+ h + i + k + l -c1an+ a + b + c + d + e + x _+ h + i + k + l -c1An+ a + b + c + d + e + x _h + i + k + l -c1IN+ a + b + c + d + e + x + g + _ + i + k + l -c1iN+ a + b + c + d + e + x + g +_+ i + k + l -c1aN+ a + b + c + d + e + x + g _+ i + k + l -c1AN+ a + b + c + d + e + x + g _i + k + l -c2IL+ a + _ + c + d + e + x + g + h + i + k + l -c2iL+ a +_+ c + d + e + x + g + h + i + k + l -c2aL+ a _+ c + d + e + x + g + h + i + k + l -c2AL+ a _c + d + e + x + g + h + i + k + l -c2Il+ a + b + c + _ + e + x + g + h + i + k + l -c2il+ a + b + c +_+ e + x + g + h + i + k + l -c2al+ a + b + c _+ e + x + g + h + i + k + l -c2Al+ a + b + c _e + x + g + h + i + k + l -c2I+ a + b + c + d + e + _ + g + h + i + k + l -c2i+ a + b + c + d + e +_+ g + h + i + k + l -c2a+ a + b + c + d + e _+ g + h + i + k + l -c2A+ a + b + c + d + e _g + h + i + k + l -c2In+ a + b + c + d + e + x + g + _ + i + k + l -c2in+ a + b + c + d + e + x + g +_+ i + k + l -c2an+ a + b + c + d + e + x + g _+ i + k + l -c2An+ a + b + c + d + e + x + g _i + k + l -c2IN+ a + b + c + d + e + x + g + h + i + _ + l -c2iN+ a + b + c + d + e + x + g + h + i +_+ l -c2aN+ a + b + c + d + e + x + g + h + i _+ l -c2AN+ a + b + c + d + e + x + g + h + i _l -dIL+ a + b + c + + e + x + g + h + i + k + l -diL+ a + b + c ++ e + x + g + h + i + k + l -daL+ a + b + c + e + x + g + h + i + k + l -dAL+ a + b + c e + x + g + h + i + k + l -dIl+ a + b + c + d + + x + g + h + i + k + l -dil+ a + b + c + d ++ x + g + h + i + k + l -dal+ a + b + c + d + x + g + h + i + k + l -dAl+ a + b + c + d x + g + h + i + k + l -dI+ a + b + c + d + e + + g + h + i + k + l -di+ a + b + c + d + e ++ g + h + i + k + l -da+ a + b + c + d + e + g + h + i + k + l -dA+ a + b + c + d + e g + h + i + k + l -dIn+ a + b + c + d + e + x + + h + i + k + l -din+ a + b + c + d + e + x ++ h + i + k + l -dan+ a + b + c + d + e + x + h + i + k + l -dAn+ a + b + c + d + e + x h + i + k + l -dIN+ a + b + c + d + e + x + g + + i + k + l -diN+ a + b + c + d + e + x + g ++ i + k + l -daN+ a + b + c + d + e + x + g + i + k + l -dAN+ a + b + c + d + e + x + g i + k + l -d1IL+ a + b + c + + e + x + g + h + i + k + l -d1iL+ a + b + c ++ e + x + g + h + i + k + l -d1aL+ a + b + c + e + x + g + h + i + k + l -d1AL+ a + b + c e + x + g + h + i + k + l -d1Il+ a + b + c + d + + x + g + h + i + k + l -d1il+ a + b + c + d ++ x + g + h + i + k + l -d1al+ a + b + c + d + x + g + h + i + k + l -d1Al+ a + b + c + d x + g + h + i + k + l -d1I+ a + b + c + d + e + + g + h + i + k + l -d1i+ a + b + c + d + e ++ g + h + i + k + l -d1a+ a + b + c + d + e + g + h + i + k + l -d1A+ a + b + c + d + e g + h + i + k + l -d1In+ a + b + c + d + e + x + + h + i + k + l -d1in+ a + b + c + d + e + x ++ h + i + k + l -d1an+ a + b + c + d + e + x + h + i + k + l -d1An+ a + b + c + d + e + x h + i + k + l -d1IN+ a + b + c + d + e + x + g + + i + k + l -d1iN+ a + b + c + d + e + x + g ++ i + k + l -d1aN+ a + b + c + d + e + x + g + i + k + l -d1AN+ a + b + c + d + e + x + g i + k + l -d2IL+ a + + c + d + e + x + g + h + i + k + l -d2iL+ a ++ c + d + e + x + g + h + i + k + l -d2aL+ a + c + d + e + x + g + h + i + k + l -d2AL+ a c + d + e + x + g + h + i + k + l -d2Il+ a + b + c + + e + x + g + h + i + k + l -d2il+ a + b + c ++ e + x + g + h + i + k + l -d2al+ a + b + c + e + x + g + h + i + k + l -d2Al+ a + b + c e + x + g + h + i + k + l -d2I+ a + b + c + d + e + + g + h + i + k + l -d2i+ a + b + c + d + e ++ g + h + i + k + l -d2a+ a + b + c + d + e + g + h + i + k + l -d2A+ a + b + c + d + e g + h + i + k + l -d2In+ a + b + c + d + e + x + g + + i + k + l -d2in+ a + b + c + d + e + x + g ++ i + k + l -d2an+ a + b + c + d + e + x + g + i + k + l -d2An+ a + b + c + d + e + x + g i + k + l -d2IN+ a + b + c + d + e + x + g + h + i + + l -d2iN+ a + b + c + d + e + x + g + h + i ++ l -d2aN+ a + b + c + d + e + x + g + h + i + l -d2AN+ a + b + c + d + e + x + g + h + i l -yIL+ a + b + c + d + e + x + g + h + i + k + l 'd' -yiL+ a + b + c + d + e + x + g + h + i + k + l ' d ' -yaL+ a + b + c + d + e + x + g + h + i + k + l '+ d ' -yAL+ a + b + c + d + e + x + g + h + i + k + l '+ d + ' -yIl+ a + b + c + d + e + x + g + h + i + k + l 'e' -yil+ a + b + c + d + e + x + g + h + i + k + l ' e ' -yal+ a + b + c + d + e + x + g + h + i + k + l '+ e ' -yAl+ a + b + c + d + e + x + g + h + i + k + l '+ e + ' -yI+ a + b + c + d + e + x + g + h + i + k + l 'x' -yi+ a + b + c + d + e + x + g + h + i + k + l ' x ' -ya+ a + b + c + d + e + x + g + h + i + k + l '+ x ' -yA+ a + b + c + d + e + x + g + h + i + k + l '+ x + ' -yIn+ a + b + c + d + e + x + g + h + i + k + l 'g' -yin+ a + b + c + d + e + x + g + h + i + k + l ' g ' -yan+ a + b + c + d + e + x + g + h + i + k + l '+ g ' -yAn+ a + b + c + d + e + x + g + h + i + k + l '+ g + ' -yIN+ a + b + c + d + e + x + g + h + i + k + l 'h' -yiN+ a + b + c + d + e + x + g + h + i + k + l ' h ' -yaN+ a + b + c + d + e + x + g + h + i + k + l '+ h ' -yAN+ a + b + c + d + e + x + g + h + i + k + l '+ h + ' -y1IL+ a + b + c + d + e + x + g + h + i + k + l 'd' -y1iL+ a + b + c + d + e + x + g + h + i + k + l ' d ' -y1aL+ a + b + c + d + e + x + g + h + i + k + l '+ d ' -y1AL+ a + b + c + d + e + x + g + h + i + k + l '+ d + ' -y1Il+ a + b + c + d + e + x + g + h + i + k + l 'e' -y1il+ a + b + c + d + e + x + g + h + i + k + l ' e ' -y1al+ a + b + c + d + e + x + g + h + i + k + l '+ e ' -y1Al+ a + b + c + d + e + x + g + h + i + k + l '+ e + ' -y1I+ a + b + c + d + e + x + g + h + i + k + l 'x' -y1i+ a + b + c + d + e + x + g + h + i + k + l ' x ' -y1a+ a + b + c + d + e + x + g + h + i + k + l '+ x ' -y1A+ a + b + c + d + e + x + g + h + i + k + l '+ x + ' -y1In+ a + b + c + d + e + x + g + h + i + k + l 'g' -y1in+ a + b + c + d + e + x + g + h + i + k + l ' g ' -y1an+ a + b + c + d + e + x + g + h + i + k + l '+ g ' -y1An+ a + b + c + d + e + x + g + h + i + k + l '+ g + ' -y1IN+ a + b + c + d + e + x + g + h + i + k + l 'h' -y1iN+ a + b + c + d + e + x + g + h + i + k + l ' h ' -y1aN+ a + b + c + d + e + x + g + h + i + k + l '+ h ' -y1AN+ a + b + c + d + e + x + g + h + i + k + l '+ h + ' -y2IL+ a + b + c + d + e + x + g + h + i + k + l 'b' -y2iL+ a + b + c + d + e + x + g + h + i + k + l ' b ' -y2aL+ a + b + c + d + e + x + g + h + i + k + l '+ b ' -y2AL+ a + b + c + d + e + x + g + h + i + k + l '+ b + ' -y2Il+ a + b + c + d + e + x + g + h + i + k + l 'd' -y2il+ a + b + c + d + e + x + g + h + i + k + l ' d ' -y2al+ a + b + c + d + e + x + g + h + i + k + l '+ d ' -y2Al+ a + b + c + d + e + x + g + h + i + k + l '+ d + ' -y2I+ a + b + c + d + e + x + g + h + i + k + l 'x' -y2i+ a + b + c + d + e + x + g + h + i + k + l ' x ' -y2a+ a + b + c + d + e + x + g + h + i + k + l '+ x ' -y2A+ a + b + c + d + e + x + g + h + i + k + l '+ x + ' -y2In+ a + b + c + d + e + x + g + h + i + k + l 'h' -y2in+ a + b + c + d + e + x + g + h + i + k + l ' h ' -y2an+ a + b + c + d + e + x + g + h + i + k + l '+ h ' -y2An+ a + b + c + d + e + x + g + h + i + k + l '+ h + ' -y2IN+ a + b + c + d + e + x + g + h + i + k + l 'k' -y2iN+ a + b + c + d + e + x + g + h + i + k + l ' k ' -y2aN+ a + b + c + d + e + x + g + h + i + k + l '+ k ' -y2AN+ a + b + c + d + e + x + g + h + i + k + l '+ k + ' -vIL+ a + b + c + _ + e + x + g + h + i + k + l -viL+ a + b + c +___+ e + x + g + h + i + k + l -vaL+ a + b + c ____+ e + x + g + h + i + k + l -vAL+ a + b + c ______e + x + g + h + i + k + l -vIl+ a + b + c + d + _ + x + g + h + i + k + l -vil+ a + b + c + d +___+ x + g + h + i + k + l -val+ a + b + c + d ____+ x + g + h + i + k + l -vAl+ a + b + c + d ______x + g + h + i + k + l -vI+ a + b + c + d + e + _ + g + h + i + k + l -vi+ a + b + c + d + e +___+ g + h + i + k + l -va+ a + b + c + d + e ____+ g + h + i + k + l -vA+ a + b + c + d + e ______g + h + i + k + l -vIn+ a + b + c + d + e + x + _ + h + i + k + l -vin+ a + b + c + d + e + x +___+ h + i + k + l -van+ a + b + c + d + e + x ____+ h + i + k + l -vAn+ a + b + c + d + e + x ______h + i + k + l -vIN+ a + b + c + d + e + x + g + _ + i + k + l -viN+ a + b + c + d + e + x + g +___+ i + k + l -vaN+ a + b + c + d + e + x + g ____+ i + k + l -vAN+ a + b + c + d + e + x + g ______i + k + l -v1IL+ a + b + c + _ + e + x + g + h + i + k + l -v1iL+ a + b + c +___+ e + x + g + h + i + k + l -v1aL+ a + b + c ____+ e + x + g + h + i + k + l -v1AL+ a + b + c ______e + x + g + h + i + k + l -v1Il+ a + b + c + d + _ + x + g + h + i + k + l -v1il+ a + b + c + d +___+ x + g + h + i + k + l -v1al+ a + b + c + d ____+ x + g + h + i + k + l -v1Al+ a + b + c + d ______x + g + h + i + k + l -v1I+ a + b + c + d + e + _ + g + h + i + k + l -v1i+ a + b + c + d + e +___+ g + h + i + k + l -v1a+ a + b + c + d + e ____+ g + h + i + k + l -v1A+ a + b + c + d + e ______g + h + i + k + l -v1In+ a + b + c + d + e + x + _ + h + i + k + l -v1in+ a + b + c + d + e + x +___+ h + i + k + l -v1an+ a + b + c + d + e + x ____+ h + i + k + l -v1An+ a + b + c + d + e + x ______h + i + k + l -v1IN+ a + b + c + d + e + x + g + _ + i + k + l -v1iN+ a + b + c + d + e + x + g +___+ i + k + l -v1aN+ a + b + c + d + e + x + g ____+ i + k + l -v1AN+ a + b + c + d + e + x + g ______i + k + l -v2IL+ a + _ + c + d + e + x + g + h + i + k + l -v2iL+ a +___+ c + d + e + x + g + h + i + k + l -v2aL+ a ____+ c + d + e + x + g + h + i + k + l -v2AL+ a ______c + d + e + x + g + h + i + k + l -v2Il+ a + b + c + _ + e + x + g + h + i + k + l -v2il+ a + b + c +___+ e + x + g + h + i + k + l -v2al+ a + b + c ____+ e + x + g + h + i + k + l -v2Al+ a + b + c ______e + x + g + h + i + k + l -v2I+ a + b + c + d + e + _ + g + h + i + k + l -v2i+ a + b + c + d + e +___+ g + h + i + k + l -v2a+ a + b + c + d + e ____+ g + h + i + k + l -v2A+ a + b + c + d + e ______g + h + i + k + l -v2In+ a + b + c + d + e + x + g + _ + i + k + l -v2in+ a + b + c + d + e + x + g +___+ i + k + l -v2an+ a + b + c + d + e + x + g ____+ i + k + l -v2An+ a + b + c + d + e + x + g ______i + k + l -v2IN+ a + b + c + d + e + x + g + h + i + _ + l -v2iN+ a + b + c + d + e + x + g + h + i +___+ l -v2aN+ a + b + c + d + e + x + g + h + i ____+ l -v2AN+ a + b + c + d + e + x + g + h + i ______l -a - b - c - d - e - x - g - h - i - k - l -cIL- a - b - c - _ - e - x - g - h - i - k - l -ciL- a - b - c -_- e - x - g - h - i - k - l -caL- a - b - c _- e - x - g - h - i - k - l -cAL- a - b - c _e - x - g - h - i - k - l -cIl- a - b - c - d - _ - x - g - h - i - k - l -cil- a - b - c - d -_- x - g - h - i - k - l -cal- a - b - c - d _- x - g - h - i - k - l -cAl- a - b - c - d _x - g - h - i - k - l -cI- a - b - c - d - e - _ - g - h - i - k - l -ci- a - b - c - d - e -_- g - h - i - k - l -ca- a - b - c - d - e _- g - h - i - k - l -cA- a - b - c - d - e _g - h - i - k - l -cIn- a - b - c - d - e - x - _ - h - i - k - l -cin- a - b - c - d - e - x -_- h - i - k - l -can- a - b - c - d - e - x _- h - i - k - l -cAn- a - b - c - d - e - x _h - i - k - l -cIN- a - b - c - d - e - x - g - _ - i - k - l -ciN- a - b - c - d - e - x - g -_- i - k - l -caN- a - b - c - d - e - x - g _- i - k - l -cAN- a - b - c - d - e - x - g _i - k - l -c1IL- a - b - c - _ - e - x - g - h - i - k - l -c1iL- a - b - c -_- e - x - g - h - i - k - l -c1aL- a - b - c _- e - x - g - h - i - k - l -c1AL- a - b - c _e - x - g - h - i - k - l -c1Il- a - b - c - d - _ - x - g - h - i - k - l -c1il- a - b - c - d -_- x - g - h - i - k - l -c1al- a - b - c - d _- x - g - h - i - k - l -c1Al- a - b - c - d _x - g - h - i - k - l -c1I- a - b - c - d - e - _ - g - h - i - k - l -c1i- a - b - c - d - e -_- g - h - i - k - l -c1a- a - b - c - d - e _- g - h - i - k - l -c1A- a - b - c - d - e _g - h - i - k - l -c1In- a - b - c - d - e - x - _ - h - i - k - l -c1in- a - b - c - d - e - x -_- h - i - k - l -c1an- a - b - c - d - e - x _- h - i - k - l -c1An- a - b - c - d - e - x _h - i - k - l -c1IN- a - b - c - d - e - x - g - _ - i - k - l -c1iN- a - b - c - d - e - x - g -_- i - k - l -c1aN- a - b - c - d - e - x - g _- i - k - l -c1AN- a - b - c - d - e - x - g _i - k - l -c2IL- a - _ - c - d - e - x - g - h - i - k - l -c2iL- a -_- c - d - e - x - g - h - i - k - l -c2aL- a _- c - d - e - x - g - h - i - k - l -c2AL- a _c - d - e - x - g - h - i - k - l -c2Il- a - b - c - _ - e - x - g - h - i - k - l -c2il- a - b - c -_- e - x - g - h - i - k - l -c2al- a - b - c _- e - x - g - h - i - k - l -c2Al- a - b - c _e - x - g - h - i - k - l -c2I- a - b - c - d - e - _ - g - h - i - k - l -c2i- a - b - c - d - e -_- g - h - i - k - l -c2a- a - b - c - d - e _- g - h - i - k - l -c2A- a - b - c - d - e _g - h - i - k - l -c2In- a - b - c - d - e - x - g - _ - i - k - l -c2in- a - b - c - d - e - x - g -_- i - k - l -c2an- a - b - c - d - e - x - g _- i - k - l -c2An- a - b - c - d - e - x - g _i - k - l -c2IN- a - b - c - d - e - x - g - h - i - _ - l -c2iN- a - b - c - d - e - x - g - h - i -_- l -c2aN- a - b - c - d - e - x - g - h - i _- l -c2AN- a - b - c - d - e - x - g - h - i _l -dIL- a - b - c - - e - x - g - h - i - k - l -diL- a - b - c -- e - x - g - h - i - k - l -daL- a - b - c - e - x - g - h - i - k - l -dAL- a - b - c e - x - g - h - i - k - l -dIl- a - b - c - d - - x - g - h - i - k - l -dil- a - b - c - d -- x - g - h - i - k - l -dal- a - b - c - d - x - g - h - i - k - l -dAl- a - b - c - d x - g - h - i - k - l -dI- a - b - c - d - e - - g - h - i - k - l -di- a - b - c - d - e -- g - h - i - k - l -da- a - b - c - d - e - g - h - i - k - l -dA- a - b - c - d - e g - h - i - k - l -dIn- a - b - c - d - e - x - - h - i - k - l -din- a - b - c - d - e - x -- h - i - k - l -dan- a - b - c - d - e - x - h - i - k - l -dAn- a - b - c - d - e - x h - i - k - l -dIN- a - b - c - d - e - x - g - - i - k - l -diN- a - b - c - d - e - x - g -- i - k - l -daN- a - b - c - d - e - x - g - i - k - l -dAN- a - b - c - d - e - x - g i - k - l -d1IL- a - b - c - - e - x - g - h - i - k - l -d1iL- a - b - c -- e - x - g - h - i - k - l -d1aL- a - b - c - e - x - g - h - i - k - l -d1AL- a - b - c e - x - g - h - i - k - l -d1Il- a - b - c - d - - x - g - h - i - k - l -d1il- a - b - c - d -- x - g - h - i - k - l -d1al- a - b - c - d - x - g - h - i - k - l -d1Al- a - b - c - d x - g - h - i - k - l -d1I- a - b - c - d - e - - g - h - i - k - l -d1i- a - b - c - d - e -- g - h - i - k - l -d1a- a - b - c - d - e - g - h - i - k - l -d1A- a - b - c - d - e g - h - i - k - l -d1In- a - b - c - d - e - x - - h - i - k - l -d1in- a - b - c - d - e - x -- h - i - k - l -d1an- a - b - c - d - e - x - h - i - k - l -d1An- a - b - c - d - e - x h - i - k - l -d1IN- a - b - c - d - e - x - g - - i - k - l -d1iN- a - b - c - d - e - x - g -- i - k - l -d1aN- a - b - c - d - e - x - g - i - k - l -d1AN- a - b - c - d - e - x - g i - k - l -d2IL- a - - c - d - e - x - g - h - i - k - l -d2iL- a -- c - d - e - x - g - h - i - k - l -d2aL- a - c - d - e - x - g - h - i - k - l -d2AL- a c - d - e - x - g - h - i - k - l -d2Il- a - b - c - - e - x - g - h - i - k - l -d2il- a - b - c -- e - x - g - h - i - k - l -d2al- a - b - c - e - x - g - h - i - k - l -d2Al- a - b - c e - x - g - h - i - k - l -d2I- a - b - c - d - e - - g - h - i - k - l -d2i- a - b - c - d - e -- g - h - i - k - l -d2a- a - b - c - d - e - g - h - i - k - l -d2A- a - b - c - d - e g - h - i - k - l -d2In- a - b - c - d - e - x - g - - i - k - l -d2in- a - b - c - d - e - x - g -- i - k - l -d2an- a - b - c - d - e - x - g - i - k - l -d2An- a - b - c - d - e - x - g i - k - l -d2IN- a - b - c - d - e - x - g - h - i - - l -d2iN- a - b - c - d - e - x - g - h - i -- l -d2aN- a - b - c - d - e - x - g - h - i - l -d2AN- a - b - c - d - e - x - g - h - i l -yIL- a - b - c - d - e - x - g - h - i - k - l 'd' -yiL- a - b - c - d - e - x - g - h - i - k - l ' d ' -yaL- a - b - c - d - e - x - g - h - i - k - l '- d ' -yAL- a - b - c - d - e - x - g - h - i - k - l '- d - ' -yIl- a - b - c - d - e - x - g - h - i - k - l 'e' -yil- a - b - c - d - e - x - g - h - i - k - l ' e ' -yal- a - b - c - d - e - x - g - h - i - k - l '- e ' -yAl- a - b - c - d - e - x - g - h - i - k - l '- e - ' -yI- a - b - c - d - e - x - g - h - i - k - l 'x' -yi- a - b - c - d - e - x - g - h - i - k - l ' x ' -ya- a - b - c - d - e - x - g - h - i - k - l '- x ' -yA- a - b - c - d - e - x - g - h - i - k - l '- x - ' -yIn- a - b - c - d - e - x - g - h - i - k - l 'g' -yin- a - b - c - d - e - x - g - h - i - k - l ' g ' -yan- a - b - c - d - e - x - g - h - i - k - l '- g ' -yAn- a - b - c - d - e - x - g - h - i - k - l '- g - ' -yIN- a - b - c - d - e - x - g - h - i - k - l 'h' -yiN- a - b - c - d - e - x - g - h - i - k - l ' h ' -yaN- a - b - c - d - e - x - g - h - i - k - l '- h ' -yAN- a - b - c - d - e - x - g - h - i - k - l '- h - ' -y1IL- a - b - c - d - e - x - g - h - i - k - l 'd' -y1iL- a - b - c - d - e - x - g - h - i - k - l ' d ' -y1aL- a - b - c - d - e - x - g - h - i - k - l '- d ' -y1AL- a - b - c - d - e - x - g - h - i - k - l '- d - ' -y1Il- a - b - c - d - e - x - g - h - i - k - l 'e' -y1il- a - b - c - d - e - x - g - h - i - k - l ' e ' -y1al- a - b - c - d - e - x - g - h - i - k - l '- e ' -y1Al- a - b - c - d - e - x - g - h - i - k - l '- e - ' -y1I- a - b - c - d - e - x - g - h - i - k - l 'x' -y1i- a - b - c - d - e - x - g - h - i - k - l ' x ' -y1a- a - b - c - d - e - x - g - h - i - k - l '- x ' -y1A- a - b - c - d - e - x - g - h - i - k - l '- x - ' -y1In- a - b - c - d - e - x - g - h - i - k - l 'g' -y1in- a - b - c - d - e - x - g - h - i - k - l ' g ' -y1an- a - b - c - d - e - x - g - h - i - k - l '- g ' -y1An- a - b - c - d - e - x - g - h - i - k - l '- g - ' -y1IN- a - b - c - d - e - x - g - h - i - k - l 'h' -y1iN- a - b - c - d - e - x - g - h - i - k - l ' h ' -y1aN- a - b - c - d - e - x - g - h - i - k - l '- h ' -y1AN- a - b - c - d - e - x - g - h - i - k - l '- h - ' -y2IL- a - b - c - d - e - x - g - h - i - k - l 'b' -y2iL- a - b - c - d - e - x - g - h - i - k - l ' b ' -y2aL- a - b - c - d - e - x - g - h - i - k - l '- b ' -y2AL- a - b - c - d - e - x - g - h - i - k - l '- b - ' -y2Il- a - b - c - d - e - x - g - h - i - k - l 'd' -y2il- a - b - c - d - e - x - g - h - i - k - l ' d ' -y2al- a - b - c - d - e - x - g - h - i - k - l '- d ' -y2Al- a - b - c - d - e - x - g - h - i - k - l '- d - ' -y2I- a - b - c - d - e - x - g - h - i - k - l 'x' -y2i- a - b - c - d - e - x - g - h - i - k - l ' x ' -y2a- a - b - c - d - e - x - g - h - i - k - l '- x ' -y2A- a - b - c - d - e - x - g - h - i - k - l '- x - ' -y2In- a - b - c - d - e - x - g - h - i - k - l 'h' -y2in- a - b - c - d - e - x - g - h - i - k - l ' h ' -y2an- a - b - c - d - e - x - g - h - i - k - l '- h ' -y2An- a - b - c - d - e - x - g - h - i - k - l '- h - ' -y2IN- a - b - c - d - e - x - g - h - i - k - l 'k' -y2iN- a - b - c - d - e - x - g - h - i - k - l ' k ' -y2aN- a - b - c - d - e - x - g - h - i - k - l '- k ' -y2AN- a - b - c - d - e - x - g - h - i - k - l '- k - ' -vIL- a - b - c - _ - e - x - g - h - i - k - l -viL- a - b - c -___- e - x - g - h - i - k - l -vaL- a - b - c ____- e - x - g - h - i - k - l -vAL- a - b - c ______e - x - g - h - i - k - l -vIl- a - b - c - d - _ - x - g - h - i - k - l -vil- a - b - c - d -___- x - g - h - i - k - l -val- a - b - c - d ____- x - g - h - i - k - l -vAl- a - b - c - d ______x - g - h - i - k - l -vI- a - b - c - d - e - _ - g - h - i - k - l -vi- a - b - c - d - e -___- g - h - i - k - l -va- a - b - c - d - e ____- g - h - i - k - l -vA- a - b - c - d - e ______g - h - i - k - l -vIn- a - b - c - d - e - x - _ - h - i - k - l -vin- a - b - c - d - e - x -___- h - i - k - l -van- a - b - c - d - e - x ____- h - i - k - l -vAn- a - b - c - d - e - x ______h - i - k - l -vIN- a - b - c - d - e - x - g - _ - i - k - l -viN- a - b - c - d - e - x - g -___- i - k - l -vaN- a - b - c - d - e - x - g ____- i - k - l -vAN- a - b - c - d - e - x - g ______i - k - l -v1IL- a - b - c - _ - e - x - g - h - i - k - l -v1iL- a - b - c -___- e - x - g - h - i - k - l -v1aL- a - b - c ____- e - x - g - h - i - k - l -v1AL- a - b - c ______e - x - g - h - i - k - l -v1Il- a - b - c - d - _ - x - g - h - i - k - l -v1il- a - b - c - d -___- x - g - h - i - k - l -v1al- a - b - c - d ____- x - g - h - i - k - l -v1Al- a - b - c - d ______x - g - h - i - k - l -v1I- a - b - c - d - e - _ - g - h - i - k - l -v1i- a - b - c - d - e -___- g - h - i - k - l -v1a- a - b - c - d - e ____- g - h - i - k - l -v1A- a - b - c - d - e ______g - h - i - k - l -v1In- a - b - c - d - e - x - _ - h - i - k - l -v1in- a - b - c - d - e - x -___- h - i - k - l -v1an- a - b - c - d - e - x ____- h - i - k - l -v1An- a - b - c - d - e - x ______h - i - k - l -v1IN- a - b - c - d - e - x - g - _ - i - k - l -v1iN- a - b - c - d - e - x - g -___- i - k - l -v1aN- a - b - c - d - e - x - g ____- i - k - l -v1AN- a - b - c - d - e - x - g ______i - k - l -v2IL- a - _ - c - d - e - x - g - h - i - k - l -v2iL- a -___- c - d - e - x - g - h - i - k - l -v2aL- a ____- c - d - e - x - g - h - i - k - l -v2AL- a ______c - d - e - x - g - h - i - k - l -v2Il- a - b - c - _ - e - x - g - h - i - k - l -v2il- a - b - c -___- e - x - g - h - i - k - l -v2al- a - b - c ____- e - x - g - h - i - k - l -v2Al- a - b - c ______e - x - g - h - i - k - l -v2I- a - b - c - d - e - _ - g - h - i - k - l -v2i- a - b - c - d - e -___- g - h - i - k - l -v2a- a - b - c - d - e ____- g - h - i - k - l -v2A- a - b - c - d - e ______g - h - i - k - l -v2In- a - b - c - d - e - x - g - _ - i - k - l -v2in- a - b - c - d - e - x - g -___- i - k - l -v2an- a - b - c - d - e - x - g ____- i - k - l -v2An- a - b - c - d - e - x - g ______i - k - l -v2IN- a - b - c - d - e - x - g - h - i - _ - l -v2iN- a - b - c - d - e - x - g - h - i -___- l -v2aN- a - b - c - d - e - x - g - h - i ____- l -v2AN- a - b - c - d - e - x - g - h - i ______l -a = b = c = d = e = x = g = h = i = k = l -cIL= a = b = c = _ = e = x = g = h = i = k = l -ciL= a = b = c =_= e = x = g = h = i = k = l -caL= a = b = c _= e = x = g = h = i = k = l -cAL= a = b = c _e = x = g = h = i = k = l -cIl= a = b = c = d = _ = x = g = h = i = k = l -cil= a = b = c = d =_= x = g = h = i = k = l -cal= a = b = c = d _= x = g = h = i = k = l -cAl= a = b = c = d _x = g = h = i = k = l -cI= a = b = c = d = e = _ = g = h = i = k = l -ci= a = b = c = d = e =_= g = h = i = k = l -ca= a = b = c = d = e _= g = h = i = k = l -cA= a = b = c = d = e _g = h = i = k = l -cIn= a = b = c = d = e = x = _ = h = i = k = l -cin= a = b = c = d = e = x =_= h = i = k = l -can= a = b = c = d = e = x _= h = i = k = l -cAn= a = b = c = d = e = x _h = i = k = l -cIN= a = b = c = d = e = x = g = _ = i = k = l -ciN= a = b = c = d = e = x = g =_= i = k = l -caN= a = b = c = d = e = x = g _= i = k = l -cAN= a = b = c = d = e = x = g _i = k = l -c1IL= a = b = c = _ = e = x = g = h = i = k = l -c1iL= a = b = c =_= e = x = g = h = i = k = l -c1aL= a = b = c _= e = x = g = h = i = k = l -c1AL= a = b = c _e = x = g = h = i = k = l -c1Il= a = b = c = d = _ = x = g = h = i = k = l -c1il= a = b = c = d =_= x = g = h = i = k = l -c1al= a = b = c = d _= x = g = h = i = k = l -c1Al= a = b = c = d _x = g = h = i = k = l -c1I= a = b = c = d = e = _ = g = h = i = k = l -c1i= a = b = c = d = e =_= g = h = i = k = l -c1a= a = b = c = d = e _= g = h = i = k = l -c1A= a = b = c = d = e _g = h = i = k = l -c1In= a = b = c = d = e = x = _ = h = i = k = l -c1in= a = b = c = d = e = x =_= h = i = k = l -c1an= a = b = c = d = e = x _= h = i = k = l -c1An= a = b = c = d = e = x _h = i = k = l -c1IN= a = b = c = d = e = x = g = _ = i = k = l -c1iN= a = b = c = d = e = x = g =_= i = k = l -c1aN= a = b = c = d = e = x = g _= i = k = l -c1AN= a = b = c = d = e = x = g _i = k = l -c2IL= a = _ = c = d = e = x = g = h = i = k = l -c2iL= a =_= c = d = e = x = g = h = i = k = l -c2aL= a _= c = d = e = x = g = h = i = k = l -c2AL= a _c = d = e = x = g = h = i = k = l -c2Il= a = b = c = _ = e = x = g = h = i = k = l -c2il= a = b = c =_= e = x = g = h = i = k = l -c2al= a = b = c _= e = x = g = h = i = k = l -c2Al= a = b = c _e = x = g = h = i = k = l -c2I= a = b = c = d = e = _ = g = h = i = k = l -c2i= a = b = c = d = e =_= g = h = i = k = l -c2a= a = b = c = d = e _= g = h = i = k = l -c2A= a = b = c = d = e _g = h = i = k = l -c2In= a = b = c = d = e = x = g = _ = i = k = l -c2in= a = b = c = d = e = x = g =_= i = k = l -c2an= a = b = c = d = e = x = g _= i = k = l -c2An= a = b = c = d = e = x = g _i = k = l -c2IN= a = b = c = d = e = x = g = h = i = _ = l -c2iN= a = b = c = d = e = x = g = h = i =_= l -c2aN= a = b = c = d = e = x = g = h = i _= l -c2AN= a = b = c = d = e = x = g = h = i _l -dIL= a = b = c = = e = x = g = h = i = k = l -diL= a = b = c == e = x = g = h = i = k = l -daL= a = b = c = e = x = g = h = i = k = l -dAL= a = b = c e = x = g = h = i = k = l -dIl= a = b = c = d = = x = g = h = i = k = l -dil= a = b = c = d == x = g = h = i = k = l -dal= a = b = c = d = x = g = h = i = k = l -dAl= a = b = c = d x = g = h = i = k = l -dI= a = b = c = d = e = = g = h = i = k = l -di= a = b = c = d = e == g = h = i = k = l -da= a = b = c = d = e = g = h = i = k = l -dA= a = b = c = d = e g = h = i = k = l -dIn= a = b = c = d = e = x = = h = i = k = l -din= a = b = c = d = e = x == h = i = k = l -dan= a = b = c = d = e = x = h = i = k = l -dAn= a = b = c = d = e = x h = i = k = l -dIN= a = b = c = d = e = x = g = = i = k = l -diN= a = b = c = d = e = x = g == i = k = l -daN= a = b = c = d = e = x = g = i = k = l -dAN= a = b = c = d = e = x = g i = k = l -d1IL= a = b = c = = e = x = g = h = i = k = l -d1iL= a = b = c == e = x = g = h = i = k = l -d1aL= a = b = c = e = x = g = h = i = k = l -d1AL= a = b = c e = x = g = h = i = k = l -d1Il= a = b = c = d = = x = g = h = i = k = l -d1il= a = b = c = d == x = g = h = i = k = l -d1al= a = b = c = d = x = g = h = i = k = l -d1Al= a = b = c = d x = g = h = i = k = l -d1I= a = b = c = d = e = = g = h = i = k = l -d1i= a = b = c = d = e == g = h = i = k = l -d1a= a = b = c = d = e = g = h = i = k = l -d1A= a = b = c = d = e g = h = i = k = l -d1In= a = b = c = d = e = x = = h = i = k = l -d1in= a = b = c = d = e = x == h = i = k = l -d1an= a = b = c = d = e = x = h = i = k = l -d1An= a = b = c = d = e = x h = i = k = l -d1IN= a = b = c = d = e = x = g = = i = k = l -d1iN= a = b = c = d = e = x = g == i = k = l -d1aN= a = b = c = d = e = x = g = i = k = l -d1AN= a = b = c = d = e = x = g i = k = l -d2IL= a = = c = d = e = x = g = h = i = k = l -d2iL= a == c = d = e = x = g = h = i = k = l -d2aL= a = c = d = e = x = g = h = i = k = l -d2AL= a c = d = e = x = g = h = i = k = l -d2Il= a = b = c = = e = x = g = h = i = k = l -d2il= a = b = c == e = x = g = h = i = k = l -d2al= a = b = c = e = x = g = h = i = k = l -d2Al= a = b = c e = x = g = h = i = k = l -d2I= a = b = c = d = e = = g = h = i = k = l -d2i= a = b = c = d = e == g = h = i = k = l -d2a= a = b = c = d = e = g = h = i = k = l -d2A= a = b = c = d = e g = h = i = k = l -d2In= a = b = c = d = e = x = g = = i = k = l -d2in= a = b = c = d = e = x = g == i = k = l -d2an= a = b = c = d = e = x = g = i = k = l -d2An= a = b = c = d = e = x = g i = k = l -d2IN= a = b = c = d = e = x = g = h = i = = l -d2iN= a = b = c = d = e = x = g = h = i == l -d2aN= a = b = c = d = e = x = g = h = i = l -d2AN= a = b = c = d = e = x = g = h = i l -yIL= a = b = c = d = e = x = g = h = i = k = l 'd' -yiL= a = b = c = d = e = x = g = h = i = k = l ' d ' -yaL= a = b = c = d = e = x = g = h = i = k = l '= d ' -yAL= a = b = c = d = e = x = g = h = i = k = l '= d = ' -yIl= a = b = c = d = e = x = g = h = i = k = l 'e' -yil= a = b = c = d = e = x = g = h = i = k = l ' e ' -yal= a = b = c = d = e = x = g = h = i = k = l '= e ' -yAl= a = b = c = d = e = x = g = h = i = k = l '= e = ' -yI= a = b = c = d = e = x = g = h = i = k = l 'x' -yi= a = b = c = d = e = x = g = h = i = k = l ' x ' -ya= a = b = c = d = e = x = g = h = i = k = l '= x ' -yA= a = b = c = d = e = x = g = h = i = k = l '= x = ' -yIn= a = b = c = d = e = x = g = h = i = k = l 'g' -yin= a = b = c = d = e = x = g = h = i = k = l ' g ' -yan= a = b = c = d = e = x = g = h = i = k = l '= g ' -yAn= a = b = c = d = e = x = g = h = i = k = l '= g = ' -yIN= a = b = c = d = e = x = g = h = i = k = l 'h' -yiN= a = b = c = d = e = x = g = h = i = k = l ' h ' -yaN= a = b = c = d = e = x = g = h = i = k = l '= h ' -yAN= a = b = c = d = e = x = g = h = i = k = l '= h = ' -y1IL= a = b = c = d = e = x = g = h = i = k = l 'd' -y1iL= a = b = c = d = e = x = g = h = i = k = l ' d ' -y1aL= a = b = c = d = e = x = g = h = i = k = l '= d ' -y1AL= a = b = c = d = e = x = g = h = i = k = l '= d = ' -y1Il= a = b = c = d = e = x = g = h = i = k = l 'e' -y1il= a = b = c = d = e = x = g = h = i = k = l ' e ' -y1al= a = b = c = d = e = x = g = h = i = k = l '= e ' -y1Al= a = b = c = d = e = x = g = h = i = k = l '= e = ' -y1I= a = b = c = d = e = x = g = h = i = k = l 'x' -y1i= a = b = c = d = e = x = g = h = i = k = l ' x ' -y1a= a = b = c = d = e = x = g = h = i = k = l '= x ' -y1A= a = b = c = d = e = x = g = h = i = k = l '= x = ' -y1In= a = b = c = d = e = x = g = h = i = k = l 'g' -y1in= a = b = c = d = e = x = g = h = i = k = l ' g ' -y1an= a = b = c = d = e = x = g = h = i = k = l '= g ' -y1An= a = b = c = d = e = x = g = h = i = k = l '= g = ' -y1IN= a = b = c = d = e = x = g = h = i = k = l 'h' -y1iN= a = b = c = d = e = x = g = h = i = k = l ' h ' -y1aN= a = b = c = d = e = x = g = h = i = k = l '= h ' -y1AN= a = b = c = d = e = x = g = h = i = k = l '= h = ' -y2IL= a = b = c = d = e = x = g = h = i = k = l 'b' -y2iL= a = b = c = d = e = x = g = h = i = k = l ' b ' -y2aL= a = b = c = d = e = x = g = h = i = k = l '= b ' -y2AL= a = b = c = d = e = x = g = h = i = k = l '= b = ' -y2Il= a = b = c = d = e = x = g = h = i = k = l 'd' -y2il= a = b = c = d = e = x = g = h = i = k = l ' d ' -y2al= a = b = c = d = e = x = g = h = i = k = l '= d ' -y2Al= a = b = c = d = e = x = g = h = i = k = l '= d = ' -y2I= a = b = c = d = e = x = g = h = i = k = l 'x' -y2i= a = b = c = d = e = x = g = h = i = k = l ' x ' -y2a= a = b = c = d = e = x = g = h = i = k = l '= x ' -y2A= a = b = c = d = e = x = g = h = i = k = l '= x = ' -y2In= a = b = c = d = e = x = g = h = i = k = l 'h' -y2in= a = b = c = d = e = x = g = h = i = k = l ' h ' -y2an= a = b = c = d = e = x = g = h = i = k = l '= h ' -y2An= a = b = c = d = e = x = g = h = i = k = l '= h = ' -y2IN= a = b = c = d = e = x = g = h = i = k = l 'k' -y2iN= a = b = c = d = e = x = g = h = i = k = l ' k ' -y2aN= a = b = c = d = e = x = g = h = i = k = l '= k ' -y2AN= a = b = c = d = e = x = g = h = i = k = l '= k = ' -vIL= a = b = c = _ = e = x = g = h = i = k = l -viL= a = b = c =___= e = x = g = h = i = k = l -vaL= a = b = c ____= e = x = g = h = i = k = l -vAL= a = b = c ______e = x = g = h = i = k = l -vIl= a = b = c = d = _ = x = g = h = i = k = l -vil= a = b = c = d =___= x = g = h = i = k = l -val= a = b = c = d ____= x = g = h = i = k = l -vAl= a = b = c = d ______x = g = h = i = k = l -vI= a = b = c = d = e = _ = g = h = i = k = l -vi= a = b = c = d = e =___= g = h = i = k = l -va= a = b = c = d = e ____= g = h = i = k = l -vA= a = b = c = d = e ______g = h = i = k = l -vIn= a = b = c = d = e = x = _ = h = i = k = l -vin= a = b = c = d = e = x =___= h = i = k = l -van= a = b = c = d = e = x ____= h = i = k = l -vAn= a = b = c = d = e = x ______h = i = k = l -vIN= a = b = c = d = e = x = g = _ = i = k = l -viN= a = b = c = d = e = x = g =___= i = k = l -vaN= a = b = c = d = e = x = g ____= i = k = l -vAN= a = b = c = d = e = x = g ______i = k = l -v1IL= a = b = c = _ = e = x = g = h = i = k = l -v1iL= a = b = c =___= e = x = g = h = i = k = l -v1aL= a = b = c ____= e = x = g = h = i = k = l -v1AL= a = b = c ______e = x = g = h = i = k = l -v1Il= a = b = c = d = _ = x = g = h = i = k = l -v1il= a = b = c = d =___= x = g = h = i = k = l -v1al= a = b = c = d ____= x = g = h = i = k = l -v1Al= a = b = c = d ______x = g = h = i = k = l -v1I= a = b = c = d = e = _ = g = h = i = k = l -v1i= a = b = c = d = e =___= g = h = i = k = l -v1a= a = b = c = d = e ____= g = h = i = k = l -v1A= a = b = c = d = e ______g = h = i = k = l -v1In= a = b = c = d = e = x = _ = h = i = k = l -v1in= a = b = c = d = e = x =___= h = i = k = l -v1an= a = b = c = d = e = x ____= h = i = k = l -v1An= a = b = c = d = e = x ______h = i = k = l -v1IN= a = b = c = d = e = x = g = _ = i = k = l -v1iN= a = b = c = d = e = x = g =___= i = k = l -v1aN= a = b = c = d = e = x = g ____= i = k = l -v1AN= a = b = c = d = e = x = g ______i = k = l -v2IL= a = _ = c = d = e = x = g = h = i = k = l -v2iL= a =___= c = d = e = x = g = h = i = k = l -v2aL= a ____= c = d = e = x = g = h = i = k = l -v2AL= a ______c = d = e = x = g = h = i = k = l -v2Il= a = b = c = _ = e = x = g = h = i = k = l -v2il= a = b = c =___= e = x = g = h = i = k = l -v2al= a = b = c ____= e = x = g = h = i = k = l -v2Al= a = b = c ______e = x = g = h = i = k = l -v2I= a = b = c = d = e = _ = g = h = i = k = l -v2i= a = b = c = d = e =___= g = h = i = k = l -v2a= a = b = c = d = e ____= g = h = i = k = l -v2A= a = b = c = d = e ______g = h = i = k = l -v2In= a = b = c = d = e = x = g = _ = i = k = l -v2in= a = b = c = d = e = x = g =___= i = k = l -v2an= a = b = c = d = e = x = g ____= i = k = l -v2An= a = b = c = d = e = x = g ______i = k = l -v2IN= a = b = c = d = e = x = g = h = i = _ = l -v2iN= a = b = c = d = e = x = g = h = i =___= l -v2aN= a = b = c = d = e = x = g = h = i ____= l -v2AN= a = b = c = d = e = x = g = h = i ______l -a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -cIL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -ciL~ a ~ b ~ c ~_~ e ~ x ~ g ~ h ~ i ~ k ~ l -caL~ a ~ b ~ c _~ e ~ x ~ g ~ h ~ i ~ k ~ l -cAL~ a ~ b ~ c _e ~ x ~ g ~ h ~ i ~ k ~ l -cIl~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -cil~ a ~ b ~ c ~ d ~_~ x ~ g ~ h ~ i ~ k ~ l -cal~ a ~ b ~ c ~ d _~ x ~ g ~ h ~ i ~ k ~ l -cAl~ a ~ b ~ c ~ d _x ~ g ~ h ~ i ~ k ~ l -cI~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -ci~ a ~ b ~ c ~ d ~ e ~_~ g ~ h ~ i ~ k ~ l -ca~ a ~ b ~ c ~ d ~ e _~ g ~ h ~ i ~ k ~ l -cA~ a ~ b ~ c ~ d ~ e _g ~ h ~ i ~ k ~ l -cIn~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -cin~ a ~ b ~ c ~ d ~ e ~ x ~_~ h ~ i ~ k ~ l -can~ a ~ b ~ c ~ d ~ e ~ x _~ h ~ i ~ k ~ l -cAn~ a ~ b ~ c ~ d ~ e ~ x _h ~ i ~ k ~ l -cIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -ciN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~_~ i ~ k ~ l -caN~ a ~ b ~ c ~ d ~ e ~ x ~ g _~ i ~ k ~ l -cAN~ a ~ b ~ c ~ d ~ e ~ x ~ g _i ~ k ~ l -c1IL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c1iL~ a ~ b ~ c ~_~ e ~ x ~ g ~ h ~ i ~ k ~ l -c1aL~ a ~ b ~ c _~ e ~ x ~ g ~ h ~ i ~ k ~ l -c1AL~ a ~ b ~ c _e ~ x ~ g ~ h ~ i ~ k ~ l -c1Il~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -c1il~ a ~ b ~ c ~ d ~_~ x ~ g ~ h ~ i ~ k ~ l -c1al~ a ~ b ~ c ~ d _~ x ~ g ~ h ~ i ~ k ~ l -c1Al~ a ~ b ~ c ~ d _x ~ g ~ h ~ i ~ k ~ l -c1I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -c1i~ a ~ b ~ c ~ d ~ e ~_~ g ~ h ~ i ~ k ~ l -c1a~ a ~ b ~ c ~ d ~ e _~ g ~ h ~ i ~ k ~ l -c1A~ a ~ b ~ c ~ d ~ e _g ~ h ~ i ~ k ~ l -c1In~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -c1in~ a ~ b ~ c ~ d ~ e ~ x ~_~ h ~ i ~ k ~ l -c1an~ a ~ b ~ c ~ d ~ e ~ x _~ h ~ i ~ k ~ l -c1An~ a ~ b ~ c ~ d ~ e ~ x _h ~ i ~ k ~ l -c1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -c1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~_~ i ~ k ~ l -c1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g _~ i ~ k ~ l -c1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g _i ~ k ~ l -c2IL~ a ~ _ ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2iL~ a ~_~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2aL~ a _~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2AL~ a _c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2Il~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2il~ a ~ b ~ c ~_~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2al~ a ~ b ~ c _~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2Al~ a ~ b ~ c _e ~ x ~ g ~ h ~ i ~ k ~ l -c2I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -c2i~ a ~ b ~ c ~ d ~ e ~_~ g ~ h ~ i ~ k ~ l -c2a~ a ~ b ~ c ~ d ~ e _~ g ~ h ~ i ~ k ~ l -c2A~ a ~ b ~ c ~ d ~ e _g ~ h ~ i ~ k ~ l -c2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -c2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~_~ i ~ k ~ l -c2an~ a ~ b ~ c ~ d ~ e ~ x ~ g _~ i ~ k ~ l -c2An~ a ~ b ~ c ~ d ~ e ~ x ~ g _i ~ k ~ l -c2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ _ ~ l -c2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~_~ l -c2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i _~ l -c2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i _l -dIL~ a ~ b ~ c ~ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -diL~ a ~ b ~ c ~~ e ~ x ~ g ~ h ~ i ~ k ~ l -daL~ a ~ b ~ c ~ e ~ x ~ g ~ h ~ i ~ k ~ l -dAL~ a ~ b ~ c e ~ x ~ g ~ h ~ i ~ k ~ l -dIl~ a ~ b ~ c ~ d ~ ~ x ~ g ~ h ~ i ~ k ~ l -dil~ a ~ b ~ c ~ d ~~ x ~ g ~ h ~ i ~ k ~ l -dal~ a ~ b ~ c ~ d ~ x ~ g ~ h ~ i ~ k ~ l -dAl~ a ~ b ~ c ~ d x ~ g ~ h ~ i ~ k ~ l -dI~ a ~ b ~ c ~ d ~ e ~ ~ g ~ h ~ i ~ k ~ l -di~ a ~ b ~ c ~ d ~ e ~~ g ~ h ~ i ~ k ~ l -da~ a ~ b ~ c ~ d ~ e ~ g ~ h ~ i ~ k ~ l -dA~ a ~ b ~ c ~ d ~ e g ~ h ~ i ~ k ~ l -dIn~ a ~ b ~ c ~ d ~ e ~ x ~ ~ h ~ i ~ k ~ l -din~ a ~ b ~ c ~ d ~ e ~ x ~~ h ~ i ~ k ~ l -dan~ a ~ b ~ c ~ d ~ e ~ x ~ h ~ i ~ k ~ l -dAn~ a ~ b ~ c ~ d ~ e ~ x h ~ i ~ k ~ l -dIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ ~ i ~ k ~ l -diN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~~ i ~ k ~ l -daN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ i ~ k ~ l -dAN~ a ~ b ~ c ~ d ~ e ~ x ~ g i ~ k ~ l -d1IL~ a ~ b ~ c ~ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d1iL~ a ~ b ~ c ~~ e ~ x ~ g ~ h ~ i ~ k ~ l -d1aL~ a ~ b ~ c ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d1AL~ a ~ b ~ c e ~ x ~ g ~ h ~ i ~ k ~ l -d1Il~ a ~ b ~ c ~ d ~ ~ x ~ g ~ h ~ i ~ k ~ l -d1il~ a ~ b ~ c ~ d ~~ x ~ g ~ h ~ i ~ k ~ l -d1al~ a ~ b ~ c ~ d ~ x ~ g ~ h ~ i ~ k ~ l -d1Al~ a ~ b ~ c ~ d x ~ g ~ h ~ i ~ k ~ l -d1I~ a ~ b ~ c ~ d ~ e ~ ~ g ~ h ~ i ~ k ~ l -d1i~ a ~ b ~ c ~ d ~ e ~~ g ~ h ~ i ~ k ~ l -d1a~ a ~ b ~ c ~ d ~ e ~ g ~ h ~ i ~ k ~ l -d1A~ a ~ b ~ c ~ d ~ e g ~ h ~ i ~ k ~ l -d1In~ a ~ b ~ c ~ d ~ e ~ x ~ ~ h ~ i ~ k ~ l -d1in~ a ~ b ~ c ~ d ~ e ~ x ~~ h ~ i ~ k ~ l -d1an~ a ~ b ~ c ~ d ~ e ~ x ~ h ~ i ~ k ~ l -d1An~ a ~ b ~ c ~ d ~ e ~ x h ~ i ~ k ~ l -d1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ ~ i ~ k ~ l -d1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~~ i ~ k ~ l -d1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ i ~ k ~ l -d1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g i ~ k ~ l -d2IL~ a ~ ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2iL~ a ~~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2aL~ a ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2AL~ a c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2Il~ a ~ b ~ c ~ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2il~ a ~ b ~ c ~~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2al~ a ~ b ~ c ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2Al~ a ~ b ~ c e ~ x ~ g ~ h ~ i ~ k ~ l -d2I~ a ~ b ~ c ~ d ~ e ~ ~ g ~ h ~ i ~ k ~ l -d2i~ a ~ b ~ c ~ d ~ e ~~ g ~ h ~ i ~ k ~ l -d2a~ a ~ b ~ c ~ d ~ e ~ g ~ h ~ i ~ k ~ l -d2A~ a ~ b ~ c ~ d ~ e g ~ h ~ i ~ k ~ l -d2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ ~ i ~ k ~ l -d2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~~ i ~ k ~ l -d2an~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ i ~ k ~ l -d2An~ a ~ b ~ c ~ d ~ e ~ x ~ g i ~ k ~ l -d2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ ~ l -d2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~~ l -d2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ l -d2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i l -yIL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'd' -yiL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' d ' -yaL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ' -yAL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ~ ' -yIl~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'e' -yil~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' e ' -yal~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ' -yAl~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ~ ' -yI~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'x' -yi~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' x ' -ya~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ' -yA~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ~ ' -yIn~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'g' -yin~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' g ' -yan~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ' -yAn~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ~ ' -yIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'h' -yiN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' h ' -yaN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ' -yAN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ~ ' -y1IL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'd' -y1iL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' d ' -y1aL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ' -y1AL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ~ ' -y1Il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'e' -y1il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' e ' -y1al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ' -y1Al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ~ ' -y1I~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'x' -y1i~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' x ' -y1a~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ' -y1A~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ~ ' -y1In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'g' -y1in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' g ' -y1an~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ' -y1An~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ~ ' -y1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'h' -y1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' h ' -y1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ' -y1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ~ ' -y2IL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'b' -y2iL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' b ' -y2aL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ b ' -y2AL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ b ~ ' -y2Il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'd' -y2il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' d ' -y2al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ' -y2Al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ~ ' -y2I~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'x' -y2i~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' x ' -y2a~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ' -y2A~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ~ ' -y2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'h' -y2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' h ' -y2an~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ' -y2An~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ~ ' -y2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'k' -y2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' k ' -y2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ k ' -y2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ k ~ ' -vIL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -viL~ a ~ b ~ c ~___~ e ~ x ~ g ~ h ~ i ~ k ~ l -vaL~ a ~ b ~ c ____~ e ~ x ~ g ~ h ~ i ~ k ~ l -vAL~ a ~ b ~ c ______e ~ x ~ g ~ h ~ i ~ k ~ l -vIl~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -vil~ a ~ b ~ c ~ d ~___~ x ~ g ~ h ~ i ~ k ~ l -val~ a ~ b ~ c ~ d ____~ x ~ g ~ h ~ i ~ k ~ l -vAl~ a ~ b ~ c ~ d ______x ~ g ~ h ~ i ~ k ~ l -vI~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -vi~ a ~ b ~ c ~ d ~ e ~___~ g ~ h ~ i ~ k ~ l -va~ a ~ b ~ c ~ d ~ e ____~ g ~ h ~ i ~ k ~ l -vA~ a ~ b ~ c ~ d ~ e ______g ~ h ~ i ~ k ~ l -vIn~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -vin~ a ~ b ~ c ~ d ~ e ~ x ~___~ h ~ i ~ k ~ l -van~ a ~ b ~ c ~ d ~ e ~ x ____~ h ~ i ~ k ~ l -vAn~ a ~ b ~ c ~ d ~ e ~ x ______h ~ i ~ k ~ l -vIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -viN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~___~ i ~ k ~ l -vaN~ a ~ b ~ c ~ d ~ e ~ x ~ g ____~ i ~ k ~ l -vAN~ a ~ b ~ c ~ d ~ e ~ x ~ g ______i ~ k ~ l -v1IL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v1iL~ a ~ b ~ c ~___~ e ~ x ~ g ~ h ~ i ~ k ~ l -v1aL~ a ~ b ~ c ____~ e ~ x ~ g ~ h ~ i ~ k ~ l -v1AL~ a ~ b ~ c ______e ~ x ~ g ~ h ~ i ~ k ~ l -v1Il~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -v1il~ a ~ b ~ c ~ d ~___~ x ~ g ~ h ~ i ~ k ~ l -v1al~ a ~ b ~ c ~ d ____~ x ~ g ~ h ~ i ~ k ~ l -v1Al~ a ~ b ~ c ~ d ______x ~ g ~ h ~ i ~ k ~ l -v1I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -v1i~ a ~ b ~ c ~ d ~ e ~___~ g ~ h ~ i ~ k ~ l -v1a~ a ~ b ~ c ~ d ~ e ____~ g ~ h ~ i ~ k ~ l -v1A~ a ~ b ~ c ~ d ~ e ______g ~ h ~ i ~ k ~ l -v1In~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -v1in~ a ~ b ~ c ~ d ~ e ~ x ~___~ h ~ i ~ k ~ l -v1an~ a ~ b ~ c ~ d ~ e ~ x ____~ h ~ i ~ k ~ l -v1An~ a ~ b ~ c ~ d ~ e ~ x ______h ~ i ~ k ~ l -v1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -v1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~___~ i ~ k ~ l -v1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ____~ i ~ k ~ l -v1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ______i ~ k ~ l -v2IL~ a ~ _ ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2iL~ a ~___~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2aL~ a ____~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2AL~ a ______c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2Il~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2il~ a ~ b ~ c ~___~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2al~ a ~ b ~ c ____~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2Al~ a ~ b ~ c ______e ~ x ~ g ~ h ~ i ~ k ~ l -v2I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -v2i~ a ~ b ~ c ~ d ~ e ~___~ g ~ h ~ i ~ k ~ l -v2a~ a ~ b ~ c ~ d ~ e ____~ g ~ h ~ i ~ k ~ l -v2A~ a ~ b ~ c ~ d ~ e ______g ~ h ~ i ~ k ~ l -v2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -v2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~___~ i ~ k ~ l -v2an~ a ~ b ~ c ~ d ~ e ~ x ~ g ____~ i ~ k ~ l -v2An~ a ~ b ~ c ~ d ~ e ~ x ~ g ______i ~ k ~ l -v2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ _ ~ l -v2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~___~ l -v2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ____~ l -v2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ______l -a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l -cIL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -ciL_ a _ b _ c ___ e _ x _ g _ h _ i _ k _ l -caL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -cAL_ a _ b _ c _e _ x _ g _ h _ i _ k _ l -cIl_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -cil_ a _ b _ c _ d ___ x _ g _ h _ i _ k _ l -cal_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -cAl_ a _ b _ c _ d _x _ g _ h _ i _ k _ l -cI_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -ci_ a _ b _ c _ d _ e ___ g _ h _ i _ k _ l -ca_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -cA_ a _ b _ c _ d _ e _g _ h _ i _ k _ l -cIn_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -cin_ a _ b _ c _ d _ e _ x ___ h _ i _ k _ l -can_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -cAn_ a _ b _ c _ d _ e _ x _h _ i _ k _ l -cIN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -ciN_ a _ b _ c _ d _ e _ x _ g ___ i _ k _ l -caN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -cAN_ a _ b _ c _ d _ e _ x _ g _i _ k _ l -c1IL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -c1iL_ a _ b _ c ___ e _ x _ g _ h _ i _ k _ l -c1aL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -c1AL_ a _ b _ c _e _ x _ g _ h _ i _ k _ l -c1Il_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -c1il_ a _ b _ c _ d ___ x _ g _ h _ i _ k _ l -c1al_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -c1Al_ a _ b _ c _ d _x _ g _ h _ i _ k _ l -c1I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -c1i_ a _ b _ c _ d _ e ___ g _ h _ i _ k _ l -c1a_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -c1A_ a _ b _ c _ d _ e _g _ h _ i _ k _ l -c1In_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -c1in_ a _ b _ c _ d _ e _ x ___ h _ i _ k _ l -c1an_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -c1An_ a _ b _ c _ d _ e _ x _h _ i _ k _ l -c1IN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -c1iN_ a _ b _ c _ d _ e _ x _ g ___ i _ k _ l -c1aN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -c1AN_ a _ b _ c _ d _ e _ x _ g _i _ k _ l -c2IL_ a _ _ _ c _ d _ e _ x _ g _ h _ i _ k _ l -c2iL_ a ___ c _ d _ e _ x _ g _ h _ i _ k _ l -c2aL_ a __ c _ d _ e _ x _ g _ h _ i _ k _ l -c2AL_ a _c _ d _ e _ x _ g _ h _ i _ k _ l -c2Il_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -c2il_ a _ b _ c ___ e _ x _ g _ h _ i _ k _ l -c2al_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -c2Al_ a _ b _ c _e _ x _ g _ h _ i _ k _ l -c2I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -c2i_ a _ b _ c _ d _ e ___ g _ h _ i _ k _ l -c2a_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -c2A_ a _ b _ c _ d _ e _g _ h _ i _ k _ l -c2In_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -c2in_ a _ b _ c _ d _ e _ x _ g ___ i _ k _ l -c2an_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -c2An_ a _ b _ c _ d _ e _ x _ g _i _ k _ l -c2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ _ _ l -c2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i ___ l -c2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i __ l -c2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i _l -dIL_ a _ b _ c _ _ e _ x _ g _ h _ i _ k _ l -diL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -daL_ a _ b _ c _ e _ x _ g _ h _ i _ k _ l -dAL_ a _ b _ c e _ x _ g _ h _ i _ k _ l -dIl_ a _ b _ c _ d _ _ x _ g _ h _ i _ k _ l -dil_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -dal_ a _ b _ c _ d _ x _ g _ h _ i _ k _ l -dAl_ a _ b _ c _ d x _ g _ h _ i _ k _ l -dI_ a _ b _ c _ d _ e _ _ g _ h _ i _ k _ l -di_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -da_ a _ b _ c _ d _ e _ g _ h _ i _ k _ l -dA_ a _ b _ c _ d _ e g _ h _ i _ k _ l -dIn_ a _ b _ c _ d _ e _ x _ _ h _ i _ k _ l -din_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -dan_ a _ b _ c _ d _ e _ x _ h _ i _ k _ l -dAn_ a _ b _ c _ d _ e _ x h _ i _ k _ l -dIN_ a _ b _ c _ d _ e _ x _ g _ _ i _ k _ l -diN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -daN_ a _ b _ c _ d _ e _ x _ g _ i _ k _ l -dAN_ a _ b _ c _ d _ e _ x _ g i _ k _ l -d1IL_ a _ b _ c _ _ e _ x _ g _ h _ i _ k _ l -d1iL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -d1aL_ a _ b _ c _ e _ x _ g _ h _ i _ k _ l -d1AL_ a _ b _ c e _ x _ g _ h _ i _ k _ l -d1Il_ a _ b _ c _ d _ _ x _ g _ h _ i _ k _ l -d1il_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -d1al_ a _ b _ c _ d _ x _ g _ h _ i _ k _ l -d1Al_ a _ b _ c _ d x _ g _ h _ i _ k _ l -d1I_ a _ b _ c _ d _ e _ _ g _ h _ i _ k _ l -d1i_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -d1a_ a _ b _ c _ d _ e _ g _ h _ i _ k _ l -d1A_ a _ b _ c _ d _ e g _ h _ i _ k _ l -d1In_ a _ b _ c _ d _ e _ x _ _ h _ i _ k _ l -d1in_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -d1an_ a _ b _ c _ d _ e _ x _ h _ i _ k _ l -d1An_ a _ b _ c _ d _ e _ x h _ i _ k _ l -d1IN_ a _ b _ c _ d _ e _ x _ g _ _ i _ k _ l -d1iN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -d1aN_ a _ b _ c _ d _ e _ x _ g _ i _ k _ l -d1AN_ a _ b _ c _ d _ e _ x _ g i _ k _ l -d2IL_ a _ _ c _ d _ e _ x _ g _ h _ i _ k _ l -d2iL_ a __ c _ d _ e _ x _ g _ h _ i _ k _ l -d2aL_ a _ c _ d _ e _ x _ g _ h _ i _ k _ l -d2AL_ a c _ d _ e _ x _ g _ h _ i _ k _ l -d2Il_ a _ b _ c _ _ e _ x _ g _ h _ i _ k _ l -d2il_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -d2al_ a _ b _ c _ e _ x _ g _ h _ i _ k _ l -d2Al_ a _ b _ c e _ x _ g _ h _ i _ k _ l -d2I_ a _ b _ c _ d _ e _ _ g _ h _ i _ k _ l -d2i_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -d2a_ a _ b _ c _ d _ e _ g _ h _ i _ k _ l -d2A_ a _ b _ c _ d _ e g _ h _ i _ k _ l -d2In_ a _ b _ c _ d _ e _ x _ g _ _ i _ k _ l -d2in_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -d2an_ a _ b _ c _ d _ e _ x _ g _ i _ k _ l -d2An_ a _ b _ c _ d _ e _ x _ g i _ k _ l -d2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ _ l -d2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i __ l -d2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ l -d2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i l -yIL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'd' -yiL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' d ' -yaL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d ' -yAL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d _ ' -yIl_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'e' -yil_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' e ' -yal_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e ' -yAl_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e _ ' -yI_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'x' -yi_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' x ' -ya_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x ' -yA_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x _ ' -yIn_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'g' -yin_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' g ' -yan_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g ' -yAn_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g _ ' -yIN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'h' -yiN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' h ' -yaN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h ' -yAN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h _ ' -y1IL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'd' -y1iL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' d ' -y1aL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d ' -y1AL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d _ ' -y1Il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'e' -y1il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' e ' -y1al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e ' -y1Al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e _ ' -y1I_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'x' -y1i_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' x ' -y1a_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x ' -y1A_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x _ ' -y1In_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'g' -y1in_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' g ' -y1an_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g ' -y1An_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g _ ' -y1IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'h' -y1iN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' h ' -y1aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h ' -y1AN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h _ ' -y2IL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'b' -y2iL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' b ' -y2aL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ b ' -y2AL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ b _ ' -y2Il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'd' -y2il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' d ' -y2al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d ' -y2Al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d _ ' -y2I_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'x' -y2i_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' x ' -y2a_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x ' -y2A_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x _ ' -y2In_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'h' -y2in_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' h ' -y2an_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h ' -y2An_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h _ ' -y2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'k' -y2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' k ' -y2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ k ' -y2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ k _ ' -vIL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -viL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -vaL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -vAL_ a _ b _ c ______e _ x _ g _ h _ i _ k _ l -vIl_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -vil_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -val_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -vAl_ a _ b _ c _ d ______x _ g _ h _ i _ k _ l -vI_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -vi_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -va_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -vA_ a _ b _ c _ d _ e ______g _ h _ i _ k _ l -vIn_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -vin_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -van_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -vAn_ a _ b _ c _ d _ e _ x ______h _ i _ k _ l -vIN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -viN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -vaN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -vAN_ a _ b _ c _ d _ e _ x _ g ______i _ k _ l -v1IL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -v1iL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v1aL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v1AL_ a _ b _ c ______e _ x _ g _ h _ i _ k _ l -v1Il_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -v1il_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -v1al_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -v1Al_ a _ b _ c _ d ______x _ g _ h _ i _ k _ l -v1I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -v1i_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v1a_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v1A_ a _ b _ c _ d _ e ______g _ h _ i _ k _ l -v1In_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -v1in_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -v1an_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -v1An_ a _ b _ c _ d _ e _ x ______h _ i _ k _ l -v1IN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -v1iN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v1aN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v1AN_ a _ b _ c _ d _ e _ x _ g ______i _ k _ l -v2IL_ a _ _ _ c _ d _ e _ x _ g _ h _ i _ k _ l -v2iL_ a _____ c _ d _ e _ x _ g _ h _ i _ k _ l -v2aL_ a _____ c _ d _ e _ x _ g _ h _ i _ k _ l -v2AL_ a ______c _ d _ e _ x _ g _ h _ i _ k _ l -v2Il_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -v2il_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v2al_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v2Al_ a _ b _ c ______e _ x _ g _ h _ i _ k _ l -v2I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -v2i_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v2a_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v2A_ a _ b _ c _ d _ e ______g _ h _ i _ k _ l -v2In_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -v2in_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v2an_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v2An_ a _ b _ c _ d _ e _ x _ g ______i _ k _ l -v2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ _ _ l -v2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i _____ l -v2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _____ l -v2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i ______l -a * b * c * d * e * x * g * h * i * k * l -cIL* a * b * c * _ * e * x * g * h * i * k * l -ciL* a * b * c *_* e * x * g * h * i * k * l -caL* a * b * c _* e * x * g * h * i * k * l -cAL* a * b * c _e * x * g * h * i * k * l -cIl* a * b * c * d * _ * x * g * h * i * k * l -cil* a * b * c * d *_* x * g * h * i * k * l -cal* a * b * c * d _* x * g * h * i * k * l -cAl* a * b * c * d _x * g * h * i * k * l -cI* a * b * c * d * e * _ * g * h * i * k * l -ci* a * b * c * d * e *_* g * h * i * k * l -ca* a * b * c * d * e _* g * h * i * k * l -cA* a * b * c * d * e _g * h * i * k * l -cIn* a * b * c * d * e * x * _ * h * i * k * l -cin* a * b * c * d * e * x *_* h * i * k * l -can* a * b * c * d * e * x _* h * i * k * l -cAn* a * b * c * d * e * x _h * i * k * l -cIN* a * b * c * d * e * x * g * _ * i * k * l -ciN* a * b * c * d * e * x * g *_* i * k * l -caN* a * b * c * d * e * x * g _* i * k * l -cAN* a * b * c * d * e * x * g _i * k * l -c1IL* a * b * c * _ * e * x * g * h * i * k * l -c1iL* a * b * c *_* e * x * g * h * i * k * l -c1aL* a * b * c _* e * x * g * h * i * k * l -c1AL* a * b * c _e * x * g * h * i * k * l -c1Il* a * b * c * d * _ * x * g * h * i * k * l -c1il* a * b * c * d *_* x * g * h * i * k * l -c1al* a * b * c * d _* x * g * h * i * k * l -c1Al* a * b * c * d _x * g * h * i * k * l -c1I* a * b * c * d * e * _ * g * h * i * k * l -c1i* a * b * c * d * e *_* g * h * i * k * l -c1a* a * b * c * d * e _* g * h * i * k * l -c1A* a * b * c * d * e _g * h * i * k * l -c1In* a * b * c * d * e * x * _ * h * i * k * l -c1in* a * b * c * d * e * x *_* h * i * k * l -c1an* a * b * c * d * e * x _* h * i * k * l -c1An* a * b * c * d * e * x _h * i * k * l -c1IN* a * b * c * d * e * x * g * _ * i * k * l -c1iN* a * b * c * d * e * x * g *_* i * k * l -c1aN* a * b * c * d * e * x * g _* i * k * l -c1AN* a * b * c * d * e * x * g _i * k * l -c2IL* a * _ * c * d * e * x * g * h * i * k * l -c2iL* a *_* c * d * e * x * g * h * i * k * l -c2aL* a _* c * d * e * x * g * h * i * k * l -c2AL* a _c * d * e * x * g * h * i * k * l -c2Il* a * b * c * _ * e * x * g * h * i * k * l -c2il* a * b * c *_* e * x * g * h * i * k * l -c2al* a * b * c _* e * x * g * h * i * k * l -c2Al* a * b * c _e * x * g * h * i * k * l -c2I* a * b * c * d * e * _ * g * h * i * k * l -c2i* a * b * c * d * e *_* g * h * i * k * l -c2a* a * b * c * d * e _* g * h * i * k * l -c2A* a * b * c * d * e _g * h * i * k * l -c2In* a * b * c * d * e * x * g * _ * i * k * l -c2in* a * b * c * d * e * x * g *_* i * k * l -c2an* a * b * c * d * e * x * g _* i * k * l -c2An* a * b * c * d * e * x * g _i * k * l -c2IN* a * b * c * d * e * x * g * h * i * _ * l -c2iN* a * b * c * d * e * x * g * h * i *_* l -c2aN* a * b * c * d * e * x * g * h * i _* l -c2AN* a * b * c * d * e * x * g * h * i _l -dIL* a * b * c * * e * x * g * h * i * k * l -diL* a * b * c ** e * x * g * h * i * k * l -daL* a * b * c * e * x * g * h * i * k * l -dAL* a * b * c e * x * g * h * i * k * l -dIl* a * b * c * d * * x * g * h * i * k * l -dil* a * b * c * d ** x * g * h * i * k * l -dal* a * b * c * d * x * g * h * i * k * l -dAl* a * b * c * d x * g * h * i * k * l -dI* a * b * c * d * e * * g * h * i * k * l -di* a * b * c * d * e ** g * h * i * k * l -da* a * b * c * d * e * g * h * i * k * l -dA* a * b * c * d * e g * h * i * k * l -dIn* a * b * c * d * e * x * * h * i * k * l -din* a * b * c * d * e * x ** h * i * k * l -dan* a * b * c * d * e * x * h * i * k * l -dAn* a * b * c * d * e * x h * i * k * l -dIN* a * b * c * d * e * x * g * * i * k * l -diN* a * b * c * d * e * x * g ** i * k * l -daN* a * b * c * d * e * x * g * i * k * l -dAN* a * b * c * d * e * x * g i * k * l -d1IL* a * b * c * * e * x * g * h * i * k * l -d1iL* a * b * c ** e * x * g * h * i * k * l -d1aL* a * b * c * e * x * g * h * i * k * l -d1AL* a * b * c e * x * g * h * i * k * l -d1Il* a * b * c * d * * x * g * h * i * k * l -d1il* a * b * c * d ** x * g * h * i * k * l -d1al* a * b * c * d * x * g * h * i * k * l -d1Al* a * b * c * d x * g * h * i * k * l -d1I* a * b * c * d * e * * g * h * i * k * l -d1i* a * b * c * d * e ** g * h * i * k * l -d1a* a * b * c * d * e * g * h * i * k * l -d1A* a * b * c * d * e g * h * i * k * l -d1In* a * b * c * d * e * x * * h * i * k * l -d1in* a * b * c * d * e * x ** h * i * k * l -d1an* a * b * c * d * e * x * h * i * k * l -d1An* a * b * c * d * e * x h * i * k * l -d1IN* a * b * c * d * e * x * g * * i * k * l -d1iN* a * b * c * d * e * x * g ** i * k * l -d1aN* a * b * c * d * e * x * g * i * k * l -d1AN* a * b * c * d * e * x * g i * k * l -d2IL* a * * c * d * e * x * g * h * i * k * l -d2iL* a ** c * d * e * x * g * h * i * k * l -d2aL* a * c * d * e * x * g * h * i * k * l -d2AL* a c * d * e * x * g * h * i * k * l -d2Il* a * b * c * * e * x * g * h * i * k * l -d2il* a * b * c ** e * x * g * h * i * k * l -d2al* a * b * c * e * x * g * h * i * k * l -d2Al* a * b * c e * x * g * h * i * k * l -d2I* a * b * c * d * e * * g * h * i * k * l -d2i* a * b * c * d * e ** g * h * i * k * l -d2a* a * b * c * d * e * g * h * i * k * l -d2A* a * b * c * d * e g * h * i * k * l -d2In* a * b * c * d * e * x * g * * i * k * l -d2in* a * b * c * d * e * x * g ** i * k * l -d2an* a * b * c * d * e * x * g * i * k * l -d2An* a * b * c * d * e * x * g i * k * l -d2IN* a * b * c * d * e * x * g * h * i * * l -d2iN* a * b * c * d * e * x * g * h * i ** l -d2aN* a * b * c * d * e * x * g * h * i * l -d2AN* a * b * c * d * e * x * g * h * i l -yIL* a * b * c * d * e * x * g * h * i * k * l 'd' -yiL* a * b * c * d * e * x * g * h * i * k * l ' d ' -yaL* a * b * c * d * e * x * g * h * i * k * l '* d ' -yAL* a * b * c * d * e * x * g * h * i * k * l '* d * ' -yIl* a * b * c * d * e * x * g * h * i * k * l 'e' -yil* a * b * c * d * e * x * g * h * i * k * l ' e ' -yal* a * b * c * d * e * x * g * h * i * k * l '* e ' -yAl* a * b * c * d * e * x * g * h * i * k * l '* e * ' -yI* a * b * c * d * e * x * g * h * i * k * l 'x' -yi* a * b * c * d * e * x * g * h * i * k * l ' x ' -ya* a * b * c * d * e * x * g * h * i * k * l '* x ' -yA* a * b * c * d * e * x * g * h * i * k * l '* x * ' -yIn* a * b * c * d * e * x * g * h * i * k * l 'g' -yin* a * b * c * d * e * x * g * h * i * k * l ' g ' -yan* a * b * c * d * e * x * g * h * i * k * l '* g ' -yAn* a * b * c * d * e * x * g * h * i * k * l '* g * ' -yIN* a * b * c * d * e * x * g * h * i * k * l 'h' -yiN* a * b * c * d * e * x * g * h * i * k * l ' h ' -yaN* a * b * c * d * e * x * g * h * i * k * l '* h ' -yAN* a * b * c * d * e * x * g * h * i * k * l '* h * ' -y1IL* a * b * c * d * e * x * g * h * i * k * l 'd' -y1iL* a * b * c * d * e * x * g * h * i * k * l ' d ' -y1aL* a * b * c * d * e * x * g * h * i * k * l '* d ' -y1AL* a * b * c * d * e * x * g * h * i * k * l '* d * ' -y1Il* a * b * c * d * e * x * g * h * i * k * l 'e' -y1il* a * b * c * d * e * x * g * h * i * k * l ' e ' -y1al* a * b * c * d * e * x * g * h * i * k * l '* e ' -y1Al* a * b * c * d * e * x * g * h * i * k * l '* e * ' -y1I* a * b * c * d * e * x * g * h * i * k * l 'x' -y1i* a * b * c * d * e * x * g * h * i * k * l ' x ' -y1a* a * b * c * d * e * x * g * h * i * k * l '* x ' -y1A* a * b * c * d * e * x * g * h * i * k * l '* x * ' -y1In* a * b * c * d * e * x * g * h * i * k * l 'g' -y1in* a * b * c * d * e * x * g * h * i * k * l ' g ' -y1an* a * b * c * d * e * x * g * h * i * k * l '* g ' -y1An* a * b * c * d * e * x * g * h * i * k * l '* g * ' -y1IN* a * b * c * d * e * x * g * h * i * k * l 'h' -y1iN* a * b * c * d * e * x * g * h * i * k * l ' h ' -y1aN* a * b * c * d * e * x * g * h * i * k * l '* h ' -y1AN* a * b * c * d * e * x * g * h * i * k * l '* h * ' -y2IL* a * b * c * d * e * x * g * h * i * k * l 'b' -y2iL* a * b * c * d * e * x * g * h * i * k * l ' b ' -y2aL* a * b * c * d * e * x * g * h * i * k * l '* b ' -y2AL* a * b * c * d * e * x * g * h * i * k * l '* b * ' -y2Il* a * b * c * d * e * x * g * h * i * k * l 'd' -y2il* a * b * c * d * e * x * g * h * i * k * l ' d ' -y2al* a * b * c * d * e * x * g * h * i * k * l '* d ' -y2Al* a * b * c * d * e * x * g * h * i * k * l '* d * ' -y2I* a * b * c * d * e * x * g * h * i * k * l 'x' -y2i* a * b * c * d * e * x * g * h * i * k * l ' x ' -y2a* a * b * c * d * e * x * g * h * i * k * l '* x ' -y2A* a * b * c * d * e * x * g * h * i * k * l '* x * ' -y2In* a * b * c * d * e * x * g * h * i * k * l 'h' -y2in* a * b * c * d * e * x * g * h * i * k * l ' h ' -y2an* a * b * c * d * e * x * g * h * i * k * l '* h ' -y2An* a * b * c * d * e * x * g * h * i * k * l '* h * ' -y2IN* a * b * c * d * e * x * g * h * i * k * l 'k' -y2iN* a * b * c * d * e * x * g * h * i * k * l ' k ' -y2aN* a * b * c * d * e * x * g * h * i * k * l '* k ' -y2AN* a * b * c * d * e * x * g * h * i * k * l '* k * ' -vIL* a * b * c * _ * e * x * g * h * i * k * l -viL* a * b * c *___* e * x * g * h * i * k * l -vaL* a * b * c ____* e * x * g * h * i * k * l -vAL* a * b * c ______e * x * g * h * i * k * l -vIl* a * b * c * d * _ * x * g * h * i * k * l -vil* a * b * c * d *___* x * g * h * i * k * l -val* a * b * c * d ____* x * g * h * i * k * l -vAl* a * b * c * d ______x * g * h * i * k * l -vI* a * b * c * d * e * _ * g * h * i * k * l -vi* a * b * c * d * e *___* g * h * i * k * l -va* a * b * c * d * e ____* g * h * i * k * l -vA* a * b * c * d * e ______g * h * i * k * l -vIn* a * b * c * d * e * x * _ * h * i * k * l -vin* a * b * c * d * e * x *___* h * i * k * l -van* a * b * c * d * e * x ____* h * i * k * l -vAn* a * b * c * d * e * x ______h * i * k * l -vIN* a * b * c * d * e * x * g * _ * i * k * l -viN* a * b * c * d * e * x * g *___* i * k * l -vaN* a * b * c * d * e * x * g ____* i * k * l -vAN* a * b * c * d * e * x * g ______i * k * l -v1IL* a * b * c * _ * e * x * g * h * i * k * l -v1iL* a * b * c *___* e * x * g * h * i * k * l -v1aL* a * b * c ____* e * x * g * h * i * k * l -v1AL* a * b * c ______e * x * g * h * i * k * l -v1Il* a * b * c * d * _ * x * g * h * i * k * l -v1il* a * b * c * d *___* x * g * h * i * k * l -v1al* a * b * c * d ____* x * g * h * i * k * l -v1Al* a * b * c * d ______x * g * h * i * k * l -v1I* a * b * c * d * e * _ * g * h * i * k * l -v1i* a * b * c * d * e *___* g * h * i * k * l -v1a* a * b * c * d * e ____* g * h * i * k * l -v1A* a * b * c * d * e ______g * h * i * k * l -v1In* a * b * c * d * e * x * _ * h * i * k * l -v1in* a * b * c * d * e * x *___* h * i * k * l -v1an* a * b * c * d * e * x ____* h * i * k * l -v1An* a * b * c * d * e * x ______h * i * k * l -v1IN* a * b * c * d * e * x * g * _ * i * k * l -v1iN* a * b * c * d * e * x * g *___* i * k * l -v1aN* a * b * c * d * e * x * g ____* i * k * l -v1AN* a * b * c * d * e * x * g ______i * k * l -v2IL* a * _ * c * d * e * x * g * h * i * k * l -v2iL* a *___* c * d * e * x * g * h * i * k * l -v2aL* a ____* c * d * e * x * g * h * i * k * l -v2AL* a ______c * d * e * x * g * h * i * k * l -v2Il* a * b * c * _ * e * x * g * h * i * k * l -v2il* a * b * c *___* e * x * g * h * i * k * l -v2al* a * b * c ____* e * x * g * h * i * k * l -v2Al* a * b * c ______e * x * g * h * i * k * l -v2I* a * b * c * d * e * _ * g * h * i * k * l -v2i* a * b * c * d * e *___* g * h * i * k * l -v2a* a * b * c * d * e ____* g * h * i * k * l -v2A* a * b * c * d * e ______g * h * i * k * l -v2In* a * b * c * d * e * x * g * _ * i * k * l -v2in* a * b * c * d * e * x * g *___* i * k * l -v2an* a * b * c * d * e * x * g ____* i * k * l -v2An* a * b * c * d * e * x * g ______i * k * l -v2IN* a * b * c * d * e * x * g * h * i * _ * l -v2iN* a * b * c * d * e * x * g * h * i *___* l -v2aN* a * b * c * d * e * x * g * h * i ____* l -v2AN* a * b * c * d * e * x * g * h * i ______l -a # b # c # d # e # x # g # h # i # k # l -cIL# a # b # c # _ # e # x # g # h # i # k # l -ciL# a # b # c #_# e # x # g # h # i # k # l -caL# a # b # c _# e # x # g # h # i # k # l -cAL# a # b # c _e # x # g # h # i # k # l -cIl# a # b # c # d # _ # x # g # h # i # k # l -cil# a # b # c # d #_# x # g # h # i # k # l -cal# a # b # c # d _# x # g # h # i # k # l -cAl# a # b # c # d _x # g # h # i # k # l -cI# a # b # c # d # e # _ # g # h # i # k # l -ci# a # b # c # d # e #_# g # h # i # k # l -ca# a # b # c # d # e _# g # h # i # k # l -cA# a # b # c # d # e _g # h # i # k # l -cIn# a # b # c # d # e # x # _ # h # i # k # l -cin# a # b # c # d # e # x #_# h # i # k # l -can# a # b # c # d # e # x _# h # i # k # l -cAn# a # b # c # d # e # x _h # i # k # l -cIN# a # b # c # d # e # x # g # _ # i # k # l -ciN# a # b # c # d # e # x # g #_# i # k # l -caN# a # b # c # d # e # x # g _# i # k # l -cAN# a # b # c # d # e # x # g _i # k # l -c1IL# a # b # c # _ # e # x # g # h # i # k # l -c1iL# a # b # c #_# e # x # g # h # i # k # l -c1aL# a # b # c _# e # x # g # h # i # k # l -c1AL# a # b # c _e # x # g # h # i # k # l -c1Il# a # b # c # d # _ # x # g # h # i # k # l -c1il# a # b # c # d #_# x # g # h # i # k # l -c1al# a # b # c # d _# x # g # h # i # k # l -c1Al# a # b # c # d _x # g # h # i # k # l -c1I# a # b # c # d # e # _ # g # h # i # k # l -c1i# a # b # c # d # e #_# g # h # i # k # l -c1a# a # b # c # d # e _# g # h # i # k # l -c1A# a # b # c # d # e _g # h # i # k # l -c1In# a # b # c # d # e # x # _ # h # i # k # l -c1in# a # b # c # d # e # x #_# h # i # k # l -c1an# a # b # c # d # e # x _# h # i # k # l -c1An# a # b # c # d # e # x _h # i # k # l -c1IN# a # b # c # d # e # x # g # _ # i # k # l -c1iN# a # b # c # d # e # x # g #_# i # k # l -c1aN# a # b # c # d # e # x # g _# i # k # l -c1AN# a # b # c # d # e # x # g _i # k # l -c2IL# a # _ # c # d # e # x # g # h # i # k # l -c2iL# a #_# c # d # e # x # g # h # i # k # l -c2aL# a _# c # d # e # x # g # h # i # k # l -c2AL# a _c # d # e # x # g # h # i # k # l -c2Il# a # b # c # _ # e # x # g # h # i # k # l -c2il# a # b # c #_# e # x # g # h # i # k # l -c2al# a # b # c _# e # x # g # h # i # k # l -c2Al# a # b # c _e # x # g # h # i # k # l -c2I# a # b # c # d # e # _ # g # h # i # k # l -c2i# a # b # c # d # e #_# g # h # i # k # l -c2a# a # b # c # d # e _# g # h # i # k # l -c2A# a # b # c # d # e _g # h # i # k # l -c2In# a # b # c # d # e # x # g # _ # i # k # l -c2in# a # b # c # d # e # x # g #_# i # k # l -c2an# a # b # c # d # e # x # g _# i # k # l -c2An# a # b # c # d # e # x # g _i # k # l -c2IN# a # b # c # d # e # x # g # h # i # _ # l -c2iN# a # b # c # d # e # x # g # h # i #_# l -c2aN# a # b # c # d # e # x # g # h # i _# l -c2AN# a # b # c # d # e # x # g # h # i _l -dIL# a # b # c # # e # x # g # h # i # k # l -diL# a # b # c ## e # x # g # h # i # k # l -daL# a # b # c # e # x # g # h # i # k # l -dAL# a # b # c e # x # g # h # i # k # l -dIl# a # b # c # d # # x # g # h # i # k # l -dil# a # b # c # d ## x # g # h # i # k # l -dal# a # b # c # d # x # g # h # i # k # l -dAl# a # b # c # d x # g # h # i # k # l -dI# a # b # c # d # e # # g # h # i # k # l -di# a # b # c # d # e ## g # h # i # k # l -da# a # b # c # d # e # g # h # i # k # l -dA# a # b # c # d # e g # h # i # k # l -dIn# a # b # c # d # e # x # # h # i # k # l -din# a # b # c # d # e # x ## h # i # k # l -dan# a # b # c # d # e # x # h # i # k # l -dAn# a # b # c # d # e # x h # i # k # l -dIN# a # b # c # d # e # x # g # # i # k # l -diN# a # b # c # d # e # x # g ## i # k # l -daN# a # b # c # d # e # x # g # i # k # l -dAN# a # b # c # d # e # x # g i # k # l -d1IL# a # b # c # # e # x # g # h # i # k # l -d1iL# a # b # c ## e # x # g # h # i # k # l -d1aL# a # b # c # e # x # g # h # i # k # l -d1AL# a # b # c e # x # g # h # i # k # l -d1Il# a # b # c # d # # x # g # h # i # k # l -d1il# a # b # c # d ## x # g # h # i # k # l -d1al# a # b # c # d # x # g # h # i # k # l -d1Al# a # b # c # d x # g # h # i # k # l -d1I# a # b # c # d # e # # g # h # i # k # l -d1i# a # b # c # d # e ## g # h # i # k # l -d1a# a # b # c # d # e # g # h # i # k # l -d1A# a # b # c # d # e g # h # i # k # l -d1In# a # b # c # d # e # x # # h # i # k # l -d1in# a # b # c # d # e # x ## h # i # k # l -d1an# a # b # c # d # e # x # h # i # k # l -d1An# a # b # c # d # e # x h # i # k # l -d1IN# a # b # c # d # e # x # g # # i # k # l -d1iN# a # b # c # d # e # x # g ## i # k # l -d1aN# a # b # c # d # e # x # g # i # k # l -d1AN# a # b # c # d # e # x # g i # k # l -d2IL# a # # c # d # e # x # g # h # i # k # l -d2iL# a ## c # d # e # x # g # h # i # k # l -d2aL# a # c # d # e # x # g # h # i # k # l -d2AL# a c # d # e # x # g # h # i # k # l -d2Il# a # b # c # # e # x # g # h # i # k # l -d2il# a # b # c ## e # x # g # h # i # k # l -d2al# a # b # c # e # x # g # h # i # k # l -d2Al# a # b # c e # x # g # h # i # k # l -d2I# a # b # c # d # e # # g # h # i # k # l -d2i# a # b # c # d # e ## g # h # i # k # l -d2a# a # b # c # d # e # g # h # i # k # l -d2A# a # b # c # d # e g # h # i # k # l -d2In# a # b # c # d # e # x # g # # i # k # l -d2in# a # b # c # d # e # x # g ## i # k # l -d2an# a # b # c # d # e # x # g # i # k # l -d2An# a # b # c # d # e # x # g i # k # l -d2IN# a # b # c # d # e # x # g # h # i # # l -d2iN# a # b # c # d # e # x # g # h # i ## l -d2aN# a # b # c # d # e # x # g # h # i # l -d2AN# a # b # c # d # e # x # g # h # i l -yIL# a # b # c # d # e # x # g # h # i # k # l 'd' -yiL# a # b # c # d # e # x # g # h # i # k # l ' d ' -yaL# a # b # c # d # e # x # g # h # i # k # l '# d ' -yAL# a # b # c # d # e # x # g # h # i # k # l '# d # ' -yIl# a # b # c # d # e # x # g # h # i # k # l 'e' -yil# a # b # c # d # e # x # g # h # i # k # l ' e ' -yal# a # b # c # d # e # x # g # h # i # k # l '# e ' -yAl# a # b # c # d # e # x # g # h # i # k # l '# e # ' -yI# a # b # c # d # e # x # g # h # i # k # l 'x' -yi# a # b # c # d # e # x # g # h # i # k # l ' x ' -ya# a # b # c # d # e # x # g # h # i # k # l '# x ' -yA# a # b # c # d # e # x # g # h # i # k # l '# x # ' -yIn# a # b # c # d # e # x # g # h # i # k # l 'g' -yin# a # b # c # d # e # x # g # h # i # k # l ' g ' -yan# a # b # c # d # e # x # g # h # i # k # l '# g ' -yAn# a # b # c # d # e # x # g # h # i # k # l '# g # ' -yIN# a # b # c # d # e # x # g # h # i # k # l 'h' -yiN# a # b # c # d # e # x # g # h # i # k # l ' h ' -yaN# a # b # c # d # e # x # g # h # i # k # l '# h ' -yAN# a # b # c # d # e # x # g # h # i # k # l '# h # ' -y1IL# a # b # c # d # e # x # g # h # i # k # l 'd' -y1iL# a # b # c # d # e # x # g # h # i # k # l ' d ' -y1aL# a # b # c # d # e # x # g # h # i # k # l '# d ' -y1AL# a # b # c # d # e # x # g # h # i # k # l '# d # ' -y1Il# a # b # c # d # e # x # g # h # i # k # l 'e' -y1il# a # b # c # d # e # x # g # h # i # k # l ' e ' -y1al# a # b # c # d # e # x # g # h # i # k # l '# e ' -y1Al# a # b # c # d # e # x # g # h # i # k # l '# e # ' -y1I# a # b # c # d # e # x # g # h # i # k # l 'x' -y1i# a # b # c # d # e # x # g # h # i # k # l ' x ' -y1a# a # b # c # d # e # x # g # h # i # k # l '# x ' -y1A# a # b # c # d # e # x # g # h # i # k # l '# x # ' -y1In# a # b # c # d # e # x # g # h # i # k # l 'g' -y1in# a # b # c # d # e # x # g # h # i # k # l ' g ' -y1an# a # b # c # d # e # x # g # h # i # k # l '# g ' -y1An# a # b # c # d # e # x # g # h # i # k # l '# g # ' -y1IN# a # b # c # d # e # x # g # h # i # k # l 'h' -y1iN# a # b # c # d # e # x # g # h # i # k # l ' h ' -y1aN# a # b # c # d # e # x # g # h # i # k # l '# h ' -y1AN# a # b # c # d # e # x # g # h # i # k # l '# h # ' -y2IL# a # b # c # d # e # x # g # h # i # k # l 'b' -y2iL# a # b # c # d # e # x # g # h # i # k # l ' b ' -y2aL# a # b # c # d # e # x # g # h # i # k # l '# b ' -y2AL# a # b # c # d # e # x # g # h # i # k # l '# b # ' -y2Il# a # b # c # d # e # x # g # h # i # k # l 'd' -y2il# a # b # c # d # e # x # g # h # i # k # l ' d ' -y2al# a # b # c # d # e # x # g # h # i # k # l '# d ' -y2Al# a # b # c # d # e # x # g # h # i # k # l '# d # ' -y2I# a # b # c # d # e # x # g # h # i # k # l 'x' -y2i# a # b # c # d # e # x # g # h # i # k # l ' x ' -y2a# a # b # c # d # e # x # g # h # i # k # l '# x ' -y2A# a # b # c # d # e # x # g # h # i # k # l '# x # ' -y2In# a # b # c # d # e # x # g # h # i # k # l 'h' -y2in# a # b # c # d # e # x # g # h # i # k # l ' h ' -y2an# a # b # c # d # e # x # g # h # i # k # l '# h ' -y2An# a # b # c # d # e # x # g # h # i # k # l '# h # ' -y2IN# a # b # c # d # e # x # g # h # i # k # l 'k' -y2iN# a # b # c # d # e # x # g # h # i # k # l ' k ' -y2aN# a # b # c # d # e # x # g # h # i # k # l '# k ' -y2AN# a # b # c # d # e # x # g # h # i # k # l '# k # ' -vIL# a # b # c # _ # e # x # g # h # i # k # l -viL# a # b # c #___# e # x # g # h # i # k # l -vaL# a # b # c ____# e # x # g # h # i # k # l -vAL# a # b # c ______e # x # g # h # i # k # l -vIl# a # b # c # d # _ # x # g # h # i # k # l -vil# a # b # c # d #___# x # g # h # i # k # l -val# a # b # c # d ____# x # g # h # i # k # l -vAl# a # b # c # d ______x # g # h # i # k # l -vI# a # b # c # d # e # _ # g # h # i # k # l -vi# a # b # c # d # e #___# g # h # i # k # l -va# a # b # c # d # e ____# g # h # i # k # l -vA# a # b # c # d # e ______g # h # i # k # l -vIn# a # b # c # d # e # x # _ # h # i # k # l -vin# a # b # c # d # e # x #___# h # i # k # l -van# a # b # c # d # e # x ____# h # i # k # l -vAn# a # b # c # d # e # x ______h # i # k # l -vIN# a # b # c # d # e # x # g # _ # i # k # l -viN# a # b # c # d # e # x # g #___# i # k # l -vaN# a # b # c # d # e # x # g ____# i # k # l -vAN# a # b # c # d # e # x # g ______i # k # l -v1IL# a # b # c # _ # e # x # g # h # i # k # l -v1iL# a # b # c #___# e # x # g # h # i # k # l -v1aL# a # b # c ____# e # x # g # h # i # k # l -v1AL# a # b # c ______e # x # g # h # i # k # l -v1Il# a # b # c # d # _ # x # g # h # i # k # l -v1il# a # b # c # d #___# x # g # h # i # k # l -v1al# a # b # c # d ____# x # g # h # i # k # l -v1Al# a # b # c # d ______x # g # h # i # k # l -v1I# a # b # c # d # e # _ # g # h # i # k # l -v1i# a # b # c # d # e #___# g # h # i # k # l -v1a# a # b # c # d # e ____# g # h # i # k # l -v1A# a # b # c # d # e ______g # h # i # k # l -v1In# a # b # c # d # e # x # _ # h # i # k # l -v1in# a # b # c # d # e # x #___# h # i # k # l -v1an# a # b # c # d # e # x ____# h # i # k # l -v1An# a # b # c # d # e # x ______h # i # k # l -v1IN# a # b # c # d # e # x # g # _ # i # k # l -v1iN# a # b # c # d # e # x # g #___# i # k # l -v1aN# a # b # c # d # e # x # g ____# i # k # l -v1AN# a # b # c # d # e # x # g ______i # k # l -v2IL# a # _ # c # d # e # x # g # h # i # k # l -v2iL# a #___# c # d # e # x # g # h # i # k # l -v2aL# a ____# c # d # e # x # g # h # i # k # l -v2AL# a ______c # d # e # x # g # h # i # k # l -v2Il# a # b # c # _ # e # x # g # h # i # k # l -v2il# a # b # c #___# e # x # g # h # i # k # l -v2al# a # b # c ____# e # x # g # h # i # k # l -v2Al# a # b # c ______e # x # g # h # i # k # l -v2I# a # b # c # d # e # _ # g # h # i # k # l -v2i# a # b # c # d # e #___# g # h # i # k # l -v2a# a # b # c # d # e ____# g # h # i # k # l -v2A# a # b # c # d # e ______g # h # i # k # l -v2In# a # b # c # d # e # x # g # _ # i # k # l -v2in# a # b # c # d # e # x # g #___# i # k # l -v2an# a # b # c # d # e # x # g ____# i # k # l -v2An# a # b # c # d # e # x # g ______i # k # l -v2IN# a # b # c # d # e # x # g # h # i # _ # l -v2iN# a # b # c # d # e # x # g # h # i #___# l -v2aN# a # b # c # d # e # x # g # h # i ____# l -v2AN# a # b # c # d # e # x # g # h # i ______l -a / b / c / d / e / x / g / h / i / k / l -cIL/ a / b / c / _ / e / x / g / h / i / k / l -ciL/ a / b / c /_/ e / x / g / h / i / k / l -caL/ a / b / c _/ e / x / g / h / i / k / l -cAL/ a / b / c _e / x / g / h / i / k / l -cIl/ a / b / c / d / _ / x / g / h / i / k / l -cil/ a / b / c / d /_/ x / g / h / i / k / l -cal/ a / b / c / d _/ x / g / h / i / k / l -cAl/ a / b / c / d _x / g / h / i / k / l -cI/ a / b / c / d / e / _ / g / h / i / k / l -ci/ a / b / c / d / e /_/ g / h / i / k / l -ca/ a / b / c / d / e _/ g / h / i / k / l -cA/ a / b / c / d / e _g / h / i / k / l -cIn/ a / b / c / d / e / x / _ / h / i / k / l -cin/ a / b / c / d / e / x /_/ h / i / k / l -can/ a / b / c / d / e / x _/ h / i / k / l -cAn/ a / b / c / d / e / x _h / i / k / l -cIN/ a / b / c / d / e / x / g / _ / i / k / l -ciN/ a / b / c / d / e / x / g /_/ i / k / l -caN/ a / b / c / d / e / x / g _/ i / k / l -cAN/ a / b / c / d / e / x / g _i / k / l -c1IL/ a / b / c / _ / e / x / g / h / i / k / l -c1iL/ a / b / c /_/ e / x / g / h / i / k / l -c1aL/ a / b / c _/ e / x / g / h / i / k / l -c1AL/ a / b / c _e / x / g / h / i / k / l -c1Il/ a / b / c / d / _ / x / g / h / i / k / l -c1il/ a / b / c / d /_/ x / g / h / i / k / l -c1al/ a / b / c / d _/ x / g / h / i / k / l -c1Al/ a / b / c / d _x / g / h / i / k / l -c1I/ a / b / c / d / e / _ / g / h / i / k / l -c1i/ a / b / c / d / e /_/ g / h / i / k / l -c1a/ a / b / c / d / e _/ g / h / i / k / l -c1A/ a / b / c / d / e _g / h / i / k / l -c1In/ a / b / c / d / e / x / _ / h / i / k / l -c1in/ a / b / c / d / e / x /_/ h / i / k / l -c1an/ a / b / c / d / e / x _/ h / i / k / l -c1An/ a / b / c / d / e / x _h / i / k / l -c1IN/ a / b / c / d / e / x / g / _ / i / k / l -c1iN/ a / b / c / d / e / x / g /_/ i / k / l -c1aN/ a / b / c / d / e / x / g _/ i / k / l -c1AN/ a / b / c / d / e / x / g _i / k / l -c2IL/ a / _ / c / d / e / x / g / h / i / k / l -c2iL/ a /_/ c / d / e / x / g / h / i / k / l -c2aL/ a _/ c / d / e / x / g / h / i / k / l -c2AL/ a _c / d / e / x / g / h / i / k / l -c2Il/ a / b / c / _ / e / x / g / h / i / k / l -c2il/ a / b / c /_/ e / x / g / h / i / k / l -c2al/ a / b / c _/ e / x / g / h / i / k / l -c2Al/ a / b / c _e / x / g / h / i / k / l -c2I/ a / b / c / d / e / _ / g / h / i / k / l -c2i/ a / b / c / d / e /_/ g / h / i / k / l -c2a/ a / b / c / d / e _/ g / h / i / k / l -c2A/ a / b / c / d / e _g / h / i / k / l -c2In/ a / b / c / d / e / x / g / _ / i / k / l -c2in/ a / b / c / d / e / x / g /_/ i / k / l -c2an/ a / b / c / d / e / x / g _/ i / k / l -c2An/ a / b / c / d / e / x / g _i / k / l -c2IN/ a / b / c / d / e / x / g / h / i / _ / l -c2iN/ a / b / c / d / e / x / g / h / i /_/ l -c2aN/ a / b / c / d / e / x / g / h / i _/ l -c2AN/ a / b / c / d / e / x / g / h / i _l -dIL/ a / b / c / / e / x / g / h / i / k / l -diL/ a / b / c // e / x / g / h / i / k / l -daL/ a / b / c / e / x / g / h / i / k / l -dAL/ a / b / c e / x / g / h / i / k / l -dIl/ a / b / c / d / / x / g / h / i / k / l -dil/ a / b / c / d // x / g / h / i / k / l -dal/ a / b / c / d / x / g / h / i / k / l -dAl/ a / b / c / d x / g / h / i / k / l -dI/ a / b / c / d / e / / g / h / i / k / l -di/ a / b / c / d / e // g / h / i / k / l -da/ a / b / c / d / e / g / h / i / k / l -dA/ a / b / c / d / e g / h / i / k / l -dIn/ a / b / c / d / e / x / / h / i / k / l -din/ a / b / c / d / e / x // h / i / k / l -dan/ a / b / c / d / e / x / h / i / k / l -dAn/ a / b / c / d / e / x h / i / k / l -dIN/ a / b / c / d / e / x / g / / i / k / l -diN/ a / b / c / d / e / x / g // i / k / l -daN/ a / b / c / d / e / x / g / i / k / l -dAN/ a / b / c / d / e / x / g i / k / l -d1IL/ a / b / c / / e / x / g / h / i / k / l -d1iL/ a / b / c // e / x / g / h / i / k / l -d1aL/ a / b / c / e / x / g / h / i / k / l -d1AL/ a / b / c e / x / g / h / i / k / l -d1Il/ a / b / c / d / / x / g / h / i / k / l -d1il/ a / b / c / d // x / g / h / i / k / l -d1al/ a / b / c / d / x / g / h / i / k / l -d1Al/ a / b / c / d x / g / h / i / k / l -d1I/ a / b / c / d / e / / g / h / i / k / l -d1i/ a / b / c / d / e // g / h / i / k / l -d1a/ a / b / c / d / e / g / h / i / k / l -d1A/ a / b / c / d / e g / h / i / k / l -d1In/ a / b / c / d / e / x / / h / i / k / l -d1in/ a / b / c / d / e / x // h / i / k / l -d1an/ a / b / c / d / e / x / h / i / k / l -d1An/ a / b / c / d / e / x h / i / k / l -d1IN/ a / b / c / d / e / x / g / / i / k / l -d1iN/ a / b / c / d / e / x / g // i / k / l -d1aN/ a / b / c / d / e / x / g / i / k / l -d1AN/ a / b / c / d / e / x / g i / k / l -d2IL/ a / / c / d / e / x / g / h / i / k / l -d2iL/ a // c / d / e / x / g / h / i / k / l -d2aL/ a / c / d / e / x / g / h / i / k / l -d2AL/ a c / d / e / x / g / h / i / k / l -d2Il/ a / b / c / / e / x / g / h / i / k / l -d2il/ a / b / c // e / x / g / h / i / k / l -d2al/ a / b / c / e / x / g / h / i / k / l -d2Al/ a / b / c e / x / g / h / i / k / l -d2I/ a / b / c / d / e / / g / h / i / k / l -d2i/ a / b / c / d / e // g / h / i / k / l -d2a/ a / b / c / d / e / g / h / i / k / l -d2A/ a / b / c / d / e g / h / i / k / l -d2In/ a / b / c / d / e / x / g / / i / k / l -d2in/ a / b / c / d / e / x / g // i / k / l -d2an/ a / b / c / d / e / x / g / i / k / l -d2An/ a / b / c / d / e / x / g i / k / l -d2IN/ a / b / c / d / e / x / g / h / i / / l -d2iN/ a / b / c / d / e / x / g / h / i // l -d2aN/ a / b / c / d / e / x / g / h / i / l -d2AN/ a / b / c / d / e / x / g / h / i l -yIL/ a / b / c / d / e / x / g / h / i / k / l 'd' -yiL/ a / b / c / d / e / x / g / h / i / k / l ' d ' -yaL/ a / b / c / d / e / x / g / h / i / k / l '/ d ' -yAL/ a / b / c / d / e / x / g / h / i / k / l '/ d / ' -yIl/ a / b / c / d / e / x / g / h / i / k / l 'e' -yil/ a / b / c / d / e / x / g / h / i / k / l ' e ' -yal/ a / b / c / d / e / x / g / h / i / k / l '/ e ' -yAl/ a / b / c / d / e / x / g / h / i / k / l '/ e / ' -yI/ a / b / c / d / e / x / g / h / i / k / l 'x' -yi/ a / b / c / d / e / x / g / h / i / k / l ' x ' -ya/ a / b / c / d / e / x / g / h / i / k / l '/ x ' -yA/ a / b / c / d / e / x / g / h / i / k / l '/ x / ' -yIn/ a / b / c / d / e / x / g / h / i / k / l 'g' -yin/ a / b / c / d / e / x / g / h / i / k / l ' g ' -yan/ a / b / c / d / e / x / g / h / i / k / l '/ g ' -yAn/ a / b / c / d / e / x / g / h / i / k / l '/ g / ' -yIN/ a / b / c / d / e / x / g / h / i / k / l 'h' -yiN/ a / b / c / d / e / x / g / h / i / k / l ' h ' -yaN/ a / b / c / d / e / x / g / h / i / k / l '/ h ' -yAN/ a / b / c / d / e / x / g / h / i / k / l '/ h / ' -y1IL/ a / b / c / d / e / x / g / h / i / k / l 'd' -y1iL/ a / b / c / d / e / x / g / h / i / k / l ' d ' -y1aL/ a / b / c / d / e / x / g / h / i / k / l '/ d ' -y1AL/ a / b / c / d / e / x / g / h / i / k / l '/ d / ' -y1Il/ a / b / c / d / e / x / g / h / i / k / l 'e' -y1il/ a / b / c / d / e / x / g / h / i / k / l ' e ' -y1al/ a / b / c / d / e / x / g / h / i / k / l '/ e ' -y1Al/ a / b / c / d / e / x / g / h / i / k / l '/ e / ' -y1I/ a / b / c / d / e / x / g / h / i / k / l 'x' -y1i/ a / b / c / d / e / x / g / h / i / k / l ' x ' -y1a/ a / b / c / d / e / x / g / h / i / k / l '/ x ' -y1A/ a / b / c / d / e / x / g / h / i / k / l '/ x / ' -y1In/ a / b / c / d / e / x / g / h / i / k / l 'g' -y1in/ a / b / c / d / e / x / g / h / i / k / l ' g ' -y1an/ a / b / c / d / e / x / g / h / i / k / l '/ g ' -y1An/ a / b / c / d / e / x / g / h / i / k / l '/ g / ' -y1IN/ a / b / c / d / e / x / g / h / i / k / l 'h' -y1iN/ a / b / c / d / e / x / g / h / i / k / l ' h ' -y1aN/ a / b / c / d / e / x / g / h / i / k / l '/ h ' -y1AN/ a / b / c / d / e / x / g / h / i / k / l '/ h / ' -y2IL/ a / b / c / d / e / x / g / h / i / k / l 'b' -y2iL/ a / b / c / d / e / x / g / h / i / k / l ' b ' -y2aL/ a / b / c / d / e / x / g / h / i / k / l '/ b ' -y2AL/ a / b / c / d / e / x / g / h / i / k / l '/ b / ' -y2Il/ a / b / c / d / e / x / g / h / i / k / l 'd' -y2il/ a / b / c / d / e / x / g / h / i / k / l ' d ' -y2al/ a / b / c / d / e / x / g / h / i / k / l '/ d ' -y2Al/ a / b / c / d / e / x / g / h / i / k / l '/ d / ' -y2I/ a / b / c / d / e / x / g / h / i / k / l 'x' -y2i/ a / b / c / d / e / x / g / h / i / k / l ' x ' -y2a/ a / b / c / d / e / x / g / h / i / k / l '/ x ' -y2A/ a / b / c / d / e / x / g / h / i / k / l '/ x / ' -y2In/ a / b / c / d / e / x / g / h / i / k / l 'h' -y2in/ a / b / c / d / e / x / g / h / i / k / l ' h ' -y2an/ a / b / c / d / e / x / g / h / i / k / l '/ h ' -y2An/ a / b / c / d / e / x / g / h / i / k / l '/ h / ' -y2IN/ a / b / c / d / e / x / g / h / i / k / l 'k' -y2iN/ a / b / c / d / e / x / g / h / i / k / l ' k ' -y2aN/ a / b / c / d / e / x / g / h / i / k / l '/ k ' -y2AN/ a / b / c / d / e / x / g / h / i / k / l '/ k / ' -vIL/ a / b / c / _ / e / x / g / h / i / k / l -viL/ a / b / c /___/ e / x / g / h / i / k / l -vaL/ a / b / c ____/ e / x / g / h / i / k / l -vAL/ a / b / c ______e / x / g / h / i / k / l -vIl/ a / b / c / d / _ / x / g / h / i / k / l -vil/ a / b / c / d /___/ x / g / h / i / k / l -val/ a / b / c / d ____/ x / g / h / i / k / l -vAl/ a / b / c / d ______x / g / h / i / k / l -vI/ a / b / c / d / e / _ / g / h / i / k / l -vi/ a / b / c / d / e /___/ g / h / i / k / l -va/ a / b / c / d / e ____/ g / h / i / k / l -vA/ a / b / c / d / e ______g / h / i / k / l -vIn/ a / b / c / d / e / x / _ / h / i / k / l -vin/ a / b / c / d / e / x /___/ h / i / k / l -van/ a / b / c / d / e / x ____/ h / i / k / l -vAn/ a / b / c / d / e / x ______h / i / k / l -vIN/ a / b / c / d / e / x / g / _ / i / k / l -viN/ a / b / c / d / e / x / g /___/ i / k / l -vaN/ a / b / c / d / e / x / g ____/ i / k / l -vAN/ a / b / c / d / e / x / g ______i / k / l -v1IL/ a / b / c / _ / e / x / g / h / i / k / l -v1iL/ a / b / c /___/ e / x / g / h / i / k / l -v1aL/ a / b / c ____/ e / x / g / h / i / k / l -v1AL/ a / b / c ______e / x / g / h / i / k / l -v1Il/ a / b / c / d / _ / x / g / h / i / k / l -v1il/ a / b / c / d /___/ x / g / h / i / k / l -v1al/ a / b / c / d ____/ x / g / h / i / k / l -v1Al/ a / b / c / d ______x / g / h / i / k / l -v1I/ a / b / c / d / e / _ / g / h / i / k / l -v1i/ a / b / c / d / e /___/ g / h / i / k / l -v1a/ a / b / c / d / e ____/ g / h / i / k / l -v1A/ a / b / c / d / e ______g / h / i / k / l -v1In/ a / b / c / d / e / x / _ / h / i / k / l -v1in/ a / b / c / d / e / x /___/ h / i / k / l -v1an/ a / b / c / d / e / x ____/ h / i / k / l -v1An/ a / b / c / d / e / x ______h / i / k / l -v1IN/ a / b / c / d / e / x / g / _ / i / k / l -v1iN/ a / b / c / d / e / x / g /___/ i / k / l -v1aN/ a / b / c / d / e / x / g ____/ i / k / l -v1AN/ a / b / c / d / e / x / g ______i / k / l -v2IL/ a / _ / c / d / e / x / g / h / i / k / l -v2iL/ a /___/ c / d / e / x / g / h / i / k / l -v2aL/ a ____/ c / d / e / x / g / h / i / k / l -v2AL/ a ______c / d / e / x / g / h / i / k / l -v2Il/ a / b / c / _ / e / x / g / h / i / k / l -v2il/ a / b / c /___/ e / x / g / h / i / k / l -v2al/ a / b / c ____/ e / x / g / h / i / k / l -v2Al/ a / b / c ______e / x / g / h / i / k / l -v2I/ a / b / c / d / e / _ / g / h / i / k / l -v2i/ a / b / c / d / e /___/ g / h / i / k / l -v2a/ a / b / c / d / e ____/ g / h / i / k / l -v2A/ a / b / c / d / e ______g / h / i / k / l -v2In/ a / b / c / d / e / x / g / _ / i / k / l -v2in/ a / b / c / d / e / x / g /___/ i / k / l -v2an/ a / b / c / d / e / x / g ____/ i / k / l -v2An/ a / b / c / d / e / x / g ______i / k / l -v2IN/ a / b / c / d / e / x / g / h / i / _ / l -v2iN/ a / b / c / d / e / x / g / h / i /___/ l -v2aN/ a / b / c / d / e / x / g / h / i ____/ l -v2AN/ a / b / c / d / e / x / g / h / i ______l -a | b | c | d | e | x | g | h | i | k | l -cIL| a | b | c | _ | e | x | g | h | i | k | l -ciL| a | b | c |_| e | x | g | h | i | k | l -caL| a | b | c _| e | x | g | h | i | k | l -cAL| a | b | c _e | x | g | h | i | k | l -cIl| a | b | c | d | _ | x | g | h | i | k | l -cil| a | b | c | d |_| x | g | h | i | k | l -cal| a | b | c | d _| x | g | h | i | k | l -cAl| a | b | c | d _x | g | h | i | k | l -cI| a | b | c | d | e | _ | g | h | i | k | l -ci| a | b | c | d | e |_| g | h | i | k | l -ca| a | b | c | d | e _| g | h | i | k | l -cA| a | b | c | d | e _g | h | i | k | l -cIn| a | b | c | d | e | x | _ | h | i | k | l -cin| a | b | c | d | e | x |_| h | i | k | l -can| a | b | c | d | e | x _| h | i | k | l -cAn| a | b | c | d | e | x _h | i | k | l -cIN| a | b | c | d | e | x | g | _ | i | k | l -ciN| a | b | c | d | e | x | g |_| i | k | l -caN| a | b | c | d | e | x | g _| i | k | l -cAN| a | b | c | d | e | x | g _i | k | l -c1IL| a | b | c | _ | e | x | g | h | i | k | l -c1iL| a | b | c |_| e | x | g | h | i | k | l -c1aL| a | b | c _| e | x | g | h | i | k | l -c1AL| a | b | c _e | x | g | h | i | k | l -c1Il| a | b | c | d | _ | x | g | h | i | k | l -c1il| a | b | c | d |_| x | g | h | i | k | l -c1al| a | b | c | d _| x | g | h | i | k | l -c1Al| a | b | c | d _x | g | h | i | k | l -c1I| a | b | c | d | e | _ | g | h | i | k | l -c1i| a | b | c | d | e |_| g | h | i | k | l -c1a| a | b | c | d | e _| g | h | i | k | l -c1A| a | b | c | d | e _g | h | i | k | l -c1In| a | b | c | d | e | x | _ | h | i | k | l -c1in| a | b | c | d | e | x |_| h | i | k | l -c1an| a | b | c | d | e | x _| h | i | k | l -c1An| a | b | c | d | e | x _h | i | k | l -c1IN| a | b | c | d | e | x | g | _ | i | k | l -c1iN| a | b | c | d | e | x | g |_| i | k | l -c1aN| a | b | c | d | e | x | g _| i | k | l -c1AN| a | b | c | d | e | x | g _i | k | l -c2IL| a | _ | c | d | e | x | g | h | i | k | l -c2iL| a |_| c | d | e | x | g | h | i | k | l -c2aL| a _| c | d | e | x | g | h | i | k | l -c2AL| a _c | d | e | x | g | h | i | k | l -c2Il| a | b | c | _ | e | x | g | h | i | k | l -c2il| a | b | c |_| e | x | g | h | i | k | l -c2al| a | b | c _| e | x | g | h | i | k | l -c2Al| a | b | c _e | x | g | h | i | k | l -c2I| a | b | c | d | e | _ | g | h | i | k | l -c2i| a | b | c | d | e |_| g | h | i | k | l -c2a| a | b | c | d | e _| g | h | i | k | l -c2A| a | b | c | d | e _g | h | i | k | l -c2In| a | b | c | d | e | x | g | _ | i | k | l -c2in| a | b | c | d | e | x | g |_| i | k | l -c2an| a | b | c | d | e | x | g _| i | k | l -c2An| a | b | c | d | e | x | g _i | k | l -c2IN| a | b | c | d | e | x | g | h | i | _ | l -c2iN| a | b | c | d | e | x | g | h | i |_| l -c2aN| a | b | c | d | e | x | g | h | i _| l -c2AN| a | b | c | d | e | x | g | h | i _l -dIL| a | b | c | | e | x | g | h | i | k | l -diL| a | b | c || e | x | g | h | i | k | l -daL| a | b | c | e | x | g | h | i | k | l -dAL| a | b | c e | x | g | h | i | k | l -dIl| a | b | c | d | | x | g | h | i | k | l -dil| a | b | c | d || x | g | h | i | k | l -dal| a | b | c | d | x | g | h | i | k | l -dAl| a | b | c | d x | g | h | i | k | l -dI| a | b | c | d | e | | g | h | i | k | l -di| a | b | c | d | e || g | h | i | k | l -da| a | b | c | d | e | g | h | i | k | l -dA| a | b | c | d | e g | h | i | k | l -dIn| a | b | c | d | e | x | | h | i | k | l -din| a | b | c | d | e | x || h | i | k | l -dan| a | b | c | d | e | x | h | i | k | l -dAn| a | b | c | d | e | x h | i | k | l -dIN| a | b | c | d | e | x | g | | i | k | l -diN| a | b | c | d | e | x | g || i | k | l -daN| a | b | c | d | e | x | g | i | k | l -dAN| a | b | c | d | e | x | g i | k | l -d1IL| a | b | c | | e | x | g | h | i | k | l -d1iL| a | b | c || e | x | g | h | i | k | l -d1aL| a | b | c | e | x | g | h | i | k | l -d1AL| a | b | c e | x | g | h | i | k | l -d1Il| a | b | c | d | | x | g | h | i | k | l -d1il| a | b | c | d || x | g | h | i | k | l -d1al| a | b | c | d | x | g | h | i | k | l -d1Al| a | b | c | d x | g | h | i | k | l -d1I| a | b | c | d | e | | g | h | i | k | l -d1i| a | b | c | d | e || g | h | i | k | l -d1a| a | b | c | d | e | g | h | i | k | l -d1A| a | b | c | d | e g | h | i | k | l -d1In| a | b | c | d | e | x | | h | i | k | l -d1in| a | b | c | d | e | x || h | i | k | l -d1an| a | b | c | d | e | x | h | i | k | l -d1An| a | b | c | d | e | x h | i | k | l -d1IN| a | b | c | d | e | x | g | | i | k | l -d1iN| a | b | c | d | e | x | g || i | k | l -d1aN| a | b | c | d | e | x | g | i | k | l -d1AN| a | b | c | d | e | x | g i | k | l -d2IL| a | | c | d | e | x | g | h | i | k | l -d2iL| a || c | d | e | x | g | h | i | k | l -d2aL| a | c | d | e | x | g | h | i | k | l -d2AL| a c | d | e | x | g | h | i | k | l -d2Il| a | b | c | | e | x | g | h | i | k | l -d2il| a | b | c || e | x | g | h | i | k | l -d2al| a | b | c | e | x | g | h | i | k | l -d2Al| a | b | c e | x | g | h | i | k | l -d2I| a | b | c | d | e | | g | h | i | k | l -d2i| a | b | c | d | e || g | h | i | k | l -d2a| a | b | c | d | e | g | h | i | k | l -d2A| a | b | c | d | e g | h | i | k | l -d2In| a | b | c | d | e | x | g | | i | k | l -d2in| a | b | c | d | e | x | g || i | k | l -d2an| a | b | c | d | e | x | g | i | k | l -d2An| a | b | c | d | e | x | g i | k | l -d2IN| a | b | c | d | e | x | g | h | i | | l -d2iN| a | b | c | d | e | x | g | h | i || l -d2aN| a | b | c | d | e | x | g | h | i | l -d2AN| a | b | c | d | e | x | g | h | i l -yIL| a | b | c | d | e | x | g | h | i | k | l 'd' -yiL| a | b | c | d | e | x | g | h | i | k | l ' d ' -yaL| a | b | c | d | e | x | g | h | i | k | l '| d ' -yAL| a | b | c | d | e | x | g | h | i | k | l '| d | ' -yIl| a | b | c | d | e | x | g | h | i | k | l 'e' -yil| a | b | c | d | e | x | g | h | i | k | l ' e ' -yal| a | b | c | d | e | x | g | h | i | k | l '| e ' -yAl| a | b | c | d | e | x | g | h | i | k | l '| e | ' -yI| a | b | c | d | e | x | g | h | i | k | l 'x' -yi| a | b | c | d | e | x | g | h | i | k | l ' x ' -ya| a | b | c | d | e | x | g | h | i | k | l '| x ' -yA| a | b | c | d | e | x | g | h | i | k | l '| x | ' -yIn| a | b | c | d | e | x | g | h | i | k | l 'g' -yin| a | b | c | d | e | x | g | h | i | k | l ' g ' -yan| a | b | c | d | e | x | g | h | i | k | l '| g ' -yAn| a | b | c | d | e | x | g | h | i | k | l '| g | ' -yIN| a | b | c | d | e | x | g | h | i | k | l 'h' -yiN| a | b | c | d | e | x | g | h | i | k | l ' h ' -yaN| a | b | c | d | e | x | g | h | i | k | l '| h ' -yAN| a | b | c | d | e | x | g | h | i | k | l '| h | ' -y1IL| a | b | c | d | e | x | g | h | i | k | l 'd' -y1iL| a | b | c | d | e | x | g | h | i | k | l ' d ' -y1aL| a | b | c | d | e | x | g | h | i | k | l '| d ' -y1AL| a | b | c | d | e | x | g | h | i | k | l '| d | ' -y1Il| a | b | c | d | e | x | g | h | i | k | l 'e' -y1il| a | b | c | d | e | x | g | h | i | k | l ' e ' -y1al| a | b | c | d | e | x | g | h | i | k | l '| e ' -y1Al| a | b | c | d | e | x | g | h | i | k | l '| e | ' -y1I| a | b | c | d | e | x | g | h | i | k | l 'x' -y1i| a | b | c | d | e | x | g | h | i | k | l ' x ' -y1a| a | b | c | d | e | x | g | h | i | k | l '| x ' -y1A| a | b | c | d | e | x | g | h | i | k | l '| x | ' -y1In| a | b | c | d | e | x | g | h | i | k | l 'g' -y1in| a | b | c | d | e | x | g | h | i | k | l ' g ' -y1an| a | b | c | d | e | x | g | h | i | k | l '| g ' -y1An| a | b | c | d | e | x | g | h | i | k | l '| g | ' -y1IN| a | b | c | d | e | x | g | h | i | k | l 'h' -y1iN| a | b | c | d | e | x | g | h | i | k | l ' h ' -y1aN| a | b | c | d | e | x | g | h | i | k | l '| h ' -y1AN| a | b | c | d | e | x | g | h | i | k | l '| h | ' -y2IL| a | b | c | d | e | x | g | h | i | k | l 'b' -y2iL| a | b | c | d | e | x | g | h | i | k | l ' b ' -y2aL| a | b | c | d | e | x | g | h | i | k | l '| b ' -y2AL| a | b | c | d | e | x | g | h | i | k | l '| b | ' -y2Il| a | b | c | d | e | x | g | h | i | k | l 'd' -y2il| a | b | c | d | e | x | g | h | i | k | l ' d ' -y2al| a | b | c | d | e | x | g | h | i | k | l '| d ' -y2Al| a | b | c | d | e | x | g | h | i | k | l '| d | ' -y2I| a | b | c | d | e | x | g | h | i | k | l 'x' -y2i| a | b | c | d | e | x | g | h | i | k | l ' x ' -y2a| a | b | c | d | e | x | g | h | i | k | l '| x ' -y2A| a | b | c | d | e | x | g | h | i | k | l '| x | ' -y2In| a | b | c | d | e | x | g | h | i | k | l 'h' -y2in| a | b | c | d | e | x | g | h | i | k | l ' h ' -y2an| a | b | c | d | e | x | g | h | i | k | l '| h ' -y2An| a | b | c | d | e | x | g | h | i | k | l '| h | ' -y2IN| a | b | c | d | e | x | g | h | i | k | l 'k' -y2iN| a | b | c | d | e | x | g | h | i | k | l ' k ' -y2aN| a | b | c | d | e | x | g | h | i | k | l '| k ' -y2AN| a | b | c | d | e | x | g | h | i | k | l '| k | ' -vIL| a | b | c | _ | e | x | g | h | i | k | l -viL| a | b | c |___| e | x | g | h | i | k | l -vaL| a | b | c ____| e | x | g | h | i | k | l -vAL| a | b | c ______e | x | g | h | i | k | l -vIl| a | b | c | d | _ | x | g | h | i | k | l -vil| a | b | c | d |___| x | g | h | i | k | l -val| a | b | c | d ____| x | g | h | i | k | l -vAl| a | b | c | d ______x | g | h | i | k | l -vI| a | b | c | d | e | _ | g | h | i | k | l -vi| a | b | c | d | e |___| g | h | i | k | l -va| a | b | c | d | e ____| g | h | i | k | l -vA| a | b | c | d | e ______g | h | i | k | l -vIn| a | b | c | d | e | x | _ | h | i | k | l -vin| a | b | c | d | e | x |___| h | i | k | l -van| a | b | c | d | e | x ____| h | i | k | l -vAn| a | b | c | d | e | x ______h | i | k | l -vIN| a | b | c | d | e | x | g | _ | i | k | l -viN| a | b | c | d | e | x | g |___| i | k | l -vaN| a | b | c | d | e | x | g ____| i | k | l -vAN| a | b | c | d | e | x | g ______i | k | l -v1IL| a | b | c | _ | e | x | g | h | i | k | l -v1iL| a | b | c |___| e | x | g | h | i | k | l -v1aL| a | b | c ____| e | x | g | h | i | k | l -v1AL| a | b | c ______e | x | g | h | i | k | l -v1Il| a | b | c | d | _ | x | g | h | i | k | l -v1il| a | b | c | d |___| x | g | h | i | k | l -v1al| a | b | c | d ____| x | g | h | i | k | l -v1Al| a | b | c | d ______x | g | h | i | k | l -v1I| a | b | c | d | e | _ | g | h | i | k | l -v1i| a | b | c | d | e |___| g | h | i | k | l -v1a| a | b | c | d | e ____| g | h | i | k | l -v1A| a | b | c | d | e ______g | h | i | k | l -v1In| a | b | c | d | e | x | _ | h | i | k | l -v1in| a | b | c | d | e | x |___| h | i | k | l -v1an| a | b | c | d | e | x ____| h | i | k | l -v1An| a | b | c | d | e | x ______h | i | k | l -v1IN| a | b | c | d | e | x | g | _ | i | k | l -v1iN| a | b | c | d | e | x | g |___| i | k | l -v1aN| a | b | c | d | e | x | g ____| i | k | l -v1AN| a | b | c | d | e | x | g ______i | k | l -v2IL| a | _ | c | d | e | x | g | h | i | k | l -v2iL| a |___| c | d | e | x | g | h | i | k | l -v2aL| a ____| c | d | e | x | g | h | i | k | l -v2AL| a ______c | d | e | x | g | h | i | k | l -v2Il| a | b | c | _ | e | x | g | h | i | k | l -v2il| a | b | c |___| e | x | g | h | i | k | l -v2al| a | b | c ____| e | x | g | h | i | k | l -v2Al| a | b | c ______e | x | g | h | i | k | l -v2I| a | b | c | d | e | _ | g | h | i | k | l -v2i| a | b | c | d | e |___| g | h | i | k | l -v2a| a | b | c | d | e ____| g | h | i | k | l -v2A| a | b | c | d | e ______g | h | i | k | l -v2In| a | b | c | d | e | x | g | _ | i | k | l -v2in| a | b | c | d | e | x | g |___| i | k | l -v2an| a | b | c | d | e | x | g ____| i | k | l -v2An| a | b | c | d | e | x | g ______i | k | l -v2IN| a | b | c | d | e | x | g | h | i | _ | l -v2iN| a | b | c | d | e | x | g | h | i |___| l -v2aN| a | b | c | d | e | x | g | h | i ____| l -v2AN| a | b | c | d | e | x | g | h | i ______l -a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l -cIL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -ciL\ a \ b \ c \_\ e \ x \ g \ h \ i \ k \ l -caL\ a \ b \ c _\ e \ x \ g \ h \ i \ k \ l -cAL\ a \ b \ c _e \ x \ g \ h \ i \ k \ l -cIl\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -cil\ a \ b \ c \ d \_\ x \ g \ h \ i \ k \ l -cal\ a \ b \ c \ d _\ x \ g \ h \ i \ k \ l -cAl\ a \ b \ c \ d _x \ g \ h \ i \ k \ l -cI\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -ci\ a \ b \ c \ d \ e \_\ g \ h \ i \ k \ l -ca\ a \ b \ c \ d \ e _\ g \ h \ i \ k \ l -cA\ a \ b \ c \ d \ e _g \ h \ i \ k \ l -cIn\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -cin\ a \ b \ c \ d \ e \ x \_\ h \ i \ k \ l -can\ a \ b \ c \ d \ e \ x _\ h \ i \ k \ l -cAn\ a \ b \ c \ d \ e \ x _h \ i \ k \ l -cIN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -ciN\ a \ b \ c \ d \ e \ x \ g \_\ i \ k \ l -caN\ a \ b \ c \ d \ e \ x \ g _\ i \ k \ l -cAN\ a \ b \ c \ d \ e \ x \ g _i \ k \ l -c1IL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -c1iL\ a \ b \ c \_\ e \ x \ g \ h \ i \ k \ l -c1aL\ a \ b \ c _\ e \ x \ g \ h \ i \ k \ l -c1AL\ a \ b \ c _e \ x \ g \ h \ i \ k \ l -c1Il\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -c1il\ a \ b \ c \ d \_\ x \ g \ h \ i \ k \ l -c1al\ a \ b \ c \ d _\ x \ g \ h \ i \ k \ l -c1Al\ a \ b \ c \ d _x \ g \ h \ i \ k \ l -c1I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -c1i\ a \ b \ c \ d \ e \_\ g \ h \ i \ k \ l -c1a\ a \ b \ c \ d \ e _\ g \ h \ i \ k \ l -c1A\ a \ b \ c \ d \ e _g \ h \ i \ k \ l -c1In\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -c1in\ a \ b \ c \ d \ e \ x \_\ h \ i \ k \ l -c1an\ a \ b \ c \ d \ e \ x _\ h \ i \ k \ l -c1An\ a \ b \ c \ d \ e \ x _h \ i \ k \ l -c1IN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -c1iN\ a \ b \ c \ d \ e \ x \ g \_\ i \ k \ l -c1aN\ a \ b \ c \ d \ e \ x \ g _\ i \ k \ l -c1AN\ a \ b \ c \ d \ e \ x \ g _i \ k \ l -c2IL\ a \ _ \ c \ d \ e \ x \ g \ h \ i \ k \ l -c2iL\ a \_\ c \ d \ e \ x \ g \ h \ i \ k \ l -c2aL\ a _\ c \ d \ e \ x \ g \ h \ i \ k \ l -c2AL\ a _c \ d \ e \ x \ g \ h \ i \ k \ l -c2Il\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -c2il\ a \ b \ c \_\ e \ x \ g \ h \ i \ k \ l -c2al\ a \ b \ c _\ e \ x \ g \ h \ i \ k \ l -c2Al\ a \ b \ c _e \ x \ g \ h \ i \ k \ l -c2I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -c2i\ a \ b \ c \ d \ e \_\ g \ h \ i \ k \ l -c2a\ a \ b \ c \ d \ e _\ g \ h \ i \ k \ l -c2A\ a \ b \ c \ d \ e _g \ h \ i \ k \ l -c2In\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -c2in\ a \ b \ c \ d \ e \ x \ g \_\ i \ k \ l -c2an\ a \ b \ c \ d \ e \ x \ g _\ i \ k \ l -c2An\ a \ b \ c \ d \ e \ x \ g _i \ k \ l -c2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ _ \ l -c2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \_\ l -c2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i _\ l -c2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i _l -dIL\ a \ b \ c \ \ e \ x \ g \ h \ i \ k \ l -diL\ a \ b \ c \\ e \ x \ g \ h \ i \ k \ l -daL\ a \ b \ c \ e \ x \ g \ h \ i \ k \ l -dAL\ a \ b \ c e \ x \ g \ h \ i \ k \ l -dIl\ a \ b \ c \ d \ \ x \ g \ h \ i \ k \ l -dil\ a \ b \ c \ d \\ x \ g \ h \ i \ k \ l -dal\ a \ b \ c \ d \ x \ g \ h \ i \ k \ l -dAl\ a \ b \ c \ d x \ g \ h \ i \ k \ l -dI\ a \ b \ c \ d \ e \ \ g \ h \ i \ k \ l -di\ a \ b \ c \ d \ e \\ g \ h \ i \ k \ l -da\ a \ b \ c \ d \ e \ g \ h \ i \ k \ l -dA\ a \ b \ c \ d \ e g \ h \ i \ k \ l -dIn\ a \ b \ c \ d \ e \ x \ \ h \ i \ k \ l -din\ a \ b \ c \ d \ e \ x \\ h \ i \ k \ l -dan\ a \ b \ c \ d \ e \ x \ h \ i \ k \ l -dAn\ a \ b \ c \ d \ e \ x h \ i \ k \ l -dIN\ a \ b \ c \ d \ e \ x \ g \ \ i \ k \ l -diN\ a \ b \ c \ d \ e \ x \ g \\ i \ k \ l -daN\ a \ b \ c \ d \ e \ x \ g \ i \ k \ l -dAN\ a \ b \ c \ d \ e \ x \ g i \ k \ l -d1IL\ a \ b \ c \ \ e \ x \ g \ h \ i \ k \ l -d1iL\ a \ b \ c \\ e \ x \ g \ h \ i \ k \ l -d1aL\ a \ b \ c \ e \ x \ g \ h \ i \ k \ l -d1AL\ a \ b \ c e \ x \ g \ h \ i \ k \ l -d1Il\ a \ b \ c \ d \ \ x \ g \ h \ i \ k \ l -d1il\ a \ b \ c \ d \\ x \ g \ h \ i \ k \ l -d1al\ a \ b \ c \ d \ x \ g \ h \ i \ k \ l -d1Al\ a \ b \ c \ d x \ g \ h \ i \ k \ l -d1I\ a \ b \ c \ d \ e \ \ g \ h \ i \ k \ l -d1i\ a \ b \ c \ d \ e \\ g \ h \ i \ k \ l -d1a\ a \ b \ c \ d \ e \ g \ h \ i \ k \ l -d1A\ a \ b \ c \ d \ e g \ h \ i \ k \ l -d1In\ a \ b \ c \ d \ e \ x \ \ h \ i \ k \ l -d1in\ a \ b \ c \ d \ e \ x \\ h \ i \ k \ l -d1an\ a \ b \ c \ d \ e \ x \ h \ i \ k \ l -d1An\ a \ b \ c \ d \ e \ x h \ i \ k \ l -d1IN\ a \ b \ c \ d \ e \ x \ g \ \ i \ k \ l -d1iN\ a \ b \ c \ d \ e \ x \ g \\ i \ k \ l -d1aN\ a \ b \ c \ d \ e \ x \ g \ i \ k \ l -d1AN\ a \ b \ c \ d \ e \ x \ g i \ k \ l -d2IL\ a \ \ c \ d \ e \ x \ g \ h \ i \ k \ l -d2iL\ a \\ c \ d \ e \ x \ g \ h \ i \ k \ l -d2aL\ a \ c \ d \ e \ x \ g \ h \ i \ k \ l -d2AL\ a c \ d \ e \ x \ g \ h \ i \ k \ l -d2Il\ a \ b \ c \ \ e \ x \ g \ h \ i \ k \ l -d2il\ a \ b \ c \\ e \ x \ g \ h \ i \ k \ l -d2al\ a \ b \ c \ e \ x \ g \ h \ i \ k \ l -d2Al\ a \ b \ c e \ x \ g \ h \ i \ k \ l -d2I\ a \ b \ c \ d \ e \ \ g \ h \ i \ k \ l -d2i\ a \ b \ c \ d \ e \\ g \ h \ i \ k \ l -d2a\ a \ b \ c \ d \ e \ g \ h \ i \ k \ l -d2A\ a \ b \ c \ d \ e g \ h \ i \ k \ l -d2In\ a \ b \ c \ d \ e \ x \ g \ \ i \ k \ l -d2in\ a \ b \ c \ d \ e \ x \ g \\ i \ k \ l -d2an\ a \ b \ c \ d \ e \ x \ g \ i \ k \ l -d2An\ a \ b \ c \ d \ e \ x \ g i \ k \ l -d2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ \ l -d2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \\ l -d2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ l -d2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i l -yIL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'd' -yiL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' d ' -yaL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d ' -yAL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d \ ' -yIl\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'e' -yil\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' e ' -yal\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e ' -yAl\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e \ ' -yI\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'x' -yi\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' x ' -ya\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x ' -yA\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x \ ' -yIn\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'g' -yin\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' g ' -yan\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g ' -yAn\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g \ ' -yIN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'h' -yiN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' h ' -yaN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h ' -yAN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h \ ' -y1IL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'd' -y1iL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' d ' -y1aL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d ' -y1AL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d \ ' -y1Il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'e' -y1il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' e ' -y1al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e ' -y1Al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e \ ' -y1I\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'x' -y1i\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' x ' -y1a\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x ' -y1A\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x \ ' -y1In\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'g' -y1in\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' g ' -y1an\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g ' -y1An\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g \ ' -y1IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'h' -y1iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' h ' -y1aN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h ' -y1AN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h \ ' -y2IL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'b' -y2iL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' b ' -y2aL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ b ' -y2AL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ b \ ' -y2Il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'd' -y2il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' d ' -y2al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d ' -y2Al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d \ ' -y2I\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'x' -y2i\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' x ' -y2a\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x ' -y2A\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x \ ' -y2In\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'h' -y2in\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' h ' -y2an\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h ' -y2An\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h \ ' -y2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'k' -y2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' k ' -y2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ k ' -y2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ k \ ' -vIL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -viL\ a \ b \ c \___\ e \ x \ g \ h \ i \ k \ l -vaL\ a \ b \ c ____\ e \ x \ g \ h \ i \ k \ l -vAL\ a \ b \ c ______e \ x \ g \ h \ i \ k \ l -vIl\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -vil\ a \ b \ c \ d \___\ x \ g \ h \ i \ k \ l -val\ a \ b \ c \ d ____\ x \ g \ h \ i \ k \ l -vAl\ a \ b \ c \ d ______x \ g \ h \ i \ k \ l -vI\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -vi\ a \ b \ c \ d \ e \___\ g \ h \ i \ k \ l -va\ a \ b \ c \ d \ e ____\ g \ h \ i \ k \ l -vA\ a \ b \ c \ d \ e ______g \ h \ i \ k \ l -vIn\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -vin\ a \ b \ c \ d \ e \ x \___\ h \ i \ k \ l -van\ a \ b \ c \ d \ e \ x ____\ h \ i \ k \ l -vAn\ a \ b \ c \ d \ e \ x ______h \ i \ k \ l -vIN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -viN\ a \ b \ c \ d \ e \ x \ g \___\ i \ k \ l -vaN\ a \ b \ c \ d \ e \ x \ g ____\ i \ k \ l -vAN\ a \ b \ c \ d \ e \ x \ g ______i \ k \ l -v1IL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -v1iL\ a \ b \ c \___\ e \ x \ g \ h \ i \ k \ l -v1aL\ a \ b \ c ____\ e \ x \ g \ h \ i \ k \ l -v1AL\ a \ b \ c ______e \ x \ g \ h \ i \ k \ l -v1Il\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -v1il\ a \ b \ c \ d \___\ x \ g \ h \ i \ k \ l -v1al\ a \ b \ c \ d ____\ x \ g \ h \ i \ k \ l -v1Al\ a \ b \ c \ d ______x \ g \ h \ i \ k \ l -v1I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -v1i\ a \ b \ c \ d \ e \___\ g \ h \ i \ k \ l -v1a\ a \ b \ c \ d \ e ____\ g \ h \ i \ k \ l -v1A\ a \ b \ c \ d \ e ______g \ h \ i \ k \ l -v1In\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -v1in\ a \ b \ c \ d \ e \ x \___\ h \ i \ k \ l -v1an\ a \ b \ c \ d \ e \ x ____\ h \ i \ k \ l -v1An\ a \ b \ c \ d \ e \ x ______h \ i \ k \ l -v1IN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -v1iN\ a \ b \ c \ d \ e \ x \ g \___\ i \ k \ l -v1aN\ a \ b \ c \ d \ e \ x \ g ____\ i \ k \ l -v1AN\ a \ b \ c \ d \ e \ x \ g ______i \ k \ l -v2IL\ a \ _ \ c \ d \ e \ x \ g \ h \ i \ k \ l -v2iL\ a \___\ c \ d \ e \ x \ g \ h \ i \ k \ l -v2aL\ a ____\ c \ d \ e \ x \ g \ h \ i \ k \ l -v2AL\ a ______c \ d \ e \ x \ g \ h \ i \ k \ l -v2Il\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -v2il\ a \ b \ c \___\ e \ x \ g \ h \ i \ k \ l -v2al\ a \ b \ c ____\ e \ x \ g \ h \ i \ k \ l -v2Al\ a \ b \ c ______e \ x \ g \ h \ i \ k \ l -v2I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -v2i\ a \ b \ c \ d \ e \___\ g \ h \ i \ k \ l -v2a\ a \ b \ c \ d \ e ____\ g \ h \ i \ k \ l -v2A\ a \ b \ c \ d \ e ______g \ h \ i \ k \ l -v2In\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -v2in\ a \ b \ c \ d \ e \ x \ g \___\ i \ k \ l -v2an\ a \ b \ c \ d \ e \ x \ g ____\ i \ k \ l -v2An\ a \ b \ c \ d \ e \ x \ g ______i \ k \ l -v2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ _ \ l -v2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \___\ l -v2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i ____\ l -v2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i ______l -a & b & c & d & e & x & g & h & i & k & l -cIL& a & b & c & _ & e & x & g & h & i & k & l -ciL& a & b & c &_& e & x & g & h & i & k & l -caL& a & b & c _& e & x & g & h & i & k & l -cAL& a & b & c _e & x & g & h & i & k & l -cIl& a & b & c & d & _ & x & g & h & i & k & l -cil& a & b & c & d &_& x & g & h & i & k & l -cal& a & b & c & d _& x & g & h & i & k & l -cAl& a & b & c & d _x & g & h & i & k & l -cI& a & b & c & d & e & _ & g & h & i & k & l -ci& a & b & c & d & e &_& g & h & i & k & l -ca& a & b & c & d & e _& g & h & i & k & l -cA& a & b & c & d & e _g & h & i & k & l -cIn& a & b & c & d & e & x & _ & h & i & k & l -cin& a & b & c & d & e & x &_& h & i & k & l -can& a & b & c & d & e & x _& h & i & k & l -cAn& a & b & c & d & e & x _h & i & k & l -cIN& a & b & c & d & e & x & g & _ & i & k & l -ciN& a & b & c & d & e & x & g &_& i & k & l -caN& a & b & c & d & e & x & g _& i & k & l -cAN& a & b & c & d & e & x & g _i & k & l -c1IL& a & b & c & _ & e & x & g & h & i & k & l -c1iL& a & b & c &_& e & x & g & h & i & k & l -c1aL& a & b & c _& e & x & g & h & i & k & l -c1AL& a & b & c _e & x & g & h & i & k & l -c1Il& a & b & c & d & _ & x & g & h & i & k & l -c1il& a & b & c & d &_& x & g & h & i & k & l -c1al& a & b & c & d _& x & g & h & i & k & l -c1Al& a & b & c & d _x & g & h & i & k & l -c1I& a & b & c & d & e & _ & g & h & i & k & l -c1i& a & b & c & d & e &_& g & h & i & k & l -c1a& a & b & c & d & e _& g & h & i & k & l -c1A& a & b & c & d & e _g & h & i & k & l -c1In& a & b & c & d & e & x & _ & h & i & k & l -c1in& a & b & c & d & e & x &_& h & i & k & l -c1an& a & b & c & d & e & x _& h & i & k & l -c1An& a & b & c & d & e & x _h & i & k & l -c1IN& a & b & c & d & e & x & g & _ & i & k & l -c1iN& a & b & c & d & e & x & g &_& i & k & l -c1aN& a & b & c & d & e & x & g _& i & k & l -c1AN& a & b & c & d & e & x & g _i & k & l -c2IL& a & _ & c & d & e & x & g & h & i & k & l -c2iL& a &_& c & d & e & x & g & h & i & k & l -c2aL& a _& c & d & e & x & g & h & i & k & l -c2AL& a _c & d & e & x & g & h & i & k & l -c2Il& a & b & c & _ & e & x & g & h & i & k & l -c2il& a & b & c &_& e & x & g & h & i & k & l -c2al& a & b & c _& e & x & g & h & i & k & l -c2Al& a & b & c _e & x & g & h & i & k & l -c2I& a & b & c & d & e & _ & g & h & i & k & l -c2i& a & b & c & d & e &_& g & h & i & k & l -c2a& a & b & c & d & e _& g & h & i & k & l -c2A& a & b & c & d & e _g & h & i & k & l -c2In& a & b & c & d & e & x & g & _ & i & k & l -c2in& a & b & c & d & e & x & g &_& i & k & l -c2an& a & b & c & d & e & x & g _& i & k & l -c2An& a & b & c & d & e & x & g _i & k & l -c2IN& a & b & c & d & e & x & g & h & i & _ & l -c2iN& a & b & c & d & e & x & g & h & i &_& l -c2aN& a & b & c & d & e & x & g & h & i _& l -c2AN& a & b & c & d & e & x & g & h & i _l -dIL& a & b & c & & e & x & g & h & i & k & l -diL& a & b & c && e & x & g & h & i & k & l -daL& a & b & c & e & x & g & h & i & k & l -dAL& a & b & c e & x & g & h & i & k & l -dIl& a & b & c & d & & x & g & h & i & k & l -dil& a & b & c & d && x & g & h & i & k & l -dal& a & b & c & d & x & g & h & i & k & l -dAl& a & b & c & d x & g & h & i & k & l -dI& a & b & c & d & e & & g & h & i & k & l -di& a & b & c & d & e && g & h & i & k & l -da& a & b & c & d & e & g & h & i & k & l -dA& a & b & c & d & e g & h & i & k & l -dIn& a & b & c & d & e & x & & h & i & k & l -din& a & b & c & d & e & x && h & i & k & l -dan& a & b & c & d & e & x & h & i & k & l -dAn& a & b & c & d & e & x h & i & k & l -dIN& a & b & c & d & e & x & g & & i & k & l -diN& a & b & c & d & e & x & g && i & k & l -daN& a & b & c & d & e & x & g & i & k & l -dAN& a & b & c & d & e & x & g i & k & l -d1IL& a & b & c & & e & x & g & h & i & k & l -d1iL& a & b & c && e & x & g & h & i & k & l -d1aL& a & b & c & e & x & g & h & i & k & l -d1AL& a & b & c e & x & g & h & i & k & l -d1Il& a & b & c & d & & x & g & h & i & k & l -d1il& a & b & c & d && x & g & h & i & k & l -d1al& a & b & c & d & x & g & h & i & k & l -d1Al& a & b & c & d x & g & h & i & k & l -d1I& a & b & c & d & e & & g & h & i & k & l -d1i& a & b & c & d & e && g & h & i & k & l -d1a& a & b & c & d & e & g & h & i & k & l -d1A& a & b & c & d & e g & h & i & k & l -d1In& a & b & c & d & e & x & & h & i & k & l -d1in& a & b & c & d & e & x && h & i & k & l -d1an& a & b & c & d & e & x & h & i & k & l -d1An& a & b & c & d & e & x h & i & k & l -d1IN& a & b & c & d & e & x & g & & i & k & l -d1iN& a & b & c & d & e & x & g && i & k & l -d1aN& a & b & c & d & e & x & g & i & k & l -d1AN& a & b & c & d & e & x & g i & k & l -d2IL& a & & c & d & e & x & g & h & i & k & l -d2iL& a && c & d & e & x & g & h & i & k & l -d2aL& a & c & d & e & x & g & h & i & k & l -d2AL& a c & d & e & x & g & h & i & k & l -d2Il& a & b & c & & e & x & g & h & i & k & l -d2il& a & b & c && e & x & g & h & i & k & l -d2al& a & b & c & e & x & g & h & i & k & l -d2Al& a & b & c e & x & g & h & i & k & l -d2I& a & b & c & d & e & & g & h & i & k & l -d2i& a & b & c & d & e && g & h & i & k & l -d2a& a & b & c & d & e & g & h & i & k & l -d2A& a & b & c & d & e g & h & i & k & l -d2In& a & b & c & d & e & x & g & & i & k & l -d2in& a & b & c & d & e & x & g && i & k & l -d2an& a & b & c & d & e & x & g & i & k & l -d2An& a & b & c & d & e & x & g i & k & l -d2IN& a & b & c & d & e & x & g & h & i & & l -d2iN& a & b & c & d & e & x & g & h & i && l -d2aN& a & b & c & d & e & x & g & h & i & l -d2AN& a & b & c & d & e & x & g & h & i l -yIL& a & b & c & d & e & x & g & h & i & k & l 'd' -yiL& a & b & c & d & e & x & g & h & i & k & l ' d ' -yaL& a & b & c & d & e & x & g & h & i & k & l '& d ' -yAL& a & b & c & d & e & x & g & h & i & k & l '& d & ' -yIl& a & b & c & d & e & x & g & h & i & k & l 'e' -yil& a & b & c & d & e & x & g & h & i & k & l ' e ' -yal& a & b & c & d & e & x & g & h & i & k & l '& e ' -yAl& a & b & c & d & e & x & g & h & i & k & l '& e & ' -yI& a & b & c & d & e & x & g & h & i & k & l 'x' -yi& a & b & c & d & e & x & g & h & i & k & l ' x ' -ya& a & b & c & d & e & x & g & h & i & k & l '& x ' -yA& a & b & c & d & e & x & g & h & i & k & l '& x & ' -yIn& a & b & c & d & e & x & g & h & i & k & l 'g' -yin& a & b & c & d & e & x & g & h & i & k & l ' g ' -yan& a & b & c & d & e & x & g & h & i & k & l '& g ' -yAn& a & b & c & d & e & x & g & h & i & k & l '& g & ' -yIN& a & b & c & d & e & x & g & h & i & k & l 'h' -yiN& a & b & c & d & e & x & g & h & i & k & l ' h ' -yaN& a & b & c & d & e & x & g & h & i & k & l '& h ' -yAN& a & b & c & d & e & x & g & h & i & k & l '& h & ' -y1IL& a & b & c & d & e & x & g & h & i & k & l 'd' -y1iL& a & b & c & d & e & x & g & h & i & k & l ' d ' -y1aL& a & b & c & d & e & x & g & h & i & k & l '& d ' -y1AL& a & b & c & d & e & x & g & h & i & k & l '& d & ' -y1Il& a & b & c & d & e & x & g & h & i & k & l 'e' -y1il& a & b & c & d & e & x & g & h & i & k & l ' e ' -y1al& a & b & c & d & e & x & g & h & i & k & l '& e ' -y1Al& a & b & c & d & e & x & g & h & i & k & l '& e & ' -y1I& a & b & c & d & e & x & g & h & i & k & l 'x' -y1i& a & b & c & d & e & x & g & h & i & k & l ' x ' -y1a& a & b & c & d & e & x & g & h & i & k & l '& x ' -y1A& a & b & c & d & e & x & g & h & i & k & l '& x & ' -y1In& a & b & c & d & e & x & g & h & i & k & l 'g' -y1in& a & b & c & d & e & x & g & h & i & k & l ' g ' -y1an& a & b & c & d & e & x & g & h & i & k & l '& g ' -y1An& a & b & c & d & e & x & g & h & i & k & l '& g & ' -y1IN& a & b & c & d & e & x & g & h & i & k & l 'h' -y1iN& a & b & c & d & e & x & g & h & i & k & l ' h ' -y1aN& a & b & c & d & e & x & g & h & i & k & l '& h ' -y1AN& a & b & c & d & e & x & g & h & i & k & l '& h & ' -y2IL& a & b & c & d & e & x & g & h & i & k & l 'b' -y2iL& a & b & c & d & e & x & g & h & i & k & l ' b ' -y2aL& a & b & c & d & e & x & g & h & i & k & l '& b ' -y2AL& a & b & c & d & e & x & g & h & i & k & l '& b & ' -y2Il& a & b & c & d & e & x & g & h & i & k & l 'd' -y2il& a & b & c & d & e & x & g & h & i & k & l ' d ' -y2al& a & b & c & d & e & x & g & h & i & k & l '& d ' -y2Al& a & b & c & d & e & x & g & h & i & k & l '& d & ' -y2I& a & b & c & d & e & x & g & h & i & k & l 'x' -y2i& a & b & c & d & e & x & g & h & i & k & l ' x ' -y2a& a & b & c & d & e & x & g & h & i & k & l '& x ' -y2A& a & b & c & d & e & x & g & h & i & k & l '& x & ' -y2In& a & b & c & d & e & x & g & h & i & k & l 'h' -y2in& a & b & c & d & e & x & g & h & i & k & l ' h ' -y2an& a & b & c & d & e & x & g & h & i & k & l '& h ' -y2An& a & b & c & d & e & x & g & h & i & k & l '& h & ' -y2IN& a & b & c & d & e & x & g & h & i & k & l 'k' -y2iN& a & b & c & d & e & x & g & h & i & k & l ' k ' -y2aN& a & b & c & d & e & x & g & h & i & k & l '& k ' -y2AN& a & b & c & d & e & x & g & h & i & k & l '& k & ' -vIL& a & b & c & _ & e & x & g & h & i & k & l -viL& a & b & c &___& e & x & g & h & i & k & l -vaL& a & b & c ____& e & x & g & h & i & k & l -vAL& a & b & c ______e & x & g & h & i & k & l -vIl& a & b & c & d & _ & x & g & h & i & k & l -vil& a & b & c & d &___& x & g & h & i & k & l -val& a & b & c & d ____& x & g & h & i & k & l -vAl& a & b & c & d ______x & g & h & i & k & l -vI& a & b & c & d & e & _ & g & h & i & k & l -vi& a & b & c & d & e &___& g & h & i & k & l -va& a & b & c & d & e ____& g & h & i & k & l -vA& a & b & c & d & e ______g & h & i & k & l -vIn& a & b & c & d & e & x & _ & h & i & k & l -vin& a & b & c & d & e & x &___& h & i & k & l -van& a & b & c & d & e & x ____& h & i & k & l -vAn& a & b & c & d & e & x ______h & i & k & l -vIN& a & b & c & d & e & x & g & _ & i & k & l -viN& a & b & c & d & e & x & g &___& i & k & l -vaN& a & b & c & d & e & x & g ____& i & k & l -vAN& a & b & c & d & e & x & g ______i & k & l -v1IL& a & b & c & _ & e & x & g & h & i & k & l -v1iL& a & b & c &___& e & x & g & h & i & k & l -v1aL& a & b & c ____& e & x & g & h & i & k & l -v1AL& a & b & c ______e & x & g & h & i & k & l -v1Il& a & b & c & d & _ & x & g & h & i & k & l -v1il& a & b & c & d &___& x & g & h & i & k & l -v1al& a & b & c & d ____& x & g & h & i & k & l -v1Al& a & b & c & d ______x & g & h & i & k & l -v1I& a & b & c & d & e & _ & g & h & i & k & l -v1i& a & b & c & d & e &___& g & h & i & k & l -v1a& a & b & c & d & e ____& g & h & i & k & l -v1A& a & b & c & d & e ______g & h & i & k & l -v1In& a & b & c & d & e & x & _ & h & i & k & l -v1in& a & b & c & d & e & x &___& h & i & k & l -v1an& a & b & c & d & e & x ____& h & i & k & l -v1An& a & b & c & d & e & x ______h & i & k & l -v1IN& a & b & c & d & e & x & g & _ & i & k & l -v1iN& a & b & c & d & e & x & g &___& i & k & l -v1aN& a & b & c & d & e & x & g ____& i & k & l -v1AN& a & b & c & d & e & x & g ______i & k & l -v2IL& a & _ & c & d & e & x & g & h & i & k & l -v2iL& a &___& c & d & e & x & g & h & i & k & l -v2aL& a ____& c & d & e & x & g & h & i & k & l -v2AL& a ______c & d & e & x & g & h & i & k & l -v2Il& a & b & c & _ & e & x & g & h & i & k & l -v2il& a & b & c &___& e & x & g & h & i & k & l -v2al& a & b & c ____& e & x & g & h & i & k & l -v2Al& a & b & c ______e & x & g & h & i & k & l -v2I& a & b & c & d & e & _ & g & h & i & k & l -v2i& a & b & c & d & e &___& g & h & i & k & l -v2a& a & b & c & d & e ____& g & h & i & k & l -v2A& a & b & c & d & e ______g & h & i & k & l -v2In& a & b & c & d & e & x & g & _ & i & k & l -v2in& a & b & c & d & e & x & g &___& i & k & l -v2an& a & b & c & d & e & x & g ____& i & k & l -v2An& a & b & c & d & e & x & g ______i & k & l -v2IN& a & b & c & d & e & x & g & h & i & _ & l -v2iN& a & b & c & d & e & x & g & h & i &___& l -v2aN& a & b & c & d & e & x & g & h & i ____& l -v2AN& a & b & c & d & e & x & g & h & i ______l -a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l -cIL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -ciL$ a $ b $ c $_$ e $ x $ g $ h $ i $ k $ l -caL$ a $ b $ c _$ e $ x $ g $ h $ i $ k $ l -cAL$ a $ b $ c _e $ x $ g $ h $ i $ k $ l -cIl$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -cil$ a $ b $ c $ d $_$ x $ g $ h $ i $ k $ l -cal$ a $ b $ c $ d _$ x $ g $ h $ i $ k $ l -cAl$ a $ b $ c $ d _x $ g $ h $ i $ k $ l -cI$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -ci$ a $ b $ c $ d $ e $_$ g $ h $ i $ k $ l -ca$ a $ b $ c $ d $ e _$ g $ h $ i $ k $ l -cA$ a $ b $ c $ d $ e _g $ h $ i $ k $ l -cIn$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -cin$ a $ b $ c $ d $ e $ x $_$ h $ i $ k $ l -can$ a $ b $ c $ d $ e $ x _$ h $ i $ k $ l -cAn$ a $ b $ c $ d $ e $ x _h $ i $ k $ l -cIN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -ciN$ a $ b $ c $ d $ e $ x $ g $_$ i $ k $ l -caN$ a $ b $ c $ d $ e $ x $ g _$ i $ k $ l -cAN$ a $ b $ c $ d $ e $ x $ g _i $ k $ l -c1IL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -c1iL$ a $ b $ c $_$ e $ x $ g $ h $ i $ k $ l -c1aL$ a $ b $ c _$ e $ x $ g $ h $ i $ k $ l -c1AL$ a $ b $ c _e $ x $ g $ h $ i $ k $ l -c1Il$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -c1il$ a $ b $ c $ d $_$ x $ g $ h $ i $ k $ l -c1al$ a $ b $ c $ d _$ x $ g $ h $ i $ k $ l -c1Al$ a $ b $ c $ d _x $ g $ h $ i $ k $ l -c1I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -c1i$ a $ b $ c $ d $ e $_$ g $ h $ i $ k $ l -c1a$ a $ b $ c $ d $ e _$ g $ h $ i $ k $ l -c1A$ a $ b $ c $ d $ e _g $ h $ i $ k $ l -c1In$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -c1in$ a $ b $ c $ d $ e $ x $_$ h $ i $ k $ l -c1an$ a $ b $ c $ d $ e $ x _$ h $ i $ k $ l -c1An$ a $ b $ c $ d $ e $ x _h $ i $ k $ l -c1IN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -c1iN$ a $ b $ c $ d $ e $ x $ g $_$ i $ k $ l -c1aN$ a $ b $ c $ d $ e $ x $ g _$ i $ k $ l -c1AN$ a $ b $ c $ d $ e $ x $ g _i $ k $ l -c2IL$ a $ _ $ c $ d $ e $ x $ g $ h $ i $ k $ l -c2iL$ a $_$ c $ d $ e $ x $ g $ h $ i $ k $ l -c2aL$ a _$ c $ d $ e $ x $ g $ h $ i $ k $ l -c2AL$ a _c $ d $ e $ x $ g $ h $ i $ k $ l -c2Il$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -c2il$ a $ b $ c $_$ e $ x $ g $ h $ i $ k $ l -c2al$ a $ b $ c _$ e $ x $ g $ h $ i $ k $ l -c2Al$ a $ b $ c _e $ x $ g $ h $ i $ k $ l -c2I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -c2i$ a $ b $ c $ d $ e $_$ g $ h $ i $ k $ l -c2a$ a $ b $ c $ d $ e _$ g $ h $ i $ k $ l -c2A$ a $ b $ c $ d $ e _g $ h $ i $ k $ l -c2In$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -c2in$ a $ b $ c $ d $ e $ x $ g $_$ i $ k $ l -c2an$ a $ b $ c $ d $ e $ x $ g _$ i $ k $ l -c2An$ a $ b $ c $ d $ e $ x $ g _i $ k $ l -c2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ _ $ l -c2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $_$ l -c2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i _$ l -c2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i _l -dIL$ a $ b $ c $ $ e $ x $ g $ h $ i $ k $ l -diL$ a $ b $ c $$ e $ x $ g $ h $ i $ k $ l -daL$ a $ b $ c $ e $ x $ g $ h $ i $ k $ l -dAL$ a $ b $ c e $ x $ g $ h $ i $ k $ l -dIl$ a $ b $ c $ d $ $ x $ g $ h $ i $ k $ l -dil$ a $ b $ c $ d $$ x $ g $ h $ i $ k $ l -dal$ a $ b $ c $ d $ x $ g $ h $ i $ k $ l -dAl$ a $ b $ c $ d x $ g $ h $ i $ k $ l -dI$ a $ b $ c $ d $ e $ $ g $ h $ i $ k $ l -di$ a $ b $ c $ d $ e $$ g $ h $ i $ k $ l -da$ a $ b $ c $ d $ e $ g $ h $ i $ k $ l -dA$ a $ b $ c $ d $ e g $ h $ i $ k $ l -dIn$ a $ b $ c $ d $ e $ x $ $ h $ i $ k $ l -din$ a $ b $ c $ d $ e $ x $$ h $ i $ k $ l -dan$ a $ b $ c $ d $ e $ x $ h $ i $ k $ l -dAn$ a $ b $ c $ d $ e $ x h $ i $ k $ l -dIN$ a $ b $ c $ d $ e $ x $ g $ $ i $ k $ l -diN$ a $ b $ c $ d $ e $ x $ g $$ i $ k $ l -daN$ a $ b $ c $ d $ e $ x $ g $ i $ k $ l -dAN$ a $ b $ c $ d $ e $ x $ g i $ k $ l -d1IL$ a $ b $ c $ $ e $ x $ g $ h $ i $ k $ l -d1iL$ a $ b $ c $$ e $ x $ g $ h $ i $ k $ l -d1aL$ a $ b $ c $ e $ x $ g $ h $ i $ k $ l -d1AL$ a $ b $ c e $ x $ g $ h $ i $ k $ l -d1Il$ a $ b $ c $ d $ $ x $ g $ h $ i $ k $ l -d1il$ a $ b $ c $ d $$ x $ g $ h $ i $ k $ l -d1al$ a $ b $ c $ d $ x $ g $ h $ i $ k $ l -d1Al$ a $ b $ c $ d x $ g $ h $ i $ k $ l -d1I$ a $ b $ c $ d $ e $ $ g $ h $ i $ k $ l -d1i$ a $ b $ c $ d $ e $$ g $ h $ i $ k $ l -d1a$ a $ b $ c $ d $ e $ g $ h $ i $ k $ l -d1A$ a $ b $ c $ d $ e g $ h $ i $ k $ l -d1In$ a $ b $ c $ d $ e $ x $ $ h $ i $ k $ l -d1in$ a $ b $ c $ d $ e $ x $$ h $ i $ k $ l -d1an$ a $ b $ c $ d $ e $ x $ h $ i $ k $ l -d1An$ a $ b $ c $ d $ e $ x h $ i $ k $ l -d1IN$ a $ b $ c $ d $ e $ x $ g $ $ i $ k $ l -d1iN$ a $ b $ c $ d $ e $ x $ g $$ i $ k $ l -d1aN$ a $ b $ c $ d $ e $ x $ g $ i $ k $ l -d1AN$ a $ b $ c $ d $ e $ x $ g i $ k $ l -d2IL$ a $ $ c $ d $ e $ x $ g $ h $ i $ k $ l -d2iL$ a $$ c $ d $ e $ x $ g $ h $ i $ k $ l -d2aL$ a $ c $ d $ e $ x $ g $ h $ i $ k $ l -d2AL$ a c $ d $ e $ x $ g $ h $ i $ k $ l -d2Il$ a $ b $ c $ $ e $ x $ g $ h $ i $ k $ l -d2il$ a $ b $ c $$ e $ x $ g $ h $ i $ k $ l -d2al$ a $ b $ c $ e $ x $ g $ h $ i $ k $ l -d2Al$ a $ b $ c e $ x $ g $ h $ i $ k $ l -d2I$ a $ b $ c $ d $ e $ $ g $ h $ i $ k $ l -d2i$ a $ b $ c $ d $ e $$ g $ h $ i $ k $ l -d2a$ a $ b $ c $ d $ e $ g $ h $ i $ k $ l -d2A$ a $ b $ c $ d $ e g $ h $ i $ k $ l -d2In$ a $ b $ c $ d $ e $ x $ g $ $ i $ k $ l -d2in$ a $ b $ c $ d $ e $ x $ g $$ i $ k $ l -d2an$ a $ b $ c $ d $ e $ x $ g $ i $ k $ l -d2An$ a $ b $ c $ d $ e $ x $ g i $ k $ l -d2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ $ l -d2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $$ l -d2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ l -d2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i l -yIL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'd' -yiL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' d ' -yaL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d ' -yAL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d $ ' -yIl$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'e' -yil$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' e ' -yal$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e ' -yAl$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e $ ' -yI$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'x' -yi$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' x ' -ya$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x ' -yA$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x $ ' -yIn$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'g' -yin$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' g ' -yan$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g ' -yAn$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g $ ' -yIN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'h' -yiN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' h ' -yaN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h ' -yAN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h $ ' -y1IL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'd' -y1iL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' d ' -y1aL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d ' -y1AL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d $ ' -y1Il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'e' -y1il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' e ' -y1al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e ' -y1Al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e $ ' -y1I$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'x' -y1i$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' x ' -y1a$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x ' -y1A$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x $ ' -y1In$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'g' -y1in$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' g ' -y1an$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g ' -y1An$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g $ ' -y1IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'h' -y1iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' h ' -y1aN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h ' -y1AN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h $ ' -y2IL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'b' -y2iL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' b ' -y2aL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ b ' -y2AL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ b $ ' -y2Il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'd' -y2il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' d ' -y2al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d ' -y2Al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d $ ' -y2I$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'x' -y2i$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' x ' -y2a$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x ' -y2A$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x $ ' -y2In$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'h' -y2in$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' h ' -y2an$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h ' -y2An$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h $ ' -y2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'k' -y2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' k ' -y2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ k ' -y2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ k $ ' -vIL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -viL$ a $ b $ c $___$ e $ x $ g $ h $ i $ k $ l -vaL$ a $ b $ c ____$ e $ x $ g $ h $ i $ k $ l -vAL$ a $ b $ c ______e $ x $ g $ h $ i $ k $ l -vIl$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -vil$ a $ b $ c $ d $___$ x $ g $ h $ i $ k $ l -val$ a $ b $ c $ d ____$ x $ g $ h $ i $ k $ l -vAl$ a $ b $ c $ d ______x $ g $ h $ i $ k $ l -vI$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -vi$ a $ b $ c $ d $ e $___$ g $ h $ i $ k $ l -va$ a $ b $ c $ d $ e ____$ g $ h $ i $ k $ l -vA$ a $ b $ c $ d $ e ______g $ h $ i $ k $ l -vIn$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -vin$ a $ b $ c $ d $ e $ x $___$ h $ i $ k $ l -van$ a $ b $ c $ d $ e $ x ____$ h $ i $ k $ l -vAn$ a $ b $ c $ d $ e $ x ______h $ i $ k $ l -vIN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -viN$ a $ b $ c $ d $ e $ x $ g $___$ i $ k $ l -vaN$ a $ b $ c $ d $ e $ x $ g ____$ i $ k $ l -vAN$ a $ b $ c $ d $ e $ x $ g ______i $ k $ l -v1IL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -v1iL$ a $ b $ c $___$ e $ x $ g $ h $ i $ k $ l -v1aL$ a $ b $ c ____$ e $ x $ g $ h $ i $ k $ l -v1AL$ a $ b $ c ______e $ x $ g $ h $ i $ k $ l -v1Il$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -v1il$ a $ b $ c $ d $___$ x $ g $ h $ i $ k $ l -v1al$ a $ b $ c $ d ____$ x $ g $ h $ i $ k $ l -v1Al$ a $ b $ c $ d ______x $ g $ h $ i $ k $ l -v1I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -v1i$ a $ b $ c $ d $ e $___$ g $ h $ i $ k $ l -v1a$ a $ b $ c $ d $ e ____$ g $ h $ i $ k $ l -v1A$ a $ b $ c $ d $ e ______g $ h $ i $ k $ l -v1In$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -v1in$ a $ b $ c $ d $ e $ x $___$ h $ i $ k $ l -v1an$ a $ b $ c $ d $ e $ x ____$ h $ i $ k $ l -v1An$ a $ b $ c $ d $ e $ x ______h $ i $ k $ l -v1IN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -v1iN$ a $ b $ c $ d $ e $ x $ g $___$ i $ k $ l -v1aN$ a $ b $ c $ d $ e $ x $ g ____$ i $ k $ l -v1AN$ a $ b $ c $ d $ e $ x $ g ______i $ k $ l -v2IL$ a $ _ $ c $ d $ e $ x $ g $ h $ i $ k $ l -v2iL$ a $___$ c $ d $ e $ x $ g $ h $ i $ k $ l -v2aL$ a ____$ c $ d $ e $ x $ g $ h $ i $ k $ l -v2AL$ a ______c $ d $ e $ x $ g $ h $ i $ k $ l -v2Il$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -v2il$ a $ b $ c $___$ e $ x $ g $ h $ i $ k $ l -v2al$ a $ b $ c ____$ e $ x $ g $ h $ i $ k $ l -v2Al$ a $ b $ c ______e $ x $ g $ h $ i $ k $ l -v2I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -v2i$ a $ b $ c $ d $ e $___$ g $ h $ i $ k $ l -v2a$ a $ b $ c $ d $ e ____$ g $ h $ i $ k $ l -v2A$ a $ b $ c $ d $ e ______g $ h $ i $ k $ l -v2In$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -v2in$ a $ b $ c $ d $ e $ x $ g $___$ i $ k $ l -v2an$ a $ b $ c $ d $ e $ x $ g ____$ i $ k $ l -v2An$ a $ b $ c $ d $ e $ x $ g ______i $ k $ l -v2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ _ $ l -v2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $___$ l -v2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i ____$ l -v2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i ______l - -a ( b , c ( d ) , d ( x , e ) , f ) g -cIla a ( b , _ , d ( x , e ) , f ) g -cila a ( b ,_, d ( x , e ) , f ) g -cala a ( b _, d ( x , e ) , f ) g -cAla a ( b _d ( x , e ) , f ) g -cIa a ( b , c ( d ) , d ( _ , e ) , f ) g -cia a ( b , c ( d ) , d (_, e ) , f ) g -caa a ( b , c ( d ) , d ( _e ) , f ) g -cAa a ( b , c ( d ) , d _e ) , f ) g -cIna a ( b , c ( d ) , d ( x , _ ) , f ) g -cina a ( b , c ( d ) , d ( x ,_) , f ) g -cana a ( b , c ( d ) , d ( x_ ) , f ) g -cAna a ( b , c ( d ) , d ( x _, f ) g -c1Ila a ( b , _ , d ( x , e ) , f ) g -c1ila a ( b ,_, d ( x , e ) , f ) g -c1ala a ( b _, d ( x , e ) , f ) g -c1Ala a ( b _d ( x , e ) , f ) g -c1Ia a ( b , c ( d ) , d ( _ , e ) , f ) g -c1ia a ( b , c ( d ) , d (_, e ) , f ) g -c1aa a ( b , c ( d ) , d ( _e ) , f ) g -c1Aa a ( b , c ( d ) , d _e ) , f ) g -c1Ina a ( b , c ( d ) , d ( x , _ ) , f ) g -c1ina a ( b , c ( d ) , d ( x ,_) , f ) g -c1ana a ( b , c ( d ) , d ( x_ ) , f ) g -c1Ana a ( b , c ( d ) , d ( x _, f ) g -c2Ila a ( b , c ( _ ) , d ( x , e ) , f ) g -c2ila a ( b , c (_) , d ( x , e ) , f ) g -c2ala a ( b , c (_) , d ( x , e ) , f ) g -c2Ala a ( b , c _, d ( x , e ) , f ) g -c2Ia a ( b , c ( d ) , _ , f ) g -c2ia a ( b , c ( d ) ,_, f ) g -c2aa a ( b , c ( d ) _, f ) g -c2Aa a ( b , c ( d ) _f ) g -c2Ina a ( b , c ( d ) , d ( x , e ) , _ ) g -c2ina a ( b , c ( d ) , d ( x , e ) ,_) g -c2ana a ( b , c ( d ) , d ( x , e )_ ) g -c2Ana a ( b , c ( d ) , d ( x , e ) _g -dIla a ( b , , d ( x , e ) , f ) g -dila a ( b ,, d ( x , e ) , f ) g -dala a ( b , d ( x , e ) , f ) g -dAla a ( b d ( x , e ) , f ) g -dIa a ( b , c ( d ) , d ( , e ) , f ) g -dia a ( b , c ( d ) , d (, e ) , f ) g -daa a ( b , c ( d ) , d ( e ) , f ) g -dAa a ( b , c ( d ) , d e ) , f ) g -dIna a ( b , c ( d ) , d ( x , ) , f ) g -dina a ( b , c ( d ) , d ( x ,) , f ) g -dana a ( b , c ( d ) , d ( x ) , f ) g -dAna a ( b , c ( d ) , d ( x , f ) g -d1Ila a ( b , , d ( x , e ) , f ) g -d1ila a ( b ,, d ( x , e ) , f ) g -d1ala a ( b , d ( x , e ) , f ) g -d1Ala a ( b d ( x , e ) , f ) g -d1Ia a ( b , c ( d ) , d ( , e ) , f ) g -d1ia a ( b , c ( d ) , d (, e ) , f ) g -d1aa a ( b , c ( d ) , d ( e ) , f ) g -d1Aa a ( b , c ( d ) , d e ) , f ) g -d1Ina a ( b , c ( d ) , d ( x , ) , f ) g -d1ina a ( b , c ( d ) , d ( x ,) , f ) g -d1ana a ( b , c ( d ) , d ( x ) , f ) g -d1Ana a ( b , c ( d ) , d ( x , f ) g -d2Ila a ( b , c ( ) , d ( x , e ) , f ) g -d2ila a ( b , c () , d ( x , e ) , f ) g -d2ala a ( b , c () , d ( x , e ) , f ) g -d2Ala a ( b , c , d ( x , e ) , f ) g -d2Ia a ( b , c ( d ) , , f ) g -d2ia a ( b , c ( d ) ,, f ) g -d2aa a ( b , c ( d ) , f ) g -d2Aa a ( b , c ( d ) f ) g -d2Ina a ( b , c ( d ) , d ( x , e ) , ) g -d2ina a ( b , c ( d ) , d ( x , e ) ,) g -d2ana a ( b , c ( d ) , d ( x , e ) ) g -d2Ana a ( b , c ( d ) , d ( x , e ) g -yIla a ( b , c ( d ) , d ( x , e ) , f ) g 'c ( d )' -yila a ( b , c ( d ) , d ( x , e ) , f ) g ' c ( d ) ' -yala a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) ' -yAla a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) , ' -yIa a ( b , c ( d ) , d ( x , e ) , f ) g 'x' -yia a ( b , c ( d ) , d ( x , e ) , f ) g ' x ' -yaa a ( b , c ( d ) , d ( x , e ) , f ) g 'x , ' -yAa a ( b , c ( d ) , d ( x , e ) , f ) g '( x , ' -yIna a ( b , c ( d ) , d ( x , e ) , f ) g 'e' -yina a ( b , c ( d ) , d ( x , e ) , f ) g ' e ' -yana a ( b , c ( d ) , d ( x , e ) , f ) g ' , e' -yAna a ( b , c ( d ) , d ( x , e ) , f ) g ', e ) ' -y1Ila a ( b , c ( d ) , d ( x , e ) , f ) g 'c ( d )' -y1ila a ( b , c ( d ) , d ( x , e ) , f ) g ' c ( d ) ' -y1ala a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) ' -y1Ala a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) , ' -y1Ia a ( b , c ( d ) , d ( x , e ) , f ) g 'x' -y1ia a ( b , c ( d ) , d ( x , e ) , f ) g ' x ' -y1aa a ( b , c ( d ) , d ( x , e ) , f ) g 'x , ' -y1Aa a ( b , c ( d ) , d ( x , e ) , f ) g '( x , ' -y1Ina a ( b , c ( d ) , d ( x , e ) , f ) g 'e' -y1ina a ( b , c ( d ) , d ( x , e ) , f ) g ' e ' -y1ana a ( b , c ( d ) , d ( x , e ) , f ) g ' , e' -y1Ana a ( b , c ( d ) , d ( x , e ) , f ) g ', e ) ' -y2Ila a ( b , c ( d ) , d ( x , e ) , f ) g 'd' -y2ila a ( b , c ( d ) , d ( x , e ) , f ) g ' d ' -y2ala a ( b , c ( d ) , d ( x , e ) , f ) g ' d ' -y2Ala a ( b , c ( d ) , d ( x , e ) , f ) g '( d ) ' -y2Ia a ( b , c ( d ) , d ( x , e ) , f ) g 'd ( x , e )' -y2ia a ( b , c ( d ) , d ( x , e ) , f ) g ' d ( x , e ) ' -y2aa a ( b , c ( d ) , d ( x , e ) , f ) g ', d ( x , e ) ' -y2Aa a ( b , c ( d ) , d ( x , e ) , f ) g ', d ( x , e ) , ' -y2Ina a ( b , c ( d ) , d ( x , e ) , f ) g 'f' -y2ina a ( b , c ( d ) , d ( x , e ) , f ) g ' f ' -y2ana a ( b , c ( d ) , d ( x , e ) , f ) g ' , f' -y2Ana a ( b , c ( d ) , d ( x , e ) , f ) g ', f ) ' -vIla a ( b , _______ , d ( x , e ) , f ) g -vila a ( b ,_________, d ( x , e ) , f ) g -vala a ( b __________, d ( x , e ) , f ) g -vAla a ( b ____________d ( x , e ) , f ) g -vIa a ( b , c ( d ) , d ( _ , e ) , f ) g -via a ( b , c ( d ) , d (___, e ) , f ) g -vaa a ( b , c ( d ) , d ( ____e ) , f ) g -vAa a ( b , c ( d ) , d ______e ) , f ) g -vIna a ( b , c ( d ) , d ( x , _ ) , f ) g -vina a ( b , c ( d ) , d ( x ,___) , f ) g -vana a ( b , c ( d ) , d ( x____ ) , f ) g -vAna a ( b , c ( d ) , d ( x ______, f ) g -v1Ila a ( b , _______ , d ( x , e ) , f ) g -v1ila a ( b ,_________, d ( x , e ) , f ) g -v1ala a ( b __________, d ( x , e ) , f ) g -v1Ala a ( b ____________d ( x , e ) , f ) g -v1Ia a ( b , c ( d ) , d ( _ , e ) , f ) g -v1ia a ( b , c ( d ) , d (___, e ) , f ) g -v1aa a ( b , c ( d ) , d ( ____e ) , f ) g -v1Aa a ( b , c ( d ) , d ______e ) , f ) g -v1Ina a ( b , c ( d ) , d ( x , _ ) , f ) g -v1ina a ( b , c ( d ) , d ( x ,___) , f ) g -v1ana a ( b , c ( d ) , d ( x____ ) , f ) g -v1Ana a ( b , c ( d ) , d ( x ______, f ) g -v2Ila a ( b , c ( _ ) , d ( x , e ) , f ) g -v2ila a ( b , c (___) , d ( x , e ) , f ) g -v2ala a ( b , c (___) , d ( x , e ) , f ) g -v2Ala a ( b , c ______, d ( x , e ) , f ) g -v2Ia a ( b , c ( d ) , ___________ , f ) g -v2ia a ( b , c ( d ) ,_____________, f ) g -v2aa a ( b , c ( d ) ______________, f ) g -v2Aa a ( b , c ( d ) ________________f ) g -v2Ina a ( b , c ( d ) , d ( x , e ) , _ ) g -v2ina a ( b , c ( d ) , d ( x , e ) ,___) g -v2ana a ( b , c ( d ) , d ( x , e )____ ) g -v2Ana a ( b , c ( d ) , d ( x , e ) ______g diff --git a/vim/default/bundle/targets.vim/test/test1.out b/vim/default/bundle/targets.vim/test/test1.out deleted file mode 100644 index 96ab4d6bac..0000000000 --- a/vim/default/bundle/targets.vim/test/test1.out +++ /dev/null @@ -1,6316 +0,0 @@ -a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g -cIl( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -cIl) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -cIlb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -cil( a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -cil) a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -cilb a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -cal( a ( b ) _ ( ( x ) ) ( e ) ( f ) g -cal) a ( b ) _ ( ( x ) ) ( e ) ( f ) g -calb a ( b ) _ ( ( x ) ) ( e ) ( f ) g -cAl( a ( b ) _( ( x ) ) ( e ) ( f ) g -cAl) a ( b ) _( ( x ) ) ( e ) ( f ) g -cAlb a ( b ) _( ( x ) ) ( e ) ( f ) g -cI( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -cI) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -cIb a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -ci( a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -ci) a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -cib a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -ca( a ( b ) ( c ) ( _ ) ( e ) ( f ) g -ca) a ( b ) ( c ) ( _ ) ( e ) ( f ) g -cab a ( b ) ( c ) ( _ ) ( e ) ( f ) g -cA( a ( b ) ( c ) ( _) ( e ) ( f ) g -cA) a ( b ) ( c ) ( _) ( e ) ( f ) g -cAb a ( b ) ( c ) ( _) ( e ) ( f ) g -cIn( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -cIn) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -cInb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -cin( a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -cin) a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -cinb a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -can( a ( b ) ( c ) ( ( x ) ) _ ( f ) g -can) a ( b ) ( c ) ( ( x ) ) _ ( f ) g -canb a ( b ) ( c ) ( ( x ) ) _ ( f ) g -cAn( a ( b ) ( c ) ( ( x ) ) _( f ) g -cAn) a ( b ) ( c ) ( ( x ) ) _( f ) g -cAnb a ( b ) ( c ) ( ( x ) ) _( f ) g -c1Il( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -c1Il) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -c1Ilb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -c1il( a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -c1il) a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -c1ilb a ( b ) (_) ( ( x ) ) ( e ) ( f ) g -c1al( a ( b ) _ ( ( x ) ) ( e ) ( f ) g -c1al) a ( b ) _ ( ( x ) ) ( e ) ( f ) g -c1alb a ( b ) _ ( ( x ) ) ( e ) ( f ) g -c1Al( a ( b ) _( ( x ) ) ( e ) ( f ) g -c1Al) a ( b ) _( ( x ) ) ( e ) ( f ) g -c1Alb a ( b ) _( ( x ) ) ( e ) ( f ) g -c1I( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -c1I) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -c1Ib a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -c1i( a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -c1i) a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -c1ib a ( b ) ( c ) ( (_) ) ( e ) ( f ) g -c1a( a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c1a) a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c1ab a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c1A( a ( b ) ( c ) ( _) ( e ) ( f ) g -c1A) a ( b ) ( c ) ( _) ( e ) ( f ) g -c1Ab a ( b ) ( c ) ( _) ( e ) ( f ) g -c1In( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -c1In) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -c1Inb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -c1in( a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -c1in) a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -c1inb a ( b ) ( c ) ( ( x ) ) (_) ( f ) g -c1an( a ( b ) ( c ) ( ( x ) ) _ ( f ) g -c1an) a ( b ) ( c ) ( ( x ) ) _ ( f ) g -c1anb a ( b ) ( c ) ( ( x ) ) _ ( f ) g -c1An( a ( b ) ( c ) ( ( x ) ) _( f ) g -c1An) a ( b ) ( c ) ( ( x ) ) _( f ) g -c1Anb a ( b ) ( c ) ( ( x ) ) _( f ) g -c2Il( a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -c2Il) a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -c2Ilb a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -c2il( a (_) ( c ) ( ( x ) ) ( e ) ( f ) g -c2il) a (_) ( c ) ( ( x ) ) ( e ) ( f ) g -c2ilb a (_) ( c ) ( ( x ) ) ( e ) ( f ) g -c2al( a _ ( c ) ( ( x ) ) ( e ) ( f ) g -c2al) a _ ( c ) ( ( x ) ) ( e ) ( f ) g -c2alb a _ ( c ) ( ( x ) ) ( e ) ( f ) g -c2Al( a _( c ) ( ( x ) ) ( e ) ( f ) g -c2Al) a _( c ) ( ( x ) ) ( e ) ( f ) g -c2Alb a _( c ) ( ( x ) ) ( e ) ( f ) g -c2I( a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c2I) a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c2Ib a ( b ) ( c ) ( _ ) ( e ) ( f ) g -c2i( a ( b ) ( c ) (_) ( e ) ( f ) g -c2i) a ( b ) ( c ) (_) ( e ) ( f ) g -c2ib a ( b ) ( c ) (_) ( e ) ( f ) g -c2a( a ( b ) ( c ) _ ( e ) ( f ) g -c2a) a ( b ) ( c ) _ ( e ) ( f ) g -c2ab a ( b ) ( c ) _ ( e ) ( f ) g -c2A( a ( b ) ( c ) _( e ) ( f ) g -c2A) a ( b ) ( c ) _( e ) ( f ) g -c2Ab a ( b ) ( c ) _( e ) ( f ) g -c2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -c2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -c2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -c2in( a ( b ) ( c ) ( ( x ) ) ( e ) (_) g -c2in) a ( b ) ( c ) ( ( x ) ) ( e ) (_) g -c2inb a ( b ) ( c ) ( ( x ) ) ( e ) (_) g -c2an( a ( b ) ( c ) ( ( x ) ) ( e ) _ g -c2an) a ( b ) ( c ) ( ( x ) ) ( e ) _ g -c2anb a ( b ) ( c ) ( ( x ) ) ( e ) _ g -c2An( a ( b ) ( c ) ( ( x ) ) ( e ) _g -c2An) a ( b ) ( c ) ( ( x ) ) ( e ) _g -c2Anb a ( b ) ( c ) ( ( x ) ) ( e ) _g -dIl( a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -dIl) a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -dIlb a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -dil( a ( b ) () ( ( x ) ) ( e ) ( f ) g -dil) a ( b ) () ( ( x ) ) ( e ) ( f ) g -dilb a ( b ) () ( ( x ) ) ( e ) ( f ) g -dal( a ( b ) ( ( x ) ) ( e ) ( f ) g -dal) a ( b ) ( ( x ) ) ( e ) ( f ) g -dalb a ( b ) ( ( x ) ) ( e ) ( f ) g -dAl( a ( b ) ( ( x ) ) ( e ) ( f ) g -dAl) a ( b ) ( ( x ) ) ( e ) ( f ) g -dAlb a ( b ) ( ( x ) ) ( e ) ( f ) g -dI( a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -dI) a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -dIb a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -di( a ( b ) ( c ) ( () ) ( e ) ( f ) g -di) a ( b ) ( c ) ( () ) ( e ) ( f ) g -dib a ( b ) ( c ) ( () ) ( e ) ( f ) g -da( a ( b ) ( c ) ( ) ( e ) ( f ) g -da) a ( b ) ( c ) ( ) ( e ) ( f ) g -dab a ( b ) ( c ) ( ) ( e ) ( f ) g -dA( a ( b ) ( c ) ( ) ( e ) ( f ) g -dA) a ( b ) ( c ) ( ) ( e ) ( f ) g -dAb a ( b ) ( c ) ( ) ( e ) ( f ) g -dIn( a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -dIn) a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -dInb a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -din( a ( b ) ( c ) ( ( x ) ) () ( f ) g -din) a ( b ) ( c ) ( ( x ) ) () ( f ) g -dinb a ( b ) ( c ) ( ( x ) ) () ( f ) g -dan( a ( b ) ( c ) ( ( x ) ) ( f ) g -dan) a ( b ) ( c ) ( ( x ) ) ( f ) g -danb a ( b ) ( c ) ( ( x ) ) ( f ) g -dAn( a ( b ) ( c ) ( ( x ) ) ( f ) g -dAn) a ( b ) ( c ) ( ( x ) ) ( f ) g -dAnb a ( b ) ( c ) ( ( x ) ) ( f ) g -d1Il( a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -d1Il) a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -d1Ilb a ( b ) ( ) ( ( x ) ) ( e ) ( f ) g -d1il( a ( b ) () ( ( x ) ) ( e ) ( f ) g -d1il) a ( b ) () ( ( x ) ) ( e ) ( f ) g -d1ilb a ( b ) () ( ( x ) ) ( e ) ( f ) g -d1al( a ( b ) ( ( x ) ) ( e ) ( f ) g -d1al) a ( b ) ( ( x ) ) ( e ) ( f ) g -d1alb a ( b ) ( ( x ) ) ( e ) ( f ) g -d1Al( a ( b ) ( ( x ) ) ( e ) ( f ) g -d1Al) a ( b ) ( ( x ) ) ( e ) ( f ) g -d1Alb a ( b ) ( ( x ) ) ( e ) ( f ) g -d1I( a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -d1I) a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -d1Ib a ( b ) ( c ) ( ( ) ) ( e ) ( f ) g -d1i( a ( b ) ( c ) ( () ) ( e ) ( f ) g -d1i) a ( b ) ( c ) ( () ) ( e ) ( f ) g -d1ib a ( b ) ( c ) ( () ) ( e ) ( f ) g -d1a( a ( b ) ( c ) ( ) ( e ) ( f ) g -d1a) a ( b ) ( c ) ( ) ( e ) ( f ) g -d1ab a ( b ) ( c ) ( ) ( e ) ( f ) g -d1A( a ( b ) ( c ) ( ) ( e ) ( f ) g -d1A) a ( b ) ( c ) ( ) ( e ) ( f ) g -d1Ab a ( b ) ( c ) ( ) ( e ) ( f ) g -d1In( a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -d1In) a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -d1Inb a ( b ) ( c ) ( ( x ) ) ( ) ( f ) g -d1in( a ( b ) ( c ) ( ( x ) ) () ( f ) g -d1in) a ( b ) ( c ) ( ( x ) ) () ( f ) g -d1inb a ( b ) ( c ) ( ( x ) ) () ( f ) g -d1an( a ( b ) ( c ) ( ( x ) ) ( f ) g -d1an) a ( b ) ( c ) ( ( x ) ) ( f ) g -d1anb a ( b ) ( c ) ( ( x ) ) ( f ) g -d1An( a ( b ) ( c ) ( ( x ) ) ( f ) g -d1An) a ( b ) ( c ) ( ( x ) ) ( f ) g -d1Anb a ( b ) ( c ) ( ( x ) ) ( f ) g -d2Il( a ( ) ( c ) ( ( x ) ) ( e ) ( f ) g -d2Il) a ( ) ( c ) ( ( x ) ) ( e ) ( f ) g -d2Ilb a ( ) ( c ) ( ( x ) ) ( e ) ( f ) g -d2il( a () ( c ) ( ( x ) ) ( e ) ( f ) g -d2il) a () ( c ) ( ( x ) ) ( e ) ( f ) g -d2ilb a () ( c ) ( ( x ) ) ( e ) ( f ) g -d2al( a ( c ) ( ( x ) ) ( e ) ( f ) g -d2al) a ( c ) ( ( x ) ) ( e ) ( f ) g -d2alb a ( c ) ( ( x ) ) ( e ) ( f ) g -d2Al( a ( c ) ( ( x ) ) ( e ) ( f ) g -d2Al) a ( c ) ( ( x ) ) ( e ) ( f ) g -d2Alb a ( c ) ( ( x ) ) ( e ) ( f ) g -d2I( a ( b ) ( c ) ( ) ( e ) ( f ) g -d2I) a ( b ) ( c ) ( ) ( e ) ( f ) g -d2Ib a ( b ) ( c ) ( ) ( e ) ( f ) g -d2i( a ( b ) ( c ) () ( e ) ( f ) g -d2i) a ( b ) ( c ) () ( e ) ( f ) g -d2ib a ( b ) ( c ) () ( e ) ( f ) g -d2a( a ( b ) ( c ) ( e ) ( f ) g -d2a) a ( b ) ( c ) ( e ) ( f ) g -d2ab a ( b ) ( c ) ( e ) ( f ) g -d2A( a ( b ) ( c ) ( e ) ( f ) g -d2A) a ( b ) ( c ) ( e ) ( f ) g -d2Ab a ( b ) ( c ) ( e ) ( f ) g -d2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( ) g -d2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( ) g -d2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( ) g -d2in( a ( b ) ( c ) ( ( x ) ) ( e ) () g -d2in) a ( b ) ( c ) ( ( x ) ) ( e ) () g -d2inb a ( b ) ( c ) ( ( x ) ) ( e ) () g -d2an( a ( b ) ( c ) ( ( x ) ) ( e ) g -d2an) a ( b ) ( c ) ( ( x ) ) ( e ) g -d2anb a ( b ) ( c ) ( ( x ) ) ( e ) g -d2An( a ( b ) ( c ) ( ( x ) ) ( e ) g -d2An) a ( b ) ( c ) ( ( x ) ) ( e ) g -d2Anb a ( b ) ( c ) ( ( x ) ) ( e ) g -yIl( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -yIl) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -yIlb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -yil( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -yil) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -yilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -yal( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -yal) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -yalb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -yAl( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -yAl) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -yAlb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -yI( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -yI) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -yIb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -yi( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -yi) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -yib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -ya( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -ya) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -yab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -yA( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -yA) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -yAb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -yIn( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -yIn) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -yInb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -yin( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -yin) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -yinb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -yan( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -yan) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -yanb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -yAn( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -yAn) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -yAnb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y1Il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -y1Il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -y1Ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'c' -y1il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -y1il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -y1ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' c ' -y1al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -y1al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -y1alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c )' -y1Al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -y1Al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -y1Alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( c ) ' -y1I( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -y1I) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -y1Ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'x' -y1i( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -y1i) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -y1ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' x ' -y1a( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y1a) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y1ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y1A( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -y1A) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -y1Ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x ) ' -y1In( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -y1In) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -y1Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'e' -y1in( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -y1in) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -y1inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' e ' -y1an( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -y1an) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -y1anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e )' -y1An( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y1An) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y1Anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( e ) ' -y2Il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'b' -y2Il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'b' -y2Ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'b' -y2il( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' b ' -y2il) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' b ' -y2ilb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' b ' -y2al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b )' -y2al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b )' -y2alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b )' -y2Al( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b ) ' -y2Al) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b ) ' -y2Alb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( b ) ' -y2I( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y2I) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y2Ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( x )' -y2i( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' ( x ) ' -y2i) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' ( x ) ' -y2ib a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' ( x ) ' -y2a( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) )' -y2a) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) )' -y2ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) )' -y2A( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) ) ' -y2A) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) ) ' -y2Ab a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( ( x ) ) ' -y2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'f' -y2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'f' -y2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g 'f' -y2in( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' f ' -y2in) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' f ' -y2inb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g ' f ' -y2an( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f )' -y2an) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f )' -y2anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f )' -y2An( a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f ) ' -y2An) a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f ) ' -y2Anb a ( b ) ( c ) ( ( x ) ) ( e ) ( f ) g '( f ) ' -vIl( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -vIl) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -vIlb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -vil( a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -vil) a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -vilb a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -val( a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -val) a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -valb a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -vAl( a ( b ) ______( ( x ) ) ( e ) ( f ) g -vAl) a ( b ) ______( ( x ) ) ( e ) ( f ) g -vAlb a ( b ) ______( ( x ) ) ( e ) ( f ) g -vI( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -vI) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -vIb a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -vi( a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -vi) a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -vib a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -va( a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -va) a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -vab a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -vA( a ( b ) ( c ) ( ______) ( e ) ( f ) g -vA) a ( b ) ( c ) ( ______) ( e ) ( f ) g -vAb a ( b ) ( c ) ( ______) ( e ) ( f ) g -vIn( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -vIn) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -vInb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -vin( a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -vin) a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -vinb a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -van( a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -van) a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -vanb a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -vAn( a ( b ) ( c ) ( ( x ) ) ______( f ) g -vAn) a ( b ) ( c ) ( ( x ) ) ______( f ) g -vAnb a ( b ) ( c ) ( ( x ) ) ______( f ) g -v1Il( a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -v1Il) a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -v1Ilb a ( b ) ( _ ) ( ( x ) ) ( e ) ( f ) g -v1il( a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -v1il) a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -v1ilb a ( b ) (___) ( ( x ) ) ( e ) ( f ) g -v1al( a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -v1al) a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -v1alb a ( b ) _____ ( ( x ) ) ( e ) ( f ) g -v1Al( a ( b ) ______( ( x ) ) ( e ) ( f ) g -v1Al) a ( b ) ______( ( x ) ) ( e ) ( f ) g -v1Alb a ( b ) ______( ( x ) ) ( e ) ( f ) g -v1I( a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -v1I) a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -v1Ib a ( b ) ( c ) ( ( _ ) ) ( e ) ( f ) g -v1i( a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -v1i) a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -v1ib a ( b ) ( c ) ( (___) ) ( e ) ( f ) g -v1a( a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v1a) a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v1ab a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v1A( a ( b ) ( c ) ( ______) ( e ) ( f ) g -v1A) a ( b ) ( c ) ( ______) ( e ) ( f ) g -v1Ab a ( b ) ( c ) ( ______) ( e ) ( f ) g -v1In( a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -v1In) a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -v1Inb a ( b ) ( c ) ( ( x ) ) ( _ ) ( f ) g -v1in( a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -v1in) a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -v1inb a ( b ) ( c ) ( ( x ) ) (___) ( f ) g -v1an( a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -v1an) a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -v1anb a ( b ) ( c ) ( ( x ) ) _____ ( f ) g -v1An( a ( b ) ( c ) ( ( x ) ) ______( f ) g -v1An) a ( b ) ( c ) ( ( x ) ) ______( f ) g -v1Anb a ( b ) ( c ) ( ( x ) ) ______( f ) g -v2Il( a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -v2Il) a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -v2Ilb a ( _ ) ( c ) ( ( x ) ) ( e ) ( f ) g -v2il( a (___) ( c ) ( ( x ) ) ( e ) ( f ) g -v2il) a (___) ( c ) ( ( x ) ) ( e ) ( f ) g -v2ilb a (___) ( c ) ( ( x ) ) ( e ) ( f ) g -v2al( a _____ ( c ) ( ( x ) ) ( e ) ( f ) g -v2al) a _____ ( c ) ( ( x ) ) ( e ) ( f ) g -v2alb a _____ ( c ) ( ( x ) ) ( e ) ( f ) g -v2Al( a ______( c ) ( ( x ) ) ( e ) ( f ) g -v2Al) a ______( c ) ( ( x ) ) ( e ) ( f ) g -v2Alb a ______( c ) ( ( x ) ) ( e ) ( f ) g -v2I( a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v2I) a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v2Ib a ( b ) ( c ) ( _____ ) ( e ) ( f ) g -v2i( a ( b ) ( c ) (_______) ( e ) ( f ) g -v2i) a ( b ) ( c ) (_______) ( e ) ( f ) g -v2ib a ( b ) ( c ) (_______) ( e ) ( f ) g -v2a( a ( b ) ( c ) _________ ( e ) ( f ) g -v2a) a ( b ) ( c ) _________ ( e ) ( f ) g -v2ab a ( b ) ( c ) _________ ( e ) ( f ) g -v2A( a ( b ) ( c ) __________( e ) ( f ) g -v2A) a ( b ) ( c ) __________( e ) ( f ) g -v2Ab a ( b ) ( c ) __________( e ) ( f ) g -v2In( a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -v2In) a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -v2Inb a ( b ) ( c ) ( ( x ) ) ( e ) ( _ ) g -v2in( a ( b ) ( c ) ( ( x ) ) ( e ) (___) g -v2in) a ( b ) ( c ) ( ( x ) ) ( e ) (___) g -v2inb a ( b ) ( c ) ( ( x ) ) ( e ) (___) g -v2an( a ( b ) ( c ) ( ( x ) ) ( e ) _____ g -v2an) a ( b ) ( c ) ( ( x ) ) ( e ) _____ g -v2anb a ( b ) ( c ) ( ( x ) ) ( e ) _____ g -v2An( a ( b ) ( c ) ( ( x ) ) ( e ) ______g -v2An) a ( b ) ( c ) ( ( x ) ) ( e ) ______g -v2Anb a ( b ) ( c ) ( ( x ) ) ( e ) ______g -a { b } { c } { { x } } { e } { f } g -cIl{ a { b } { _ } { { x } } { e } { f } g -cIl} a { b } { _ } { { x } } { e } { f } g -cIlB a { b } { _ } { { x } } { e } { f } g -cil{ a { b } {_} { { x } } { e } { f } g -cil} a { b } {_} { { x } } { e } { f } g -cilB a { b } {_} { { x } } { e } { f } g -cal{ a { b } _ { { x } } { e } { f } g -cal} a { b } _ { { x } } { e } { f } g -calB a { b } _ { { x } } { e } { f } g -cAl{ a { b } _{ { x } } { e } { f } g -cAl} a { b } _{ { x } } { e } { f } g -cAlB a { b } _{ { x } } { e } { f } g -cI{ a { b } { c } { { _ } } { e } { f } g -cI} a { b } { c } { { _ } } { e } { f } g -cIB a { b } { c } { { _ } } { e } { f } g -ci{ a { b } { c } { {_} } { e } { f } g -ci} a { b } { c } { {_} } { e } { f } g -ciB a { b } { c } { {_} } { e } { f } g -ca{ a { b } { c } { _ } { e } { f } g -ca} a { b } { c } { _ } { e } { f } g -caB a { b } { c } { _ } { e } { f } g -cA{ a { b } { c } { _} { e } { f } g -cA} a { b } { c } { _} { e } { f } g -cAB a { b } { c } { _} { e } { f } g -cIn{ a { b } { c } { { x } } { _ } { f } g -cIn} a { b } { c } { { x } } { _ } { f } g -cInB a { b } { c } { { x } } { _ } { f } g -cin{ a { b } { c } { { x } } {_} { f } g -cin} a { b } { c } { { x } } {_} { f } g -cinB a { b } { c } { { x } } {_} { f } g -can{ a { b } { c } { { x } } _ { f } g -can} a { b } { c } { { x } } _ { f } g -canB a { b } { c } { { x } } _ { f } g -cAn{ a { b } { c } { { x } } _{ f } g -cAn} a { b } { c } { { x } } _{ f } g -cAnB a { b } { c } { { x } } _{ f } g -c1Il{ a { b } { _ } { { x } } { e } { f } g -c1Il} a { b } { _ } { { x } } { e } { f } g -c1IlB a { b } { _ } { { x } } { e } { f } g -c1il{ a { b } {_} { { x } } { e } { f } g -c1il} a { b } {_} { { x } } { e } { f } g -c1ilB a { b } {_} { { x } } { e } { f } g -c1al{ a { b } _ { { x } } { e } { f } g -c1al} a { b } _ { { x } } { e } { f } g -c1alB a { b } _ { { x } } { e } { f } g -c1Al{ a { b } _{ { x } } { e } { f } g -c1Al} a { b } _{ { x } } { e } { f } g -c1AlB a { b } _{ { x } } { e } { f } g -c1I{ a { b } { c } { { _ } } { e } { f } g -c1I} a { b } { c } { { _ } } { e } { f } g -c1IB a { b } { c } { { _ } } { e } { f } g -c1i{ a { b } { c } { {_} } { e } { f } g -c1i} a { b } { c } { {_} } { e } { f } g -c1iB a { b } { c } { {_} } { e } { f } g -c1a{ a { b } { c } { _ } { e } { f } g -c1a} a { b } { c } { _ } { e } { f } g -c1aB a { b } { c } { _ } { e } { f } g -c1A{ a { b } { c } { _} { e } { f } g -c1A} a { b } { c } { _} { e } { f } g -c1AB a { b } { c } { _} { e } { f } g -c1In{ a { b } { c } { { x } } { _ } { f } g -c1In} a { b } { c } { { x } } { _ } { f } g -c1InB a { b } { c } { { x } } { _ } { f } g -c1in{ a { b } { c } { { x } } {_} { f } g -c1in} a { b } { c } { { x } } {_} { f } g -c1inB a { b } { c } { { x } } {_} { f } g -c1an{ a { b } { c } { { x } } _ { f } g -c1an} a { b } { c } { { x } } _ { f } g -c1anB a { b } { c } { { x } } _ { f } g -c1An{ a { b } { c } { { x } } _{ f } g -c1An} a { b } { c } { { x } } _{ f } g -c1AnB a { b } { c } { { x } } _{ f } g -c2Il{ a { _ } { c } { { x } } { e } { f } g -c2Il} a { _ } { c } { { x } } { e } { f } g -c2IlB a { _ } { c } { { x } } { e } { f } g -c2il{ a {_} { c } { { x } } { e } { f } g -c2il} a {_} { c } { { x } } { e } { f } g -c2ilB a {_} { c } { { x } } { e } { f } g -c2al{ a _ { c } { { x } } { e } { f } g -c2al} a _ { c } { { x } } { e } { f } g -c2alB a _ { c } { { x } } { e } { f } g -c2Al{ a _{ c } { { x } } { e } { f } g -c2Al} a _{ c } { { x } } { e } { f } g -c2AlB a _{ c } { { x } } { e } { f } g -c2I{ a { b } { c } { _ } { e } { f } g -c2I} a { b } { c } { _ } { e } { f } g -c2IB a { b } { c } { _ } { e } { f } g -c2i{ a { b } { c } {_} { e } { f } g -c2i} a { b } { c } {_} { e } { f } g -c2iB a { b } { c } {_} { e } { f } g -c2a{ a { b } { c } _ { e } { f } g -c2a} a { b } { c } _ { e } { f } g -c2aB a { b } { c } _ { e } { f } g -c2A{ a { b } { c } _{ e } { f } g -c2A} a { b } { c } _{ e } { f } g -c2AB a { b } { c } _{ e } { f } g -c2In{ a { b } { c } { { x } } { e } { _ } g -c2In} a { b } { c } { { x } } { e } { _ } g -c2InB a { b } { c } { { x } } { e } { _ } g -c2in{ a { b } { c } { { x } } { e } {_} g -c2in} a { b } { c } { { x } } { e } {_} g -c2inB a { b } { c } { { x } } { e } {_} g -c2an{ a { b } { c } { { x } } { e } _ g -c2an} a { b } { c } { { x } } { e } _ g -c2anB a { b } { c } { { x } } { e } _ g -c2An{ a { b } { c } { { x } } { e } _g -c2An} a { b } { c } { { x } } { e } _g -c2AnB a { b } { c } { { x } } { e } _g -dIl{ a { b } { } { { x } } { e } { f } g -dIl} a { b } { } { { x } } { e } { f } g -dIlB a { b } { } { { x } } { e } { f } g -dil{ a { b } {} { { x } } { e } { f } g -dil} a { b } {} { { x } } { e } { f } g -dilB a { b } {} { { x } } { e } { f } g -dal{ a { b } { { x } } { e } { f } g -dal} a { b } { { x } } { e } { f } g -dalB a { b } { { x } } { e } { f } g -dAl{ a { b } { { x } } { e } { f } g -dAl} a { b } { { x } } { e } { f } g -dAlB a { b } { { x } } { e } { f } g -dI{ a { b } { c } { { } } { e } { f } g -dI} a { b } { c } { { } } { e } { f } g -dIB a { b } { c } { { } } { e } { f } g -di{ a { b } { c } { {} } { e } { f } g -di} a { b } { c } { {} } { e } { f } g -diB a { b } { c } { {} } { e } { f } g -da{ a { b } { c } { } { e } { f } g -da} a { b } { c } { } { e } { f } g -daB a { b } { c } { } { e } { f } g -dA{ a { b } { c } { } { e } { f } g -dA} a { b } { c } { } { e } { f } g -dAB a { b } { c } { } { e } { f } g -dIn{ a { b } { c } { { x } } { } { f } g -dIn} a { b } { c } { { x } } { } { f } g -dInB a { b } { c } { { x } } { } { f } g -din{ a { b } { c } { { x } } {} { f } g -din} a { b } { c } { { x } } {} { f } g -dinB a { b } { c } { { x } } {} { f } g -dan{ a { b } { c } { { x } } { f } g -dan} a { b } { c } { { x } } { f } g -danB a { b } { c } { { x } } { f } g -dAn{ a { b } { c } { { x } } { f } g -dAn} a { b } { c } { { x } } { f } g -dAnB a { b } { c } { { x } } { f } g -d1Il{ a { b } { } { { x } } { e } { f } g -d1Il} a { b } { } { { x } } { e } { f } g -d1IlB a { b } { } { { x } } { e } { f } g -d1il{ a { b } {} { { x } } { e } { f } g -d1il} a { b } {} { { x } } { e } { f } g -d1ilB a { b } {} { { x } } { e } { f } g -d1al{ a { b } { { x } } { e } { f } g -d1al} a { b } { { x } } { e } { f } g -d1alB a { b } { { x } } { e } { f } g -d1Al{ a { b } { { x } } { e } { f } g -d1Al} a { b } { { x } } { e } { f } g -d1AlB a { b } { { x } } { e } { f } g -d1I{ a { b } { c } { { } } { e } { f } g -d1I} a { b } { c } { { } } { e } { f } g -d1IB a { b } { c } { { } } { e } { f } g -d1i{ a { b } { c } { {} } { e } { f } g -d1i} a { b } { c } { {} } { e } { f } g -d1iB a { b } { c } { {} } { e } { f } g -d1a{ a { b } { c } { } { e } { f } g -d1a} a { b } { c } { } { e } { f } g -d1aB a { b } { c } { } { e } { f } g -d1A{ a { b } { c } { } { e } { f } g -d1A} a { b } { c } { } { e } { f } g -d1AB a { b } { c } { } { e } { f } g -d1In{ a { b } { c } { { x } } { } { f } g -d1In} a { b } { c } { { x } } { } { f } g -d1InB a { b } { c } { { x } } { } { f } g -d1in{ a { b } { c } { { x } } {} { f } g -d1in} a { b } { c } { { x } } {} { f } g -d1inB a { b } { c } { { x } } {} { f } g -d1an{ a { b } { c } { { x } } { f } g -d1an} a { b } { c } { { x } } { f } g -d1anB a { b } { c } { { x } } { f } g -d1An{ a { b } { c } { { x } } { f } g -d1An} a { b } { c } { { x } } { f } g -d1AnB a { b } { c } { { x } } { f } g -d2Il{ a { } { c } { { x } } { e } { f } g -d2Il} a { } { c } { { x } } { e } { f } g -d2IlB a { } { c } { { x } } { e } { f } g -d2il{ a {} { c } { { x } } { e } { f } g -d2il} a {} { c } { { x } } { e } { f } g -d2ilB a {} { c } { { x } } { e } { f } g -d2al{ a { c } { { x } } { e } { f } g -d2al} a { c } { { x } } { e } { f } g -d2alB a { c } { { x } } { e } { f } g -d2Al{ a { c } { { x } } { e } { f } g -d2Al} a { c } { { x } } { e } { f } g -d2AlB a { c } { { x } } { e } { f } g -d2I{ a { b } { c } { } { e } { f } g -d2I} a { b } { c } { } { e } { f } g -d2IB a { b } { c } { } { e } { f } g -d2i{ a { b } { c } {} { e } { f } g -d2i} a { b } { c } {} { e } { f } g -d2iB a { b } { c } {} { e } { f } g -d2a{ a { b } { c } { e } { f } g -d2a} a { b } { c } { e } { f } g -d2aB a { b } { c } { e } { f } g -d2A{ a { b } { c } { e } { f } g -d2A} a { b } { c } { e } { f } g -d2AB a { b } { c } { e } { f } g -d2In{ a { b } { c } { { x } } { e } { } g -d2In} a { b } { c } { { x } } { e } { } g -d2InB a { b } { c } { { x } } { e } { } g -d2in{ a { b } { c } { { x } } { e } {} g -d2in} a { b } { c } { { x } } { e } {} g -d2inB a { b } { c } { { x } } { e } {} g -d2an{ a { b } { c } { { x } } { e } g -d2an} a { b } { c } { { x } } { e } g -d2anB a { b } { c } { { x } } { e } g -d2An{ a { b } { c } { { x } } { e } g -d2An} a { b } { c } { { x } } { e } g -d2AnB a { b } { c } { { x } } { e } g -yIl{ a { b } { c } { { x } } { e } { f } g 'c' -yIl} a { b } { c } { { x } } { e } { f } g 'c' -yIlB a { b } { c } { { x } } { e } { f } g 'c' -yil{ a { b } { c } { { x } } { e } { f } g ' c ' -yil} a { b } { c } { { x } } { e } { f } g ' c ' -yilB a { b } { c } { { x } } { e } { f } g ' c ' -yal{ a { b } { c } { { x } } { e } { f } g '{ c }' -yal} a { b } { c } { { x } } { e } { f } g '{ c }' -yalB a { b } { c } { { x } } { e } { f } g '{ c }' -yAl{ a { b } { c } { { x } } { e } { f } g '{ c } ' -yAl} a { b } { c } { { x } } { e } { f } g '{ c } ' -yAlB a { b } { c } { { x } } { e } { f } g '{ c } ' -yI{ a { b } { c } { { x } } { e } { f } g 'x' -yI} a { b } { c } { { x } } { e } { f } g 'x' -yIB a { b } { c } { { x } } { e } { f } g 'x' -yi{ a { b } { c } { { x } } { e } { f } g ' x ' -yi} a { b } { c } { { x } } { e } { f } g ' x ' -yiB a { b } { c } { { x } } { e } { f } g ' x ' -ya{ a { b } { c } { { x } } { e } { f } g '{ x }' -ya} a { b } { c } { { x } } { e } { f } g '{ x }' -yaB a { b } { c } { { x } } { e } { f } g '{ x }' -yA{ a { b } { c } { { x } } { e } { f } g '{ x } ' -yA} a { b } { c } { { x } } { e } { f } g '{ x } ' -yAB a { b } { c } { { x } } { e } { f } g '{ x } ' -yIn{ a { b } { c } { { x } } { e } { f } g 'e' -yIn} a { b } { c } { { x } } { e } { f } g 'e' -yInB a { b } { c } { { x } } { e } { f } g 'e' -yin{ a { b } { c } { { x } } { e } { f } g ' e ' -yin} a { b } { c } { { x } } { e } { f } g ' e ' -yinB a { b } { c } { { x } } { e } { f } g ' e ' -yan{ a { b } { c } { { x } } { e } { f } g '{ e }' -yan} a { b } { c } { { x } } { e } { f } g '{ e }' -yanB a { b } { c } { { x } } { e } { f } g '{ e }' -yAn{ a { b } { c } { { x } } { e } { f } g '{ e } ' -yAn} a { b } { c } { { x } } { e } { f } g '{ e } ' -yAnB a { b } { c } { { x } } { e } { f } g '{ e } ' -y1Il{ a { b } { c } { { x } } { e } { f } g 'c' -y1Il} a { b } { c } { { x } } { e } { f } g 'c' -y1IlB a { b } { c } { { x } } { e } { f } g 'c' -y1il{ a { b } { c } { { x } } { e } { f } g ' c ' -y1il} a { b } { c } { { x } } { e } { f } g ' c ' -y1ilB a { b } { c } { { x } } { e } { f } g ' c ' -y1al{ a { b } { c } { { x } } { e } { f } g '{ c }' -y1al} a { b } { c } { { x } } { e } { f } g '{ c }' -y1alB a { b } { c } { { x } } { e } { f } g '{ c }' -y1Al{ a { b } { c } { { x } } { e } { f } g '{ c } ' -y1Al} a { b } { c } { { x } } { e } { f } g '{ c } ' -y1AlB a { b } { c } { { x } } { e } { f } g '{ c } ' -y1I{ a { b } { c } { { x } } { e } { f } g 'x' -y1I} a { b } { c } { { x } } { e } { f } g 'x' -y1IB a { b } { c } { { x } } { e } { f } g 'x' -y1i{ a { b } { c } { { x } } { e } { f } g ' x ' -y1i} a { b } { c } { { x } } { e } { f } g ' x ' -y1iB a { b } { c } { { x } } { e } { f } g ' x ' -y1a{ a { b } { c } { { x } } { e } { f } g '{ x }' -y1a} a { b } { c } { { x } } { e } { f } g '{ x }' -y1aB a { b } { c } { { x } } { e } { f } g '{ x }' -y1A{ a { b } { c } { { x } } { e } { f } g '{ x } ' -y1A} a { b } { c } { { x } } { e } { f } g '{ x } ' -y1AB a { b } { c } { { x } } { e } { f } g '{ x } ' -y1In{ a { b } { c } { { x } } { e } { f } g 'e' -y1In} a { b } { c } { { x } } { e } { f } g 'e' -y1InB a { b } { c } { { x } } { e } { f } g 'e' -y1in{ a { b } { c } { { x } } { e } { f } g ' e ' -y1in} a { b } { c } { { x } } { e } { f } g ' e ' -y1inB a { b } { c } { { x } } { e } { f } g ' e ' -y1an{ a { b } { c } { { x } } { e } { f } g '{ e }' -y1an} a { b } { c } { { x } } { e } { f } g '{ e }' -y1anB a { b } { c } { { x } } { e } { f } g '{ e }' -y1An{ a { b } { c } { { x } } { e } { f } g '{ e } ' -y1An} a { b } { c } { { x } } { e } { f } g '{ e } ' -y1AnB a { b } { c } { { x } } { e } { f } g '{ e } ' -y2Il{ a { b } { c } { { x } } { e } { f } g 'b' -y2Il} a { b } { c } { { x } } { e } { f } g 'b' -y2IlB a { b } { c } { { x } } { e } { f } g 'b' -y2il{ a { b } { c } { { x } } { e } { f } g ' b ' -y2il} a { b } { c } { { x } } { e } { f } g ' b ' -y2ilB a { b } { c } { { x } } { e } { f } g ' b ' -y2al{ a { b } { c } { { x } } { e } { f } g '{ b }' -y2al} a { b } { c } { { x } } { e } { f } g '{ b }' -y2alB a { b } { c } { { x } } { e } { f } g '{ b }' -y2Al{ a { b } { c } { { x } } { e } { f } g '{ b } ' -y2Al} a { b } { c } { { x } } { e } { f } g '{ b } ' -y2AlB a { b } { c } { { x } } { e } { f } g '{ b } ' -y2I{ a { b } { c } { { x } } { e } { f } g '{ x }' -y2I} a { b } { c } { { x } } { e } { f } g '{ x }' -y2IB a { b } { c } { { x } } { e } { f } g '{ x }' -y2i{ a { b } { c } { { x } } { e } { f } g ' { x } ' -y2i} a { b } { c } { { x } } { e } { f } g ' { x } ' -y2iB a { b } { c } { { x } } { e } { f } g ' { x } ' -y2a{ a { b } { c } { { x } } { e } { f } g '{ { x } }' -y2a} a { b } { c } { { x } } { e } { f } g '{ { x } }' -y2aB a { b } { c } { { x } } { e } { f } g '{ { x } }' -y2A{ a { b } { c } { { x } } { e } { f } g '{ { x } } ' -y2A} a { b } { c } { { x } } { e } { f } g '{ { x } } ' -y2AB a { b } { c } { { x } } { e } { f } g '{ { x } } ' -y2In{ a { b } { c } { { x } } { e } { f } g 'f' -y2In} a { b } { c } { { x } } { e } { f } g 'f' -y2InB a { b } { c } { { x } } { e } { f } g 'f' -y2in{ a { b } { c } { { x } } { e } { f } g ' f ' -y2in} a { b } { c } { { x } } { e } { f } g ' f ' -y2inB a { b } { c } { { x } } { e } { f } g ' f ' -y2an{ a { b } { c } { { x } } { e } { f } g '{ f }' -y2an} a { b } { c } { { x } } { e } { f } g '{ f }' -y2anB a { b } { c } { { x } } { e } { f } g '{ f }' -y2An{ a { b } { c } { { x } } { e } { f } g '{ f } ' -y2An} a { b } { c } { { x } } { e } { f } g '{ f } ' -y2AnB a { b } { c } { { x } } { e } { f } g '{ f } ' -vIl{ a { b } { _ } { { x } } { e } { f } g -vIl} a { b } { _ } { { x } } { e } { f } g -vIlB a { b } { _ } { { x } } { e } { f } g -vil{ a { b } {___} { { x } } { e } { f } g -vil} a { b } {___} { { x } } { e } { f } g -vilB a { b } {___} { { x } } { e } { f } g -val{ a { b } _____ { { x } } { e } { f } g -val} a { b } _____ { { x } } { e } { f } g -valB a { b } _____ { { x } } { e } { f } g -vAl{ a { b } ______{ { x } } { e } { f } g -vAl} a { b } ______{ { x } } { e } { f } g -vAlB a { b } ______{ { x } } { e } { f } g -vI{ a { b } { c } { { _ } } { e } { f } g -vI} a { b } { c } { { _ } } { e } { f } g -vIB a { b } { c } { { _ } } { e } { f } g -vi{ a { b } { c } { {___} } { e } { f } g -vi} a { b } { c } { {___} } { e } { f } g -viB a { b } { c } { {___} } { e } { f } g -va{ a { b } { c } { _____ } { e } { f } g -va} a { b } { c } { _____ } { e } { f } g -vaB a { b } { c } { _____ } { e } { f } g -vA{ a { b } { c } { ______} { e } { f } g -vA} a { b } { c } { ______} { e } { f } g -vAB a { b } { c } { ______} { e } { f } g -vIn{ a { b } { c } { { x } } { _ } { f } g -vIn} a { b } { c } { { x } } { _ } { f } g -vInB a { b } { c } { { x } } { _ } { f } g -vin{ a { b } { c } { { x } } {___} { f } g -vin} a { b } { c } { { x } } {___} { f } g -vinB a { b } { c } { { x } } {___} { f } g -van{ a { b } { c } { { x } } _____ { f } g -van} a { b } { c } { { x } } _____ { f } g -vanB a { b } { c } { { x } } _____ { f } g -vAn{ a { b } { c } { { x } } ______{ f } g -vAn} a { b } { c } { { x } } ______{ f } g -vAnB a { b } { c } { { x } } ______{ f } g -v1Il{ a { b } { _ } { { x } } { e } { f } g -v1Il} a { b } { _ } { { x } } { e } { f } g -v1IlB a { b } { _ } { { x } } { e } { f } g -v1il{ a { b } {___} { { x } } { e } { f } g -v1il} a { b } {___} { { x } } { e } { f } g -v1ilB a { b } {___} { { x } } { e } { f } g -v1al{ a { b } _____ { { x } } { e } { f } g -v1al} a { b } _____ { { x } } { e } { f } g -v1alB a { b } _____ { { x } } { e } { f } g -v1Al{ a { b } ______{ { x } } { e } { f } g -v1Al} a { b } ______{ { x } } { e } { f } g -v1AlB a { b } ______{ { x } } { e } { f } g -v1I{ a { b } { c } { { _ } } { e } { f } g -v1I} a { b } { c } { { _ } } { e } { f } g -v1IB a { b } { c } { { _ } } { e } { f } g -v1i{ a { b } { c } { {___} } { e } { f } g -v1i} a { b } { c } { {___} } { e } { f } g -v1iB a { b } { c } { {___} } { e } { f } g -v1a{ a { b } { c } { _____ } { e } { f } g -v1a} a { b } { c } { _____ } { e } { f } g -v1aB a { b } { c } { _____ } { e } { f } g -v1A{ a { b } { c } { ______} { e } { f } g -v1A} a { b } { c } { ______} { e } { f } g -v1AB a { b } { c } { ______} { e } { f } g -v1In{ a { b } { c } { { x } } { _ } { f } g -v1In} a { b } { c } { { x } } { _ } { f } g -v1InB a { b } { c } { { x } } { _ } { f } g -v1in{ a { b } { c } { { x } } {___} { f } g -v1in} a { b } { c } { { x } } {___} { f } g -v1inB a { b } { c } { { x } } {___} { f } g -v1an{ a { b } { c } { { x } } _____ { f } g -v1an} a { b } { c } { { x } } _____ { f } g -v1anB a { b } { c } { { x } } _____ { f } g -v1An{ a { b } { c } { { x } } ______{ f } g -v1An} a { b } { c } { { x } } ______{ f } g -v1AnB a { b } { c } { { x } } ______{ f } g -v2Il{ a { _ } { c } { { x } } { e } { f } g -v2Il} a { _ } { c } { { x } } { e } { f } g -v2IlB a { _ } { c } { { x } } { e } { f } g -v2il{ a {___} { c } { { x } } { e } { f } g -v2il} a {___} { c } { { x } } { e } { f } g -v2ilB a {___} { c } { { x } } { e } { f } g -v2al{ a _____ { c } { { x } } { e } { f } g -v2al} a _____ { c } { { x } } { e } { f } g -v2alB a _____ { c } { { x } } { e } { f } g -v2Al{ a ______{ c } { { x } } { e } { f } g -v2Al} a ______{ c } { { x } } { e } { f } g -v2AlB a ______{ c } { { x } } { e } { f } g -v2I{ a { b } { c } { _____ } { e } { f } g -v2I} a { b } { c } { _____ } { e } { f } g -v2IB a { b } { c } { _____ } { e } { f } g -v2i{ a { b } { c } {_______} { e } { f } g -v2i} a { b } { c } {_______} { e } { f } g -v2iB a { b } { c } {_______} { e } { f } g -v2a{ a { b } { c } _________ { e } { f } g -v2a} a { b } { c } _________ { e } { f } g -v2aB a { b } { c } _________ { e } { f } g -v2A{ a { b } { c } __________{ e } { f } g -v2A} a { b } { c } __________{ e } { f } g -v2AB a { b } { c } __________{ e } { f } g -v2In{ a { b } { c } { { x } } { e } { _ } g -v2In} a { b } { c } { { x } } { e } { _ } g -v2InB a { b } { c } { { x } } { e } { _ } g -v2in{ a { b } { c } { { x } } { e } {___} g -v2in} a { b } { c } { { x } } { e } {___} g -v2inB a { b } { c } { { x } } { e } {___} g -v2an{ a { b } { c } { { x } } { e } _____ g -v2an} a { b } { c } { { x } } { e } _____ g -v2anB a { b } { c } { { x } } { e } _____ g -v2An{ a { b } { c } { { x } } { e } ______g -v2An} a { b } { c } { { x } } { e } ______g -v2AnB a { b } { c } { { x } } { e } ______g -a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g -cIl[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -cIl] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -cil[ a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -cil] a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -cal[ a [ b ] _ [ [ x ] ] [ e ] [ f ] g -cal] a [ b ] _ [ [ x ] ] [ e ] [ f ] g -cAl[ a [ b ] _[ [ x ] ] [ e ] [ f ] g -cAl] a [ b ] _[ [ x ] ] [ e ] [ f ] g -cI[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -cI] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -ci[ a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -ci] a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -ca[ a [ b ] [ c ] [ _ ] [ e ] [ f ] g -ca] a [ b ] [ c ] [ _ ] [ e ] [ f ] g -cA[ a [ b ] [ c ] [ _] [ e ] [ f ] g -cA] a [ b ] [ c ] [ _] [ e ] [ f ] g -cIn[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -cIn] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -cin[ a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -cin] a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -can[ a [ b ] [ c ] [ [ x ] ] _ [ f ] g -can] a [ b ] [ c ] [ [ x ] ] _ [ f ] g -cAn[ a [ b ] [ c ] [ [ x ] ] _[ f ] g -cAn] a [ b ] [ c ] [ [ x ] ] _[ f ] g -c1Il[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -c1Il] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -c1il[ a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -c1il] a [ b ] [_] [ [ x ] ] [ e ] [ f ] g -c1al[ a [ b ] _ [ [ x ] ] [ e ] [ f ] g -c1al] a [ b ] _ [ [ x ] ] [ e ] [ f ] g -c1Al[ a [ b ] _[ [ x ] ] [ e ] [ f ] g -c1Al] a [ b ] _[ [ x ] ] [ e ] [ f ] g -c1I[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -c1I] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -c1i[ a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -c1i] a [ b ] [ c ] [ [_] ] [ e ] [ f ] g -c1a[ a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c1a] a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c1A[ a [ b ] [ c ] [ _] [ e ] [ f ] g -c1A] a [ b ] [ c ] [ _] [ e ] [ f ] g -c1In[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -c1In] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -c1in[ a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -c1in] a [ b ] [ c ] [ [ x ] ] [_] [ f ] g -c1an[ a [ b ] [ c ] [ [ x ] ] _ [ f ] g -c1an] a [ b ] [ c ] [ [ x ] ] _ [ f ] g -c1An[ a [ b ] [ c ] [ [ x ] ] _[ f ] g -c1An] a [ b ] [ c ] [ [ x ] ] _[ f ] g -c2Il[ a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -c2Il] a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -c2il[ a [_] [ c ] [ [ x ] ] [ e ] [ f ] g -c2il] a [_] [ c ] [ [ x ] ] [ e ] [ f ] g -c2al[ a _ [ c ] [ [ x ] ] [ e ] [ f ] g -c2al] a _ [ c ] [ [ x ] ] [ e ] [ f ] g -c2Al[ a _[ c ] [ [ x ] ] [ e ] [ f ] g -c2Al] a _[ c ] [ [ x ] ] [ e ] [ f ] g -c2I[ a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c2I] a [ b ] [ c ] [ _ ] [ e ] [ f ] g -c2i[ a [ b ] [ c ] [_] [ e ] [ f ] g -c2i] a [ b ] [ c ] [_] [ e ] [ f ] g -c2a[ a [ b ] [ c ] _ [ e ] [ f ] g -c2a] a [ b ] [ c ] _ [ e ] [ f ] g -c2A[ a [ b ] [ c ] _[ e ] [ f ] g -c2A] a [ b ] [ c ] _[ e ] [ f ] g -c2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -c2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -c2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [_] g -c2in] a [ b ] [ c ] [ [ x ] ] [ e ] [_] g -c2an[ a [ b ] [ c ] [ [ x ] ] [ e ] _ g -c2an] a [ b ] [ c ] [ [ x ] ] [ e ] _ g -c2An[ a [ b ] [ c ] [ [ x ] ] [ e ] _g -c2An] a [ b ] [ c ] [ [ x ] ] [ e ] _g -dIl[ a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -dIl] a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -dil[ a [ b ] [] [ [ x ] ] [ e ] [ f ] g -dil] a [ b ] [] [ [ x ] ] [ e ] [ f ] g -dal[ a [ b ] [ [ x ] ] [ e ] [ f ] g -dal] a [ b ] [ [ x ] ] [ e ] [ f ] g -dAl[ a [ b ] [ [ x ] ] [ e ] [ f ] g -dAl] a [ b ] [ [ x ] ] [ e ] [ f ] g -dI[ a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -dI] a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -di[ a [ b ] [ c ] [ [] ] [ e ] [ f ] g -di] a [ b ] [ c ] [ [] ] [ e ] [ f ] g -da[ a [ b ] [ c ] [ ] [ e ] [ f ] g -da] a [ b ] [ c ] [ ] [ e ] [ f ] g -dA[ a [ b ] [ c ] [ ] [ e ] [ f ] g -dA] a [ b ] [ c ] [ ] [ e ] [ f ] g -dIn[ a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -dIn] a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -din[ a [ b ] [ c ] [ [ x ] ] [] [ f ] g -din] a [ b ] [ c ] [ [ x ] ] [] [ f ] g -dan[ a [ b ] [ c ] [ [ x ] ] [ f ] g -dan] a [ b ] [ c ] [ [ x ] ] [ f ] g -dAn[ a [ b ] [ c ] [ [ x ] ] [ f ] g -dAn] a [ b ] [ c ] [ [ x ] ] [ f ] g -d1Il[ a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -d1Il] a [ b ] [ ] [ [ x ] ] [ e ] [ f ] g -d1il[ a [ b ] [] [ [ x ] ] [ e ] [ f ] g -d1il] a [ b ] [] [ [ x ] ] [ e ] [ f ] g -d1al[ a [ b ] [ [ x ] ] [ e ] [ f ] g -d1al] a [ b ] [ [ x ] ] [ e ] [ f ] g -d1Al[ a [ b ] [ [ x ] ] [ e ] [ f ] g -d1Al] a [ b ] [ [ x ] ] [ e ] [ f ] g -d1I[ a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -d1I] a [ b ] [ c ] [ [ ] ] [ e ] [ f ] g -d1i[ a [ b ] [ c ] [ [] ] [ e ] [ f ] g -d1i] a [ b ] [ c ] [ [] ] [ e ] [ f ] g -d1a[ a [ b ] [ c ] [ ] [ e ] [ f ] g -d1a] a [ b ] [ c ] [ ] [ e ] [ f ] g -d1A[ a [ b ] [ c ] [ ] [ e ] [ f ] g -d1A] a [ b ] [ c ] [ ] [ e ] [ f ] g -d1In[ a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -d1In] a [ b ] [ c ] [ [ x ] ] [ ] [ f ] g -d1in[ a [ b ] [ c ] [ [ x ] ] [] [ f ] g -d1in] a [ b ] [ c ] [ [ x ] ] [] [ f ] g -d1an[ a [ b ] [ c ] [ [ x ] ] [ f ] g -d1an] a [ b ] [ c ] [ [ x ] ] [ f ] g -d1An[ a [ b ] [ c ] [ [ x ] ] [ f ] g -d1An] a [ b ] [ c ] [ [ x ] ] [ f ] g -d2Il[ a [ ] [ c ] [ [ x ] ] [ e ] [ f ] g -d2Il] a [ ] [ c ] [ [ x ] ] [ e ] [ f ] g -d2il[ a [] [ c ] [ [ x ] ] [ e ] [ f ] g -d2il] a [] [ c ] [ [ x ] ] [ e ] [ f ] g -d2al[ a [ c ] [ [ x ] ] [ e ] [ f ] g -d2al] a [ c ] [ [ x ] ] [ e ] [ f ] g -d2Al[ a [ c ] [ [ x ] ] [ e ] [ f ] g -d2Al] a [ c ] [ [ x ] ] [ e ] [ f ] g -d2I[ a [ b ] [ c ] [ ] [ e ] [ f ] g -d2I] a [ b ] [ c ] [ ] [ e ] [ f ] g -d2i[ a [ b ] [ c ] [] [ e ] [ f ] g -d2i] a [ b ] [ c ] [] [ e ] [ f ] g -d2a[ a [ b ] [ c ] [ e ] [ f ] g -d2a] a [ b ] [ c ] [ e ] [ f ] g -d2A[ a [ b ] [ c ] [ e ] [ f ] g -d2A] a [ b ] [ c ] [ e ] [ f ] g -d2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ ] g -d2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ ] g -d2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [] g -d2in] a [ b ] [ c ] [ [ x ] ] [ e ] [] g -d2an[ a [ b ] [ c ] [ [ x ] ] [ e ] g -d2an] a [ b ] [ c ] [ [ x ] ] [ e ] g -d2An[ a [ b ] [ c ] [ [ x ] ] [ e ] g -d2An] a [ b ] [ c ] [ [ x ] ] [ e ] g -yIl[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -yIl] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -yil[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -yil] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -yal[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -yal] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -yAl[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -yAl] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -yI[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -yI] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -yi[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -yi] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -ya[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -ya] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -yA[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -yA] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -yIn[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -yIn] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -yin[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -yin] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -yan[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -yan] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -yAn[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -yAn] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -y1Il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -y1Il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'c' -y1il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -y1il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' c ' -y1al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -y1al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ]' -y1Al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -y1Al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ c ] ' -y1I[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -y1I] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'x' -y1i[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -y1i] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' x ' -y1a[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y1a] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y1A[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -y1A] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ] ' -y1In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -y1In] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'e' -y1in[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -y1in] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' e ' -y1an[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -y1an] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ]' -y1An[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -y1An] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ e ] ' -y2Il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'b' -y2Il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'b' -y2il[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' b ' -y2il] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' b ' -y2al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ]' -y2al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ]' -y2Al[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ] ' -y2Al] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ b ] ' -y2I[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y2I] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ x ]' -y2i[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' [ x ] ' -y2i] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' [ x ] ' -y2a[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ]' -y2a] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ]' -y2A[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ] ' -y2A] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ [ x ] ] ' -y2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'f' -y2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g 'f' -y2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' f ' -y2in] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g ' f ' -y2an[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ]' -y2an] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ]' -y2An[ a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ] ' -y2An] a [ b ] [ c ] [ [ x ] ] [ e ] [ f ] g '[ f ] ' -vIl[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -vIl] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -vil[ a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -vil] a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -val[ a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -val] a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -vAl[ a [ b ] ______[ [ x ] ] [ e ] [ f ] g -vAl] a [ b ] ______[ [ x ] ] [ e ] [ f ] g -vI[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -vI] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -vi[ a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -vi] a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -va[ a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -va] a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -vA[ a [ b ] [ c ] [ ______] [ e ] [ f ] g -vA] a [ b ] [ c ] [ ______] [ e ] [ f ] g -vIn[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -vIn] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -vin[ a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -vin] a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -van[ a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -van] a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -vAn[ a [ b ] [ c ] [ [ x ] ] ______[ f ] g -vAn] a [ b ] [ c ] [ [ x ] ] ______[ f ] g -v1Il[ a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -v1Il] a [ b ] [ _ ] [ [ x ] ] [ e ] [ f ] g -v1il[ a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -v1il] a [ b ] [___] [ [ x ] ] [ e ] [ f ] g -v1al[ a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -v1al] a [ b ] _____ [ [ x ] ] [ e ] [ f ] g -v1Al[ a [ b ] ______[ [ x ] ] [ e ] [ f ] g -v1Al] a [ b ] ______[ [ x ] ] [ e ] [ f ] g -v1I[ a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -v1I] a [ b ] [ c ] [ [ _ ] ] [ e ] [ f ] g -v1i[ a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -v1i] a [ b ] [ c ] [ [___] ] [ e ] [ f ] g -v1a[ a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v1a] a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v1A[ a [ b ] [ c ] [ ______] [ e ] [ f ] g -v1A] a [ b ] [ c ] [ ______] [ e ] [ f ] g -v1In[ a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -v1In] a [ b ] [ c ] [ [ x ] ] [ _ ] [ f ] g -v1in[ a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -v1in] a [ b ] [ c ] [ [ x ] ] [___] [ f ] g -v1an[ a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -v1an] a [ b ] [ c ] [ [ x ] ] _____ [ f ] g -v1An[ a [ b ] [ c ] [ [ x ] ] ______[ f ] g -v1An] a [ b ] [ c ] [ [ x ] ] ______[ f ] g -v2Il[ a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -v2Il] a [ _ ] [ c ] [ [ x ] ] [ e ] [ f ] g -v2il[ a [___] [ c ] [ [ x ] ] [ e ] [ f ] g -v2il] a [___] [ c ] [ [ x ] ] [ e ] [ f ] g -v2al[ a _____ [ c ] [ [ x ] ] [ e ] [ f ] g -v2al] a _____ [ c ] [ [ x ] ] [ e ] [ f ] g -v2Al[ a ______[ c ] [ [ x ] ] [ e ] [ f ] g -v2Al] a ______[ c ] [ [ x ] ] [ e ] [ f ] g -v2I[ a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v2I] a [ b ] [ c ] [ _____ ] [ e ] [ f ] g -v2i[ a [ b ] [ c ] [_______] [ e ] [ f ] g -v2i] a [ b ] [ c ] [_______] [ e ] [ f ] g -v2a[ a [ b ] [ c ] _________ [ e ] [ f ] g -v2a] a [ b ] [ c ] _________ [ e ] [ f ] g -v2A[ a [ b ] [ c ] __________[ e ] [ f ] g -v2A] a [ b ] [ c ] __________[ e ] [ f ] g -v2In[ a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -v2In] a [ b ] [ c ] [ [ x ] ] [ e ] [ _ ] g -v2in[ a [ b ] [ c ] [ [ x ] ] [ e ] [___] g -v2in] a [ b ] [ c ] [ [ x ] ] [ e ] [___] g -v2an[ a [ b ] [ c ] [ [ x ] ] [ e ] _____ g -v2an] a [ b ] [ c ] [ [ x ] ] [ e ] _____ g -v2An[ a [ b ] [ c ] [ [ x ] ] [ e ] ______g -v2An] a [ b ] [ c ] [ [ x ] ] [ e ] ______g -a < b > < c > < < x > > < e > < f > g -cIl< a < b > < _ > < < x > > < e > < f > g -cIl> a < b > < _ > < < x > > < e > < f > g -cil< a < b > <_> < < x > > < e > < f > g -cil> a < b > <_> < < x > > < e > < f > g -cal< a < b > _ < < x > > < e > < f > g -cal> a < b > _ < < x > > < e > < f > g -cAl< a < b > _< < x > > < e > < f > g -cAl> a < b > _< < x > > < e > < f > g -cI< a < b > < c > < < _ > > < e > < f > g -cI> a < b > < c > < < _ > > < e > < f > g -ci< a < b > < c > < <_> > < e > < f > g -ci> a < b > < c > < <_> > < e > < f > g -ca< a < b > < c > < _ > < e > < f > g -ca> a < b > < c > < _ > < e > < f > g -cA< a < b > < c > < _> < e > < f > g -cA> a < b > < c > < _> < e > < f > g -cIn< a < b > < c > < < x > > < _ > < f > g -cIn> a < b > < c > < < x > > < _ > < f > g -cin< a < b > < c > < < x > > <_> < f > g -cin> a < b > < c > < < x > > <_> < f > g -can< a < b > < c > < < x > > _ < f > g -can> a < b > < c > < < x > > _ < f > g -cAn< a < b > < c > < < x > > _< f > g -cAn> a < b > < c > < < x > > _< f > g -c1Il< a < b > < _ > < < x > > < e > < f > g -c1Il> a < b > < _ > < < x > > < e > < f > g -c1il< a < b > <_> < < x > > < e > < f > g -c1il> a < b > <_> < < x > > < e > < f > g -c1al< a < b > _ < < x > > < e > < f > g -c1al> a < b > _ < < x > > < e > < f > g -c1Al< a < b > _< < x > > < e > < f > g -c1Al> a < b > _< < x > > < e > < f > g -c1I< a < b > < c > < < _ > > < e > < f > g -c1I> a < b > < c > < < _ > > < e > < f > g -c1i< a < b > < c > < <_> > < e > < f > g -c1i> a < b > < c > < <_> > < e > < f > g -c1a< a < b > < c > < _ > < e > < f > g -c1a> a < b > < c > < _ > < e > < f > g -c1A< a < b > < c > < _> < e > < f > g -c1A> a < b > < c > < _> < e > < f > g -c1In< a < b > < c > < < x > > < _ > < f > g -c1In> a < b > < c > < < x > > < _ > < f > g -c1in< a < b > < c > < < x > > <_> < f > g -c1in> a < b > < c > < < x > > <_> < f > g -c1an< a < b > < c > < < x > > _ < f > g -c1an> a < b > < c > < < x > > _ < f > g -c1An< a < b > < c > < < x > > _< f > g -c1An> a < b > < c > < < x > > _< f > g -c2Il< a < _ > < c > < < x > > < e > < f > g -c2Il> a < _ > < c > < < x > > < e > < f > g -c2il< a <_> < c > < < x > > < e > < f > g -c2il> a <_> < c > < < x > > < e > < f > g -c2al< a _ < c > < < x > > < e > < f > g -c2al> a _ < c > < < x > > < e > < f > g -c2Al< a _< c > < < x > > < e > < f > g -c2Al> a _< c > < < x > > < e > < f > g -c2I< a < b > < c > < _ > < e > < f > g -c2I> a < b > < c > < _ > < e > < f > g -c2i< a < b > < c > <_> < e > < f > g -c2i> a < b > < c > <_> < e > < f > g -c2a< a < b > < c > _ < e > < f > g -c2a> a < b > < c > _ < e > < f > g -c2A< a < b > < c > _< e > < f > g -c2A> a < b > < c > _< e > < f > g -c2In< a < b > < c > < < x > > < e > < _ > g -c2In> a < b > < c > < < x > > < e > < _ > g -c2in< a < b > < c > < < x > > < e > <_> g -c2in> a < b > < c > < < x > > < e > <_> g -c2an< a < b > < c > < < x > > < e > _ g -c2an> a < b > < c > < < x > > < e > _ g -c2An< a < b > < c > < < x > > < e > _g -c2An> a < b > < c > < < x > > < e > _g -dIl< a < b > < > < < x > > < e > < f > g -dIl> a < b > < > < < x > > < e > < f > g -dil< a < b > <> < < x > > < e > < f > g -dil> a < b > <> < < x > > < e > < f > g -dal< a < b > < < x > > < e > < f > g -dal> a < b > < < x > > < e > < f > g -dAl< a < b > < < x > > < e > < f > g -dAl> a < b > < < x > > < e > < f > g -dI< a < b > < c > < < > > < e > < f > g -dI> a < b > < c > < < > > < e > < f > g -di< a < b > < c > < <> > < e > < f > g -di> a < b > < c > < <> > < e > < f > g -da< a < b > < c > < > < e > < f > g -da> a < b > < c > < > < e > < f > g -dA< a < b > < c > < > < e > < f > g -dA> a < b > < c > < > < e > < f > g -dIn< a < b > < c > < < x > > < > < f > g -dIn> a < b > < c > < < x > > < > < f > g -din< a < b > < c > < < x > > <> < f > g -din> a < b > < c > < < x > > <> < f > g -dan< a < b > < c > < < x > > < f > g -dan> a < b > < c > < < x > > < f > g -dAn< a < b > < c > < < x > > < f > g -dAn> a < b > < c > < < x > > < f > g -d1Il< a < b > < > < < x > > < e > < f > g -d1Il> a < b > < > < < x > > < e > < f > g -d1il< a < b > <> < < x > > < e > < f > g -d1il> a < b > <> < < x > > < e > < f > g -d1al< a < b > < < x > > < e > < f > g -d1al> a < b > < < x > > < e > < f > g -d1Al< a < b > < < x > > < e > < f > g -d1Al> a < b > < < x > > < e > < f > g -d1I< a < b > < c > < < > > < e > < f > g -d1I> a < b > < c > < < > > < e > < f > g -d1i< a < b > < c > < <> > < e > < f > g -d1i> a < b > < c > < <> > < e > < f > g -d1a< a < b > < c > < > < e > < f > g -d1a> a < b > < c > < > < e > < f > g -d1A< a < b > < c > < > < e > < f > g -d1A> a < b > < c > < > < e > < f > g -d1In< a < b > < c > < < x > > < > < f > g -d1In> a < b > < c > < < x > > < > < f > g -d1in< a < b > < c > < < x > > <> < f > g -d1in> a < b > < c > < < x > > <> < f > g -d1an< a < b > < c > < < x > > < f > g -d1an> a < b > < c > < < x > > < f > g -d1An< a < b > < c > < < x > > < f > g -d1An> a < b > < c > < < x > > < f > g -d2Il< a < > < c > < < x > > < e > < f > g -d2Il> a < > < c > < < x > > < e > < f > g -d2il< a <> < c > < < x > > < e > < f > g -d2il> a <> < c > < < x > > < e > < f > g -d2al< a < c > < < x > > < e > < f > g -d2al> a < c > < < x > > < e > < f > g -d2Al< a < c > < < x > > < e > < f > g -d2Al> a < c > < < x > > < e > < f > g -d2I< a < b > < c > < > < e > < f > g -d2I> a < b > < c > < > < e > < f > g -d2i< a < b > < c > <> < e > < f > g -d2i> a < b > < c > <> < e > < f > g -d2a< a < b > < c > < e > < f > g -d2a> a < b > < c > < e > < f > g -d2A< a < b > < c > < e > < f > g -d2A> a < b > < c > < e > < f > g -d2In< a < b > < c > < < x > > < e > < > g -d2In> a < b > < c > < < x > > < e > < > g -d2in< a < b > < c > < < x > > < e > <> g -d2in> a < b > < c > < < x > > < e > <> g -d2an< a < b > < c > < < x > > < e > g -d2an> a < b > < c > < < x > > < e > g -d2An< a < b > < c > < < x > > < e > g -d2An> a < b > < c > < < x > > < e > g -yIl< a < b > < c > < < x > > < e > < f > g 'c' -yIl> a < b > < c > < < x > > < e > < f > g 'c' -yil< a < b > < c > < < x > > < e > < f > g ' c ' -yil> a < b > < c > < < x > > < e > < f > g ' c ' -yal< a < b > < c > < < x > > < e > < f > g '< c >' -yal> a < b > < c > < < x > > < e > < f > g '< c >' -yAl< a < b > < c > < < x > > < e > < f > g '< c > ' -yAl> a < b > < c > < < x > > < e > < f > g '< c > ' -yI< a < b > < c > < < x > > < e > < f > g 'x' -yI> a < b > < c > < < x > > < e > < f > g 'x' -yi< a < b > < c > < < x > > < e > < f > g ' x ' -yi> a < b > < c > < < x > > < e > < f > g ' x ' -ya< a < b > < c > < < x > > < e > < f > g '< x >' -ya> a < b > < c > < < x > > < e > < f > g '< x >' -yA< a < b > < c > < < x > > < e > < f > g '< x > ' -yA> a < b > < c > < < x > > < e > < f > g '< x > ' -yIn< a < b > < c > < < x > > < e > < f > g 'e' -yIn> a < b > < c > < < x > > < e > < f > g 'e' -yin< a < b > < c > < < x > > < e > < f > g ' e ' -yin> a < b > < c > < < x > > < e > < f > g ' e ' -yan< a < b > < c > < < x > > < e > < f > g '< e >' -yan> a < b > < c > < < x > > < e > < f > g '< e >' -yAn< a < b > < c > < < x > > < e > < f > g '< e > ' -yAn> a < b > < c > < < x > > < e > < f > g '< e > ' -y1Il< a < b > < c > < < x > > < e > < f > g 'c' -y1Il> a < b > < c > < < x > > < e > < f > g 'c' -y1il< a < b > < c > < < x > > < e > < f > g ' c ' -y1il> a < b > < c > < < x > > < e > < f > g ' c ' -y1al< a < b > < c > < < x > > < e > < f > g '< c >' -y1al> a < b > < c > < < x > > < e > < f > g '< c >' -y1Al< a < b > < c > < < x > > < e > < f > g '< c > ' -y1Al> a < b > < c > < < x > > < e > < f > g '< c > ' -y1I< a < b > < c > < < x > > < e > < f > g 'x' -y1I> a < b > < c > < < x > > < e > < f > g 'x' -y1i< a < b > < c > < < x > > < e > < f > g ' x ' -y1i> a < b > < c > < < x > > < e > < f > g ' x ' -y1a< a < b > < c > < < x > > < e > < f > g '< x >' -y1a> a < b > < c > < < x > > < e > < f > g '< x >' -y1A< a < b > < c > < < x > > < e > < f > g '< x > ' -y1A> a < b > < c > < < x > > < e > < f > g '< x > ' -y1In< a < b > < c > < < x > > < e > < f > g 'e' -y1In> a < b > < c > < < x > > < e > < f > g 'e' -y1in< a < b > < c > < < x > > < e > < f > g ' e ' -y1in> a < b > < c > < < x > > < e > < f > g ' e ' -y1an< a < b > < c > < < x > > < e > < f > g '< e >' -y1an> a < b > < c > < < x > > < e > < f > g '< e >' -y1An< a < b > < c > < < x > > < e > < f > g '< e > ' -y1An> a < b > < c > < < x > > < e > < f > g '< e > ' -y2Il< a < b > < c > < < x > > < e > < f > g 'b' -y2Il> a < b > < c > < < x > > < e > < f > g 'b' -y2il< a < b > < c > < < x > > < e > < f > g ' b ' -y2il> a < b > < c > < < x > > < e > < f > g ' b ' -y2al< a < b > < c > < < x > > < e > < f > g '< b >' -y2al> a < b > < c > < < x > > < e > < f > g '< b >' -y2Al< a < b > < c > < < x > > < e > < f > g '< b > ' -y2Al> a < b > < c > < < x > > < e > < f > g '< b > ' -y2I< a < b > < c > < < x > > < e > < f > g '< x >' -y2I> a < b > < c > < < x > > < e > < f > g '< x >' -y2i< a < b > < c > < < x > > < e > < f > g ' < x > ' -y2i> a < b > < c > < < x > > < e > < f > g ' < x > ' -y2a< a < b > < c > < < x > > < e > < f > g '< < x > >' -y2a> a < b > < c > < < x > > < e > < f > g '< < x > >' -y2A< a < b > < c > < < x > > < e > < f > g '< < x > > ' -y2A> a < b > < c > < < x > > < e > < f > g '< < x > > ' -y2In< a < b > < c > < < x > > < e > < f > g 'f' -y2In> a < b > < c > < < x > > < e > < f > g 'f' -y2in< a < b > < c > < < x > > < e > < f > g ' f ' -y2in> a < b > < c > < < x > > < e > < f > g ' f ' -y2an< a < b > < c > < < x > > < e > < f > g '< f >' -y2an> a < b > < c > < < x > > < e > < f > g '< f >' -y2An< a < b > < c > < < x > > < e > < f > g '< f > ' -y2An> a < b > < c > < < x > > < e > < f > g '< f > ' -vIl< a < b > < _ > < < x > > < e > < f > g -vIl> a < b > < _ > < < x > > < e > < f > g -vil< a < b > <___> < < x > > < e > < f > g -vil> a < b > <___> < < x > > < e > < f > g -val< a < b > _____ < < x > > < e > < f > g -val> a < b > _____ < < x > > < e > < f > g -vAl< a < b > ______< < x > > < e > < f > g -vAl> a < b > ______< < x > > < e > < f > g -vI< a < b > < c > < < _ > > < e > < f > g -vI> a < b > < c > < < _ > > < e > < f > g -vi< a < b > < c > < <___> > < e > < f > g -vi> a < b > < c > < <___> > < e > < f > g -va< a < b > < c > < _____ > < e > < f > g -va> a < b > < c > < _____ > < e > < f > g -vA< a < b > < c > < ______> < e > < f > g -vA> a < b > < c > < ______> < e > < f > g -vIn< a < b > < c > < < x > > < _ > < f > g -vIn> a < b > < c > < < x > > < _ > < f > g -vin< a < b > < c > < < x > > <___> < f > g -vin> a < b > < c > < < x > > <___> < f > g -van< a < b > < c > < < x > > _____ < f > g -van> a < b > < c > < < x > > _____ < f > g -vAn< a < b > < c > < < x > > ______< f > g -vAn> a < b > < c > < < x > > ______< f > g -v1Il< a < b > < _ > < < x > > < e > < f > g -v1Il> a < b > < _ > < < x > > < e > < f > g -v1il< a < b > <___> < < x > > < e > < f > g -v1il> a < b > <___> < < x > > < e > < f > g -v1al< a < b > _____ < < x > > < e > < f > g -v1al> a < b > _____ < < x > > < e > < f > g -v1Al< a < b > ______< < x > > < e > < f > g -v1Al> a < b > ______< < x > > < e > < f > g -v1I< a < b > < c > < < _ > > < e > < f > g -v1I> a < b > < c > < < _ > > < e > < f > g -v1i< a < b > < c > < <___> > < e > < f > g -v1i> a < b > < c > < <___> > < e > < f > g -v1a< a < b > < c > < _____ > < e > < f > g -v1a> a < b > < c > < _____ > < e > < f > g -v1A< a < b > < c > < ______> < e > < f > g -v1A> a < b > < c > < ______> < e > < f > g -v1In< a < b > < c > < < x > > < _ > < f > g -v1In> a < b > < c > < < x > > < _ > < f > g -v1in< a < b > < c > < < x > > <___> < f > g -v1in> a < b > < c > < < x > > <___> < f > g -v1an< a < b > < c > < < x > > _____ < f > g -v1an> a < b > < c > < < x > > _____ < f > g -v1An< a < b > < c > < < x > > ______< f > g -v1An> a < b > < c > < < x > > ______< f > g -v2Il< a < _ > < c > < < x > > < e > < f > g -v2Il> a < _ > < c > < < x > > < e > < f > g -v2il< a <___> < c > < < x > > < e > < f > g -v2il> a <___> < c > < < x > > < e > < f > g -v2al< a _____ < c > < < x > > < e > < f > g -v2al> a _____ < c > < < x > > < e > < f > g -v2Al< a ______< c > < < x > > < e > < f > g -v2Al> a ______< c > < < x > > < e > < f > g -v2I< a < b > < c > < _____ > < e > < f > g -v2I> a < b > < c > < _____ > < e > < f > g -v2i< a < b > < c > <_______> < e > < f > g -v2i> a < b > < c > <_______> < e > < f > g -v2a< a < b > < c > _________ < e > < f > g -v2a> a < b > < c > _________ < e > < f > g -v2A< a < b > < c > __________< e > < f > g -v2A> a < b > < c > __________< e > < f > g -v2In< a < b > < c > < < x > > < e > < _ > g -v2In> a < b > < c > < < x > > < e > < _ > g -v2in< a < b > < c > < < x > > < e > <___> g -v2in> a < b > < c > < < x > > < e > <___> g -v2an< a < b > < c > < < x > > < e > _____ g -v2an> a < b > < c > < < x > > < e > _____ g -v2An< a < b > < c > < < x > > < e > ______g -v2An> a < b > < c > < < x > > < e > ______g -a b c x e f g -cIlt a b _ x e f g -cilt a b _ x e f g -calt a b _ x e f g -cAlt a b _ x e f g -cIt a b c _ e f g -cit a b c _ e f g -cat a b c _ e f g -cAt a b c _ e f g -cInt a b c x _ f g -cint a b c x _ f g -cant a b c x _ f g -cAnt a b c x _ f g -c1Ilt a b _ x e f g -c1ilt a b _ x e f g -c1alt a b _ x e f g -c1Alt a b _ x e f g -c1It a b c _ e f g -c1it a b c _ e f g -c1at a b c _ e f g -c1At a b c _ e f g -c1Int a b c x _ f g -c1int a b c x _ f g -c1ant a b c x _ f g -c1Ant a b c x _ f g -c2Ilt a _ c x e f g -c2ilt a _ c x e f g -c2alt a _ c x e f g -c2Alt a _ c x e f g -c2It a b c _ e f g -c2it a b c _ e f g -c2at a b c _ e f g -c2At a b c _ e f g -c2Int a b c x e _ g -c2int a b c x e _ g -c2ant a b c x e _ g -c2Ant a b c x e _g -dIlt a b x e f g -dilt a b x e f g -dalt a b x e f g -dAlt a b x e f g -dIt a b c e f g -dit a b c e f g -dat a b c e f g -dAt a b c e f g -dInt a b c x f g -dint a b c x f g -dant a b c x f g -dAnt a b c x f g -d1Ilt a b x e f g -d1ilt a b x e f g -d1alt a b x e f g -d1Alt a b x e f g -d1It a b c e f g -d1it a b c e f g -d1at a b c e f g -d1At a b c e f g -d1Int a b c x f g -d1int a b c x f g -d1ant a b c x f g -d1Ant a b c x f g -d2Ilt a c x e f g -d2ilt a c x e f g -d2alt a c x e f g -d2Alt a c x e f g -d2It a b c e f g -d2it a b c e f g -d2at a b c e f g -d2At a b c e f g -d2Int a b c x e g -d2int a b c x e g -d2ant a b c x e g -d2Ant a b c x e g -yIlt a b c x e f g 'c' -yilt a b c x e f g ' c ' -yalt a b c x e f g ' c ' -yAlt a b c x e f g ' c ' -yIt a b c x e f g 'x' -yit a b c x e f g ' x ' -yat a b c x e f g ' x ' -yAt a b c x e f g ' x ' -yInt a b c x e f g 'e' -yint a b c x e f g ' e ' -yant a b c x e f g ' e ' -yAnt a b c x e f g ' e ' -y1Ilt a b c x e f g 'c' -y1ilt a b c x e f g ' c ' -y1alt a b c x e f g ' c ' -y1Alt a b c x e f g ' c ' -y1It a b c x e f g 'x' -y1it a b c x e f g ' x ' -y1at a b c x e f g ' x ' -y1At a b c x e f g ' x ' -y1Int a b c x e f g 'e' -y1int a b c x e f g ' e ' -y1ant a b c x e f g ' e ' -y1Ant a b c x e f g ' e ' -y2Ilt a b c x e f g 'b' -y2ilt a b c x e f g ' b ' -y2alt a b c x e f g ' b ' -y2Alt a b c x e f g ' b ' -y2It a b c x e f g ' x ' -y2it a b c x e f g ' x ' -y2at a b c x e f g ' x ' -y2At a b c x e f g ' x ' -y2Int a b c x e f g 'f' -y2int a b c x e f g ' f ' -y2ant a b c x e f g ' f ' -y2Ant a b c x e f g ' f ' -vIlt a b _ x e f g -vilt a b ___ x e f g -valt a b __________ x e f g -vAlt a b ___________ x e f g -vIt a b c _ e f g -vit a b c ___ e f g -vat a b c __________ e f g -vAt a b c ___________ e f g -vInt a b c x _ f g -vint a b c x ___ f g -vant a b c x __________ f g -vAnt a b c x ___________ f g -v1Ilt a b _ x e f g -v1ilt a b ___ x e f g -v1alt a b __________ x e f g -v1Alt a b ___________ x e f g -v1It a b c _ e f g -v1it a b c ___ e f g -v1at a b c __________ e f g -v1At a b c ___________ e f g -v1Int a b c x _ f g -v1int a b c x ___ f g -v1ant a b c x __________ f g -v1Ant a b c x ___________ f g -v2Ilt a _ c x e f g -v2ilt a ___ c x e f g -v2alt a __________ c x e f g -v2Alt a ___________ c x e f g -v2It a b c __________ e f g -v2it a b c ____________ e f g -v2at a b c ___________________ e f g -v2At a b c ____________________ e f g -v2Int a b c x e _ g -v2int a b c x e ___ g -v2ant a b c x e __________ g -v2Ant a b c x e ___________g - -a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l -cIL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -ciL' a ' b ' c '_' e ' x ' g ' h ' i ' k ' l -caL' a ' b ' c _ e ' x ' g ' h ' i ' k ' l -cAL' a ' b ' c _e ' x ' g ' h ' i ' k ' l -cIl' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -cil' a ' b ' c ' d '_' x ' g ' h ' i ' k ' l -cal' a ' b ' c ' d _ x ' g ' h ' i ' k ' l -cAl' a ' b ' c ' d _x ' g ' h ' i ' k ' l -cI' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -ci' a ' b ' c ' d ' e '_' g ' h ' i ' k ' l -ca' a ' b ' c ' d ' e _ g ' h ' i ' k ' l -cA' a ' b ' c ' d ' e _g ' h ' i ' k ' l -cIn' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -cin' a ' b ' c ' d ' e ' x '_' h ' i ' k ' l -can' a ' b ' c ' d ' e ' x _ h ' i ' k ' l -cAn' a ' b ' c ' d ' e ' x _h ' i ' k ' l -cIN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -ciN' a ' b ' c ' d ' e ' x ' g '_' i ' k ' l -caN' a ' b ' c ' d ' e ' x ' g _ i ' k ' l -cAN' a ' b ' c ' d ' e ' x ' g _i ' k ' l -c1IL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -c1iL' a ' b ' c '_' e ' x ' g ' h ' i ' k ' l -c1aL' a ' b ' c _ e ' x ' g ' h ' i ' k ' l -c1AL' a ' b ' c _e ' x ' g ' h ' i ' k ' l -c1Il' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -c1il' a ' b ' c ' d '_' x ' g ' h ' i ' k ' l -c1al' a ' b ' c ' d _ x ' g ' h ' i ' k ' l -c1Al' a ' b ' c ' d _x ' g ' h ' i ' k ' l -c1I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -c1i' a ' b ' c ' d ' e '_' g ' h ' i ' k ' l -c1a' a ' b ' c ' d ' e _ g ' h ' i ' k ' l -c1A' a ' b ' c ' d ' e _g ' h ' i ' k ' l -c1In' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -c1in' a ' b ' c ' d ' e ' x '_' h ' i ' k ' l -c1an' a ' b ' c ' d ' e ' x _ h ' i ' k ' l -c1An' a ' b ' c ' d ' e ' x _h ' i ' k ' l -c1IN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -c1iN' a ' b ' c ' d ' e ' x ' g '_' i ' k ' l -c1aN' a ' b ' c ' d ' e ' x ' g _ i ' k ' l -c1AN' a ' b ' c ' d ' e ' x ' g _i ' k ' l -c2IL' a ' _ ' c ' d ' e ' x ' g ' h ' i ' k ' l -c2iL' a '_' c ' d ' e ' x ' g ' h ' i ' k ' l -c2aL' a _ c ' d ' e ' x ' g ' h ' i ' k ' l -c2AL' a _c ' d ' e ' x ' g ' h ' i ' k ' l -c2Il' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -c2il' a ' b ' c '_' e ' x ' g ' h ' i ' k ' l -c2al' a ' b ' c _ e ' x ' g ' h ' i ' k ' l -c2Al' a ' b ' c _e ' x ' g ' h ' i ' k ' l -c2I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -c2i' a ' b ' c ' d ' e '_' g ' h ' i ' k ' l -c2a' a ' b ' c ' d ' e _ g ' h ' i ' k ' l -c2A' a ' b ' c ' d ' e _g ' h ' i ' k ' l -c2In' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -c2in' a ' b ' c ' d ' e ' x ' g '_' i ' k ' l -c2an' a ' b ' c ' d ' e ' x ' g _ i ' k ' l -c2An' a ' b ' c ' d ' e ' x ' g _i ' k ' l -c2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' _ ' l -c2iN' a ' b ' c ' d ' e ' x ' g ' h ' i '_' l -c2aN' a ' b ' c ' d ' e ' x ' g ' h ' i _ l -c2AN' a ' b ' c ' d ' e ' x ' g ' h ' i _l -dIL' a ' b ' c ' ' e ' x ' g ' h ' i ' k ' l -diL' a ' b ' c '' e ' x ' g ' h ' i ' k ' l -daL' a ' b ' c e ' x ' g ' h ' i ' k ' l -dAL' a ' b ' c e ' x ' g ' h ' i ' k ' l -dIl' a ' b ' c ' d ' ' x ' g ' h ' i ' k ' l -dil' a ' b ' c ' d '' x ' g ' h ' i ' k ' l -dal' a ' b ' c ' d x ' g ' h ' i ' k ' l -dAl' a ' b ' c ' d x ' g ' h ' i ' k ' l -dI' a ' b ' c ' d ' e ' ' g ' h ' i ' k ' l -di' a ' b ' c ' d ' e '' g ' h ' i ' k ' l -da' a ' b ' c ' d ' e g ' h ' i ' k ' l -dA' a ' b ' c ' d ' e g ' h ' i ' k ' l -dIn' a ' b ' c ' d ' e ' x ' ' h ' i ' k ' l -din' a ' b ' c ' d ' e ' x '' h ' i ' k ' l -dan' a ' b ' c ' d ' e ' x h ' i ' k ' l -dAn' a ' b ' c ' d ' e ' x h ' i ' k ' l -dIN' a ' b ' c ' d ' e ' x ' g ' ' i ' k ' l -diN' a ' b ' c ' d ' e ' x ' g '' i ' k ' l -daN' a ' b ' c ' d ' e ' x ' g i ' k ' l -dAN' a ' b ' c ' d ' e ' x ' g i ' k ' l -d1IL' a ' b ' c ' ' e ' x ' g ' h ' i ' k ' l -d1iL' a ' b ' c '' e ' x ' g ' h ' i ' k ' l -d1aL' a ' b ' c e ' x ' g ' h ' i ' k ' l -d1AL' a ' b ' c e ' x ' g ' h ' i ' k ' l -d1Il' a ' b ' c ' d ' ' x ' g ' h ' i ' k ' l -d1il' a ' b ' c ' d '' x ' g ' h ' i ' k ' l -d1al' a ' b ' c ' d x ' g ' h ' i ' k ' l -d1Al' a ' b ' c ' d x ' g ' h ' i ' k ' l -d1I' a ' b ' c ' d ' e ' ' g ' h ' i ' k ' l -d1i' a ' b ' c ' d ' e '' g ' h ' i ' k ' l -d1a' a ' b ' c ' d ' e g ' h ' i ' k ' l -d1A' a ' b ' c ' d ' e g ' h ' i ' k ' l -d1In' a ' b ' c ' d ' e ' x ' ' h ' i ' k ' l -d1in' a ' b ' c ' d ' e ' x '' h ' i ' k ' l -d1an' a ' b ' c ' d ' e ' x h ' i ' k ' l -d1An' a ' b ' c ' d ' e ' x h ' i ' k ' l -d1IN' a ' b ' c ' d ' e ' x ' g ' ' i ' k ' l -d1iN' a ' b ' c ' d ' e ' x ' g '' i ' k ' l -d1aN' a ' b ' c ' d ' e ' x ' g i ' k ' l -d1AN' a ' b ' c ' d ' e ' x ' g i ' k ' l -d2IL' a ' ' c ' d ' e ' x ' g ' h ' i ' k ' l -d2iL' a '' c ' d ' e ' x ' g ' h ' i ' k ' l -d2aL' a c ' d ' e ' x ' g ' h ' i ' k ' l -d2AL' a c ' d ' e ' x ' g ' h ' i ' k ' l -d2Il' a ' b ' c ' ' e ' x ' g ' h ' i ' k ' l -d2il' a ' b ' c '' e ' x ' g ' h ' i ' k ' l -d2al' a ' b ' c e ' x ' g ' h ' i ' k ' l -d2Al' a ' b ' c e ' x ' g ' h ' i ' k ' l -d2I' a ' b ' c ' d ' e ' ' g ' h ' i ' k ' l -d2i' a ' b ' c ' d ' e '' g ' h ' i ' k ' l -d2a' a ' b ' c ' d ' e g ' h ' i ' k ' l -d2A' a ' b ' c ' d ' e g ' h ' i ' k ' l -d2In' a ' b ' c ' d ' e ' x ' g ' ' i ' k ' l -d2in' a ' b ' c ' d ' e ' x ' g '' i ' k ' l -d2an' a ' b ' c ' d ' e ' x ' g i ' k ' l -d2An' a ' b ' c ' d ' e ' x ' g i ' k ' l -d2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' ' l -d2iN' a ' b ' c ' d ' e ' x ' g ' h ' i '' l -d2aN' a ' b ' c ' d ' e ' x ' g ' h ' i l -d2AN' a ' b ' c ' d ' e ' x ' g ' h ' i l -yIL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'd' -yiL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' d ' -yaL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d '' -yAL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d ' ' -yIl' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'e' -yil' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' e ' -yal' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e '' -yAl' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e ' ' -yI' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'x' -yi' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' x ' -ya' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x '' -yA' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x ' ' -yIn' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'g' -yin' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' g ' -yan' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g '' -yAn' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g ' ' -yIN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'h' -yiN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' h ' -yaN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h '' -yAN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h ' ' -y1IL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'd' -y1iL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' d ' -y1aL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d '' -y1AL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d ' ' -y1Il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'e' -y1il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' e ' -y1al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e '' -y1Al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' e ' ' -y1I' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'x' -y1i' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' x ' -y1a' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x '' -y1A' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x ' ' -y1In' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'g' -y1in' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' g ' -y1an' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g '' -y1An' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' g ' ' -y1IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'h' -y1iN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' h ' -y1aN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h '' -y1AN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h ' ' -y2IL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'b' -y2iL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' b ' -y2aL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' b '' -y2AL' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' b ' ' -y2Il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'd' -y2il' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' d ' -y2al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d '' -y2Al' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' d ' ' -y2I' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'x' -y2i' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' x ' -y2a' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x '' -y2A' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' x ' ' -y2In' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'h' -y2in' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' h ' -y2an' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h '' -y2An' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' h ' ' -y2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l 'k' -y2iN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l ' k ' -y2aN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' k '' -y2AN' a ' b ' c ' d ' e ' x ' g ' h ' i ' k ' l '' k ' ' -vIL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -viL' a ' b ' c '___' e ' x ' g ' h ' i ' k ' l -vaL' a ' b ' c _____ e ' x ' g ' h ' i ' k ' l -vAL' a ' b ' c ______e ' x ' g ' h ' i ' k ' l -vIl' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -vil' a ' b ' c ' d '___' x ' g ' h ' i ' k ' l -val' a ' b ' c ' d _____ x ' g ' h ' i ' k ' l -vAl' a ' b ' c ' d ______x ' g ' h ' i ' k ' l -vI' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -vi' a ' b ' c ' d ' e '___' g ' h ' i ' k ' l -va' a ' b ' c ' d ' e _____ g ' h ' i ' k ' l -vA' a ' b ' c ' d ' e ______g ' h ' i ' k ' l -vIn' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -vin' a ' b ' c ' d ' e ' x '___' h ' i ' k ' l -van' a ' b ' c ' d ' e ' x _____ h ' i ' k ' l -vAn' a ' b ' c ' d ' e ' x ______h ' i ' k ' l -vIN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -viN' a ' b ' c ' d ' e ' x ' g '___' i ' k ' l -vaN' a ' b ' c ' d ' e ' x ' g _____ i ' k ' l -vAN' a ' b ' c ' d ' e ' x ' g ______i ' k ' l -v1IL' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -v1iL' a ' b ' c '___' e ' x ' g ' h ' i ' k ' l -v1aL' a ' b ' c _____ e ' x ' g ' h ' i ' k ' l -v1AL' a ' b ' c ______e ' x ' g ' h ' i ' k ' l -v1Il' a ' b ' c ' d ' _ ' x ' g ' h ' i ' k ' l -v1il' a ' b ' c ' d '___' x ' g ' h ' i ' k ' l -v1al' a ' b ' c ' d _____ x ' g ' h ' i ' k ' l -v1Al' a ' b ' c ' d ______x ' g ' h ' i ' k ' l -v1I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -v1i' a ' b ' c ' d ' e '___' g ' h ' i ' k ' l -v1a' a ' b ' c ' d ' e _____ g ' h ' i ' k ' l -v1A' a ' b ' c ' d ' e ______g ' h ' i ' k ' l -v1In' a ' b ' c ' d ' e ' x ' _ ' h ' i ' k ' l -v1in' a ' b ' c ' d ' e ' x '___' h ' i ' k ' l -v1an' a ' b ' c ' d ' e ' x _____ h ' i ' k ' l -v1An' a ' b ' c ' d ' e ' x ______h ' i ' k ' l -v1IN' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -v1iN' a ' b ' c ' d ' e ' x ' g '___' i ' k ' l -v1aN' a ' b ' c ' d ' e ' x ' g _____ i ' k ' l -v1AN' a ' b ' c ' d ' e ' x ' g ______i ' k ' l -v2IL' a ' _ ' c ' d ' e ' x ' g ' h ' i ' k ' l -v2iL' a '___' c ' d ' e ' x ' g ' h ' i ' k ' l -v2aL' a _____ c ' d ' e ' x ' g ' h ' i ' k ' l -v2AL' a ______c ' d ' e ' x ' g ' h ' i ' k ' l -v2Il' a ' b ' c ' _ ' e ' x ' g ' h ' i ' k ' l -v2il' a ' b ' c '___' e ' x ' g ' h ' i ' k ' l -v2al' a ' b ' c _____ e ' x ' g ' h ' i ' k ' l -v2Al' a ' b ' c ______e ' x ' g ' h ' i ' k ' l -v2I' a ' b ' c ' d ' e ' _ ' g ' h ' i ' k ' l -v2i' a ' b ' c ' d ' e '___' g ' h ' i ' k ' l -v2a' a ' b ' c ' d ' e _____ g ' h ' i ' k ' l -v2A' a ' b ' c ' d ' e ______g ' h ' i ' k ' l -v2In' a ' b ' c ' d ' e ' x ' g ' _ ' i ' k ' l -v2in' a ' b ' c ' d ' e ' x ' g '___' i ' k ' l -v2an' a ' b ' c ' d ' e ' x ' g _____ i ' k ' l -v2An' a ' b ' c ' d ' e ' x ' g ______i ' k ' l -v2IN' a ' b ' c ' d ' e ' x ' g ' h ' i ' _ ' l -v2iN' a ' b ' c ' d ' e ' x ' g ' h ' i '___' l -v2aN' a ' b ' c ' d ' e ' x ' g ' h ' i _____ l -v2AN' a ' b ' c ' d ' e ' x ' g ' h ' i ______l -a " b " c " d " e " x " g " h " i " k " l -cIL" a " b " c " _ " e " x " g " h " i " k " l -ciL" a " b " c "_" e " x " g " h " i " k " l -caL" a " b " c _ e " x " g " h " i " k " l -cAL" a " b " c _e " x " g " h " i " k " l -cIl" a " b " c " d " _ " x " g " h " i " k " l -cil" a " b " c " d "_" x " g " h " i " k " l -cal" a " b " c " d _ x " g " h " i " k " l -cAl" a " b " c " d _x " g " h " i " k " l -cI" a " b " c " d " e " _ " g " h " i " k " l -ci" a " b " c " d " e "_" g " h " i " k " l -ca" a " b " c " d " e _ g " h " i " k " l -cA" a " b " c " d " e _g " h " i " k " l -cIn" a " b " c " d " e " x " _ " h " i " k " l -cin" a " b " c " d " e " x "_" h " i " k " l -can" a " b " c " d " e " x _ h " i " k " l -cAn" a " b " c " d " e " x _h " i " k " l -cIN" a " b " c " d " e " x " g " _ " i " k " l -ciN" a " b " c " d " e " x " g "_" i " k " l -caN" a " b " c " d " e " x " g _ i " k " l -cAN" a " b " c " d " e " x " g _i " k " l -c1IL" a " b " c " _ " e " x " g " h " i " k " l -c1iL" a " b " c "_" e " x " g " h " i " k " l -c1aL" a " b " c _ e " x " g " h " i " k " l -c1AL" a " b " c _e " x " g " h " i " k " l -c1Il" a " b " c " d " _ " x " g " h " i " k " l -c1il" a " b " c " d "_" x " g " h " i " k " l -c1al" a " b " c " d _ x " g " h " i " k " l -c1Al" a " b " c " d _x " g " h " i " k " l -c1I" a " b " c " d " e " _ " g " h " i " k " l -c1i" a " b " c " d " e "_" g " h " i " k " l -c1a" a " b " c " d " e _ g " h " i " k " l -c1A" a " b " c " d " e _g " h " i " k " l -c1In" a " b " c " d " e " x " _ " h " i " k " l -c1in" a " b " c " d " e " x "_" h " i " k " l -c1an" a " b " c " d " e " x _ h " i " k " l -c1An" a " b " c " d " e " x _h " i " k " l -c1IN" a " b " c " d " e " x " g " _ " i " k " l -c1iN" a " b " c " d " e " x " g "_" i " k " l -c1aN" a " b " c " d " e " x " g _ i " k " l -c1AN" a " b " c " d " e " x " g _i " k " l -c2IL" a " _ " c " d " e " x " g " h " i " k " l -c2iL" a "_" c " d " e " x " g " h " i " k " l -c2aL" a _ c " d " e " x " g " h " i " k " l -c2AL" a _c " d " e " x " g " h " i " k " l -c2Il" a " b " c " _ " e " x " g " h " i " k " l -c2il" a " b " c "_" e " x " g " h " i " k " l -c2al" a " b " c _ e " x " g " h " i " k " l -c2Al" a " b " c _e " x " g " h " i " k " l -c2I" a " b " c " d " e " _ " g " h " i " k " l -c2i" a " b " c " d " e "_" g " h " i " k " l -c2a" a " b " c " d " e _ g " h " i " k " l -c2A" a " b " c " d " e _g " h " i " k " l -c2In" a " b " c " d " e " x " g " _ " i " k " l -c2in" a " b " c " d " e " x " g "_" i " k " l -c2an" a " b " c " d " e " x " g _ i " k " l -c2An" a " b " c " d " e " x " g _i " k " l -c2IN" a " b " c " d " e " x " g " h " i " _ " l -c2iN" a " b " c " d " e " x " g " h " i "_" l -c2aN" a " b " c " d " e " x " g " h " i _ l -c2AN" a " b " c " d " e " x " g " h " i _l -dIL" a " b " c " " e " x " g " h " i " k " l -diL" a " b " c "" e " x " g " h " i " k " l -daL" a " b " c e " x " g " h " i " k " l -dAL" a " b " c e " x " g " h " i " k " l -dIl" a " b " c " d " " x " g " h " i " k " l -dil" a " b " c " d "" x " g " h " i " k " l -dal" a " b " c " d x " g " h " i " k " l -dAl" a " b " c " d x " g " h " i " k " l -dI" a " b " c " d " e " " g " h " i " k " l -di" a " b " c " d " e "" g " h " i " k " l -da" a " b " c " d " e g " h " i " k " l -dA" a " b " c " d " e g " h " i " k " l -dIn" a " b " c " d " e " x " " h " i " k " l -din" a " b " c " d " e " x "" h " i " k " l -dan" a " b " c " d " e " x h " i " k " l -dAn" a " b " c " d " e " x h " i " k " l -dIN" a " b " c " d " e " x " g " " i " k " l -diN" a " b " c " d " e " x " g "" i " k " l -daN" a " b " c " d " e " x " g i " k " l -dAN" a " b " c " d " e " x " g i " k " l -d1IL" a " b " c " " e " x " g " h " i " k " l -d1iL" a " b " c "" e " x " g " h " i " k " l -d1aL" a " b " c e " x " g " h " i " k " l -d1AL" a " b " c e " x " g " h " i " k " l -d1Il" a " b " c " d " " x " g " h " i " k " l -d1il" a " b " c " d "" x " g " h " i " k " l -d1al" a " b " c " d x " g " h " i " k " l -d1Al" a " b " c " d x " g " h " i " k " l -d1I" a " b " c " d " e " " g " h " i " k " l -d1i" a " b " c " d " e "" g " h " i " k " l -d1a" a " b " c " d " e g " h " i " k " l -d1A" a " b " c " d " e g " h " i " k " l -d1In" a " b " c " d " e " x " " h " i " k " l -d1in" a " b " c " d " e " x "" h " i " k " l -d1an" a " b " c " d " e " x h " i " k " l -d1An" a " b " c " d " e " x h " i " k " l -d1IN" a " b " c " d " e " x " g " " i " k " l -d1iN" a " b " c " d " e " x " g "" i " k " l -d1aN" a " b " c " d " e " x " g i " k " l -d1AN" a " b " c " d " e " x " g i " k " l -d2IL" a " " c " d " e " x " g " h " i " k " l -d2iL" a "" c " d " e " x " g " h " i " k " l -d2aL" a c " d " e " x " g " h " i " k " l -d2AL" a c " d " e " x " g " h " i " k " l -d2Il" a " b " c " " e " x " g " h " i " k " l -d2il" a " b " c "" e " x " g " h " i " k " l -d2al" a " b " c e " x " g " h " i " k " l -d2Al" a " b " c e " x " g " h " i " k " l -d2I" a " b " c " d " e " " g " h " i " k " l -d2i" a " b " c " d " e "" g " h " i " k " l -d2a" a " b " c " d " e g " h " i " k " l -d2A" a " b " c " d " e g " h " i " k " l -d2In" a " b " c " d " e " x " g " " i " k " l -d2in" a " b " c " d " e " x " g "" i " k " l -d2an" a " b " c " d " e " x " g i " k " l -d2An" a " b " c " d " e " x " g i " k " l -d2IN" a " b " c " d " e " x " g " h " i " " l -d2iN" a " b " c " d " e " x " g " h " i "" l -d2aN" a " b " c " d " e " x " g " h " i l -d2AN" a " b " c " d " e " x " g " h " i l -yIL" a " b " c " d " e " x " g " h " i " k " l 'd' -yiL" a " b " c " d " e " x " g " h " i " k " l ' d ' -yaL" a " b " c " d " e " x " g " h " i " k " l '" d "' -yAL" a " b " c " d " e " x " g " h " i " k " l '" d " ' -yIl" a " b " c " d " e " x " g " h " i " k " l 'e' -yil" a " b " c " d " e " x " g " h " i " k " l ' e ' -yal" a " b " c " d " e " x " g " h " i " k " l '" e "' -yAl" a " b " c " d " e " x " g " h " i " k " l '" e " ' -yI" a " b " c " d " e " x " g " h " i " k " l 'x' -yi" a " b " c " d " e " x " g " h " i " k " l ' x ' -ya" a " b " c " d " e " x " g " h " i " k " l '" x "' -yA" a " b " c " d " e " x " g " h " i " k " l '" x " ' -yIn" a " b " c " d " e " x " g " h " i " k " l 'g' -yin" a " b " c " d " e " x " g " h " i " k " l ' g ' -yan" a " b " c " d " e " x " g " h " i " k " l '" g "' -yAn" a " b " c " d " e " x " g " h " i " k " l '" g " ' -yIN" a " b " c " d " e " x " g " h " i " k " l 'h' -yiN" a " b " c " d " e " x " g " h " i " k " l ' h ' -yaN" a " b " c " d " e " x " g " h " i " k " l '" h "' -yAN" a " b " c " d " e " x " g " h " i " k " l '" h " ' -y1IL" a " b " c " d " e " x " g " h " i " k " l 'd' -y1iL" a " b " c " d " e " x " g " h " i " k " l ' d ' -y1aL" a " b " c " d " e " x " g " h " i " k " l '" d "' -y1AL" a " b " c " d " e " x " g " h " i " k " l '" d " ' -y1Il" a " b " c " d " e " x " g " h " i " k " l 'e' -y1il" a " b " c " d " e " x " g " h " i " k " l ' e ' -y1al" a " b " c " d " e " x " g " h " i " k " l '" e "' -y1Al" a " b " c " d " e " x " g " h " i " k " l '" e " ' -y1I" a " b " c " d " e " x " g " h " i " k " l 'x' -y1i" a " b " c " d " e " x " g " h " i " k " l ' x ' -y1a" a " b " c " d " e " x " g " h " i " k " l '" x "' -y1A" a " b " c " d " e " x " g " h " i " k " l '" x " ' -y1In" a " b " c " d " e " x " g " h " i " k " l 'g' -y1in" a " b " c " d " e " x " g " h " i " k " l ' g ' -y1an" a " b " c " d " e " x " g " h " i " k " l '" g "' -y1An" a " b " c " d " e " x " g " h " i " k " l '" g " ' -y1IN" a " b " c " d " e " x " g " h " i " k " l 'h' -y1iN" a " b " c " d " e " x " g " h " i " k " l ' h ' -y1aN" a " b " c " d " e " x " g " h " i " k " l '" h "' -y1AN" a " b " c " d " e " x " g " h " i " k " l '" h " ' -y2IL" a " b " c " d " e " x " g " h " i " k " l 'b' -y2iL" a " b " c " d " e " x " g " h " i " k " l ' b ' -y2aL" a " b " c " d " e " x " g " h " i " k " l '" b "' -y2AL" a " b " c " d " e " x " g " h " i " k " l '" b " ' -y2Il" a " b " c " d " e " x " g " h " i " k " l 'd' -y2il" a " b " c " d " e " x " g " h " i " k " l ' d ' -y2al" a " b " c " d " e " x " g " h " i " k " l '" d "' -y2Al" a " b " c " d " e " x " g " h " i " k " l '" d " ' -y2I" a " b " c " d " e " x " g " h " i " k " l 'x' -y2i" a " b " c " d " e " x " g " h " i " k " l ' x ' -y2a" a " b " c " d " e " x " g " h " i " k " l '" x "' -y2A" a " b " c " d " e " x " g " h " i " k " l '" x " ' -y2In" a " b " c " d " e " x " g " h " i " k " l 'h' -y2in" a " b " c " d " e " x " g " h " i " k " l ' h ' -y2an" a " b " c " d " e " x " g " h " i " k " l '" h "' -y2An" a " b " c " d " e " x " g " h " i " k " l '" h " ' -y2IN" a " b " c " d " e " x " g " h " i " k " l 'k' -y2iN" a " b " c " d " e " x " g " h " i " k " l ' k ' -y2aN" a " b " c " d " e " x " g " h " i " k " l '" k "' -y2AN" a " b " c " d " e " x " g " h " i " k " l '" k " ' -vIL" a " b " c " _ " e " x " g " h " i " k " l -viL" a " b " c "___" e " x " g " h " i " k " l -vaL" a " b " c _____ e " x " g " h " i " k " l -vAL" a " b " c ______e " x " g " h " i " k " l -vIl" a " b " c " d " _ " x " g " h " i " k " l -vil" a " b " c " d "___" x " g " h " i " k " l -val" a " b " c " d _____ x " g " h " i " k " l -vAl" a " b " c " d ______x " g " h " i " k " l -vI" a " b " c " d " e " _ " g " h " i " k " l -vi" a " b " c " d " e "___" g " h " i " k " l -va" a " b " c " d " e _____ g " h " i " k " l -vA" a " b " c " d " e ______g " h " i " k " l -vIn" a " b " c " d " e " x " _ " h " i " k " l -vin" a " b " c " d " e " x "___" h " i " k " l -van" a " b " c " d " e " x _____ h " i " k " l -vAn" a " b " c " d " e " x ______h " i " k " l -vIN" a " b " c " d " e " x " g " _ " i " k " l -viN" a " b " c " d " e " x " g "___" i " k " l -vaN" a " b " c " d " e " x " g _____ i " k " l -vAN" a " b " c " d " e " x " g ______i " k " l -v1IL" a " b " c " _ " e " x " g " h " i " k " l -v1iL" a " b " c "___" e " x " g " h " i " k " l -v1aL" a " b " c _____ e " x " g " h " i " k " l -v1AL" a " b " c ______e " x " g " h " i " k " l -v1Il" a " b " c " d " _ " x " g " h " i " k " l -v1il" a " b " c " d "___" x " g " h " i " k " l -v1al" a " b " c " d _____ x " g " h " i " k " l -v1Al" a " b " c " d ______x " g " h " i " k " l -v1I" a " b " c " d " e " _ " g " h " i " k " l -v1i" a " b " c " d " e "___" g " h " i " k " l -v1a" a " b " c " d " e _____ g " h " i " k " l -v1A" a " b " c " d " e ______g " h " i " k " l -v1In" a " b " c " d " e " x " _ " h " i " k " l -v1in" a " b " c " d " e " x "___" h " i " k " l -v1an" a " b " c " d " e " x _____ h " i " k " l -v1An" a " b " c " d " e " x ______h " i " k " l -v1IN" a " b " c " d " e " x " g " _ " i " k " l -v1iN" a " b " c " d " e " x " g "___" i " k " l -v1aN" a " b " c " d " e " x " g _____ i " k " l -v1AN" a " b " c " d " e " x " g ______i " k " l -v2IL" a " _ " c " d " e " x " g " h " i " k " l -v2iL" a "___" c " d " e " x " g " h " i " k " l -v2aL" a _____ c " d " e " x " g " h " i " k " l -v2AL" a ______c " d " e " x " g " h " i " k " l -v2Il" a " b " c " _ " e " x " g " h " i " k " l -v2il" a " b " c "___" e " x " g " h " i " k " l -v2al" a " b " c _____ e " x " g " h " i " k " l -v2Al" a " b " c ______e " x " g " h " i " k " l -v2I" a " b " c " d " e " _ " g " h " i " k " l -v2i" a " b " c " d " e "___" g " h " i " k " l -v2a" a " b " c " d " e _____ g " h " i " k " l -v2A" a " b " c " d " e ______g " h " i " k " l -v2In" a " b " c " d " e " x " g " _ " i " k " l -v2in" a " b " c " d " e " x " g "___" i " k " l -v2an" a " b " c " d " e " x " g _____ i " k " l -v2An" a " b " c " d " e " x " g ______i " k " l -v2IN" a " b " c " d " e " x " g " h " i " _ " l -v2iN" a " b " c " d " e " x " g " h " i "___" l -v2aN" a " b " c " d " e " x " g " h " i _____ l -v2AN" a " b " c " d " e " x " g " h " i ______l -a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l -cIL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -ciL` a ` b ` c `_` e ` x ` g ` h ` i ` k ` l -caL` a ` b ` c _ e ` x ` g ` h ` i ` k ` l -cAL` a ` b ` c _e ` x ` g ` h ` i ` k ` l -cIl` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -cil` a ` b ` c ` d `_` x ` g ` h ` i ` k ` l -cal` a ` b ` c ` d _ x ` g ` h ` i ` k ` l -cAl` a ` b ` c ` d _x ` g ` h ` i ` k ` l -cI` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -ci` a ` b ` c ` d ` e `_` g ` h ` i ` k ` l -ca` a ` b ` c ` d ` e _ g ` h ` i ` k ` l -cA` a ` b ` c ` d ` e _g ` h ` i ` k ` l -cIn` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -cin` a ` b ` c ` d ` e ` x `_` h ` i ` k ` l -can` a ` b ` c ` d ` e ` x _ h ` i ` k ` l -cAn` a ` b ` c ` d ` e ` x _h ` i ` k ` l -cIN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -ciN` a ` b ` c ` d ` e ` x ` g `_` i ` k ` l -caN` a ` b ` c ` d ` e ` x ` g _ i ` k ` l -cAN` a ` b ` c ` d ` e ` x ` g _i ` k ` l -c1IL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -c1iL` a ` b ` c `_` e ` x ` g ` h ` i ` k ` l -c1aL` a ` b ` c _ e ` x ` g ` h ` i ` k ` l -c1AL` a ` b ` c _e ` x ` g ` h ` i ` k ` l -c1Il` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -c1il` a ` b ` c ` d `_` x ` g ` h ` i ` k ` l -c1al` a ` b ` c ` d _ x ` g ` h ` i ` k ` l -c1Al` a ` b ` c ` d _x ` g ` h ` i ` k ` l -c1I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -c1i` a ` b ` c ` d ` e `_` g ` h ` i ` k ` l -c1a` a ` b ` c ` d ` e _ g ` h ` i ` k ` l -c1A` a ` b ` c ` d ` e _g ` h ` i ` k ` l -c1In` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -c1in` a ` b ` c ` d ` e ` x `_` h ` i ` k ` l -c1an` a ` b ` c ` d ` e ` x _ h ` i ` k ` l -c1An` a ` b ` c ` d ` e ` x _h ` i ` k ` l -c1IN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -c1iN` a ` b ` c ` d ` e ` x ` g `_` i ` k ` l -c1aN` a ` b ` c ` d ` e ` x ` g _ i ` k ` l -c1AN` a ` b ` c ` d ` e ` x ` g _i ` k ` l -c2IL` a ` _ ` c ` d ` e ` x ` g ` h ` i ` k ` l -c2iL` a `_` c ` d ` e ` x ` g ` h ` i ` k ` l -c2aL` a _ c ` d ` e ` x ` g ` h ` i ` k ` l -c2AL` a _c ` d ` e ` x ` g ` h ` i ` k ` l -c2Il` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -c2il` a ` b ` c `_` e ` x ` g ` h ` i ` k ` l -c2al` a ` b ` c _ e ` x ` g ` h ` i ` k ` l -c2Al` a ` b ` c _e ` x ` g ` h ` i ` k ` l -c2I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -c2i` a ` b ` c ` d ` e `_` g ` h ` i ` k ` l -c2a` a ` b ` c ` d ` e _ g ` h ` i ` k ` l -c2A` a ` b ` c ` d ` e _g ` h ` i ` k ` l -c2In` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -c2in` a ` b ` c ` d ` e ` x ` g `_` i ` k ` l -c2an` a ` b ` c ` d ` e ` x ` g _ i ` k ` l -c2An` a ` b ` c ` d ` e ` x ` g _i ` k ` l -c2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` _ ` l -c2iN` a ` b ` c ` d ` e ` x ` g ` h ` i `_` l -c2aN` a ` b ` c ` d ` e ` x ` g ` h ` i _ l -c2AN` a ` b ` c ` d ` e ` x ` g ` h ` i _l -dIL` a ` b ` c ` ` e ` x ` g ` h ` i ` k ` l -diL` a ` b ` c `` e ` x ` g ` h ` i ` k ` l -daL` a ` b ` c e ` x ` g ` h ` i ` k ` l -dAL` a ` b ` c e ` x ` g ` h ` i ` k ` l -dIl` a ` b ` c ` d ` ` x ` g ` h ` i ` k ` l -dil` a ` b ` c ` d `` x ` g ` h ` i ` k ` l -dal` a ` b ` c ` d x ` g ` h ` i ` k ` l -dAl` a ` b ` c ` d x ` g ` h ` i ` k ` l -dI` a ` b ` c ` d ` e ` ` g ` h ` i ` k ` l -di` a ` b ` c ` d ` e `` g ` h ` i ` k ` l -da` a ` b ` c ` d ` e g ` h ` i ` k ` l -dA` a ` b ` c ` d ` e g ` h ` i ` k ` l -dIn` a ` b ` c ` d ` e ` x ` ` h ` i ` k ` l -din` a ` b ` c ` d ` e ` x `` h ` i ` k ` l -dan` a ` b ` c ` d ` e ` x h ` i ` k ` l -dAn` a ` b ` c ` d ` e ` x h ` i ` k ` l -dIN` a ` b ` c ` d ` e ` x ` g ` ` i ` k ` l -diN` a ` b ` c ` d ` e ` x ` g `` i ` k ` l -daN` a ` b ` c ` d ` e ` x ` g i ` k ` l -dAN` a ` b ` c ` d ` e ` x ` g i ` k ` l -d1IL` a ` b ` c ` ` e ` x ` g ` h ` i ` k ` l -d1iL` a ` b ` c `` e ` x ` g ` h ` i ` k ` l -d1aL` a ` b ` c e ` x ` g ` h ` i ` k ` l -d1AL` a ` b ` c e ` x ` g ` h ` i ` k ` l -d1Il` a ` b ` c ` d ` ` x ` g ` h ` i ` k ` l -d1il` a ` b ` c ` d `` x ` g ` h ` i ` k ` l -d1al` a ` b ` c ` d x ` g ` h ` i ` k ` l -d1Al` a ` b ` c ` d x ` g ` h ` i ` k ` l -d1I` a ` b ` c ` d ` e ` ` g ` h ` i ` k ` l -d1i` a ` b ` c ` d ` e `` g ` h ` i ` k ` l -d1a` a ` b ` c ` d ` e g ` h ` i ` k ` l -d1A` a ` b ` c ` d ` e g ` h ` i ` k ` l -d1In` a ` b ` c ` d ` e ` x ` ` h ` i ` k ` l -d1in` a ` b ` c ` d ` e ` x `` h ` i ` k ` l -d1an` a ` b ` c ` d ` e ` x h ` i ` k ` l -d1An` a ` b ` c ` d ` e ` x h ` i ` k ` l -d1IN` a ` b ` c ` d ` e ` x ` g ` ` i ` k ` l -d1iN` a ` b ` c ` d ` e ` x ` g `` i ` k ` l -d1aN` a ` b ` c ` d ` e ` x ` g i ` k ` l -d1AN` a ` b ` c ` d ` e ` x ` g i ` k ` l -d2IL` a ` ` c ` d ` e ` x ` g ` h ` i ` k ` l -d2iL` a `` c ` d ` e ` x ` g ` h ` i ` k ` l -d2aL` a c ` d ` e ` x ` g ` h ` i ` k ` l -d2AL` a c ` d ` e ` x ` g ` h ` i ` k ` l -d2Il` a ` b ` c ` ` e ` x ` g ` h ` i ` k ` l -d2il` a ` b ` c `` e ` x ` g ` h ` i ` k ` l -d2al` a ` b ` c e ` x ` g ` h ` i ` k ` l -d2Al` a ` b ` c e ` x ` g ` h ` i ` k ` l -d2I` a ` b ` c ` d ` e ` ` g ` h ` i ` k ` l -d2i` a ` b ` c ` d ` e `` g ` h ` i ` k ` l -d2a` a ` b ` c ` d ` e g ` h ` i ` k ` l -d2A` a ` b ` c ` d ` e g ` h ` i ` k ` l -d2In` a ` b ` c ` d ` e ` x ` g ` ` i ` k ` l -d2in` a ` b ` c ` d ` e ` x ` g `` i ` k ` l -d2an` a ` b ` c ` d ` e ` x ` g i ` k ` l -d2An` a ` b ` c ` d ` e ` x ` g i ` k ` l -d2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` ` l -d2iN` a ` b ` c ` d ` e ` x ` g ` h ` i `` l -d2aN` a ` b ` c ` d ` e ` x ` g ` h ` i l -d2AN` a ` b ` c ` d ` e ` x ` g ` h ` i l -yIL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'd' -yiL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' d ' -yaL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d `' -yAL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d ` ' -yIl` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'e' -yil` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' e ' -yal` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e `' -yAl` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e ` ' -yI` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'x' -yi` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' x ' -ya` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x `' -yA` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x ` ' -yIn` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'g' -yin` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' g ' -yan` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g `' -yAn` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g ` ' -yIN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'h' -yiN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' h ' -yaN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h `' -yAN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h ` ' -y1IL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'd' -y1iL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' d ' -y1aL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d `' -y1AL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d ` ' -y1Il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'e' -y1il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' e ' -y1al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e `' -y1Al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` e ` ' -y1I` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'x' -y1i` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' x ' -y1a` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x `' -y1A` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x ` ' -y1In` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'g' -y1in` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' g ' -y1an` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g `' -y1An` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` g ` ' -y1IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'h' -y1iN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' h ' -y1aN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h `' -y1AN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h ` ' -y2IL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'b' -y2iL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' b ' -y2aL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` b `' -y2AL` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` b ` ' -y2Il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'd' -y2il` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' d ' -y2al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d `' -y2Al` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` d ` ' -y2I` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'x' -y2i` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' x ' -y2a` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x `' -y2A` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` x ` ' -y2In` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'h' -y2in` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' h ' -y2an` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h `' -y2An` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` h ` ' -y2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l 'k' -y2iN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l ' k ' -y2aN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` k `' -y2AN` a ` b ` c ` d ` e ` x ` g ` h ` i ` k ` l '` k ` ' -vIL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -viL` a ` b ` c `___` e ` x ` g ` h ` i ` k ` l -vaL` a ` b ` c _____ e ` x ` g ` h ` i ` k ` l -vAL` a ` b ` c ______e ` x ` g ` h ` i ` k ` l -vIl` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -vil` a ` b ` c ` d `___` x ` g ` h ` i ` k ` l -val` a ` b ` c ` d _____ x ` g ` h ` i ` k ` l -vAl` a ` b ` c ` d ______x ` g ` h ` i ` k ` l -vI` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -vi` a ` b ` c ` d ` e `___` g ` h ` i ` k ` l -va` a ` b ` c ` d ` e _____ g ` h ` i ` k ` l -vA` a ` b ` c ` d ` e ______g ` h ` i ` k ` l -vIn` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -vin` a ` b ` c ` d ` e ` x `___` h ` i ` k ` l -van` a ` b ` c ` d ` e ` x _____ h ` i ` k ` l -vAn` a ` b ` c ` d ` e ` x ______h ` i ` k ` l -vIN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -viN` a ` b ` c ` d ` e ` x ` g `___` i ` k ` l -vaN` a ` b ` c ` d ` e ` x ` g _____ i ` k ` l -vAN` a ` b ` c ` d ` e ` x ` g ______i ` k ` l -v1IL` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -v1iL` a ` b ` c `___` e ` x ` g ` h ` i ` k ` l -v1aL` a ` b ` c _____ e ` x ` g ` h ` i ` k ` l -v1AL` a ` b ` c ______e ` x ` g ` h ` i ` k ` l -v1Il` a ` b ` c ` d ` _ ` x ` g ` h ` i ` k ` l -v1il` a ` b ` c ` d `___` x ` g ` h ` i ` k ` l -v1al` a ` b ` c ` d _____ x ` g ` h ` i ` k ` l -v1Al` a ` b ` c ` d ______x ` g ` h ` i ` k ` l -v1I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -v1i` a ` b ` c ` d ` e `___` g ` h ` i ` k ` l -v1a` a ` b ` c ` d ` e _____ g ` h ` i ` k ` l -v1A` a ` b ` c ` d ` e ______g ` h ` i ` k ` l -v1In` a ` b ` c ` d ` e ` x ` _ ` h ` i ` k ` l -v1in` a ` b ` c ` d ` e ` x `___` h ` i ` k ` l -v1an` a ` b ` c ` d ` e ` x _____ h ` i ` k ` l -v1An` a ` b ` c ` d ` e ` x ______h ` i ` k ` l -v1IN` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -v1iN` a ` b ` c ` d ` e ` x ` g `___` i ` k ` l -v1aN` a ` b ` c ` d ` e ` x ` g _____ i ` k ` l -v1AN` a ` b ` c ` d ` e ` x ` g ______i ` k ` l -v2IL` a ` _ ` c ` d ` e ` x ` g ` h ` i ` k ` l -v2iL` a `___` c ` d ` e ` x ` g ` h ` i ` k ` l -v2aL` a _____ c ` d ` e ` x ` g ` h ` i ` k ` l -v2AL` a ______c ` d ` e ` x ` g ` h ` i ` k ` l -v2Il` a ` b ` c ` _ ` e ` x ` g ` h ` i ` k ` l -v2il` a ` b ` c `___` e ` x ` g ` h ` i ` k ` l -v2al` a ` b ` c _____ e ` x ` g ` h ` i ` k ` l -v2Al` a ` b ` c ______e ` x ` g ` h ` i ` k ` l -v2I` a ` b ` c ` d ` e ` _ ` g ` h ` i ` k ` l -v2i` a ` b ` c ` d ` e `___` g ` h ` i ` k ` l -v2a` a ` b ` c ` d ` e _____ g ` h ` i ` k ` l -v2A` a ` b ` c ` d ` e ______g ` h ` i ` k ` l -v2In` a ` b ` c ` d ` e ` x ` g ` _ ` i ` k ` l -v2in` a ` b ` c ` d ` e ` x ` g `___` i ` k ` l -v2an` a ` b ` c ` d ` e ` x ` g _____ i ` k ` l -v2An` a ` b ` c ` d ` e ` x ` g ______i ` k ` l -v2IN` a ` b ` c ` d ` e ` x ` g ` h ` i ` _ ` l -v2iN` a ` b ` c ` d ` e ` x ` g ` h ` i `___` l -v2aN` a ` b ` c ` d ` e ` x ` g ` h ` i _____ l -v2AN` a ` b ` c ` d ` e ` x ` g ` h ` i ______l - -a , b , c , d , e , x , g , h , i , k , l -cIL, a , b , c , _ , e , x , g , h , i , k , l -ciL, a , b , c ,_, e , x , g , h , i , k , l -caL, a , b , c _, e , x , g , h , i , k , l -cAL, a , b , c _e , x , g , h , i , k , l -cIl, a , b , c , d , _ , x , g , h , i , k , l -cil, a , b , c , d ,_, x , g , h , i , k , l -cal, a , b , c , d _, x , g , h , i , k , l -cAl, a , b , c , d _x , g , h , i , k , l -cI, a , b , c , d , e , _ , g , h , i , k , l -ci, a , b , c , d , e ,_, g , h , i , k , l -ca, a , b , c , d , e _, g , h , i , k , l -cA, a , b , c , d , e _g , h , i , k , l -cIn, a , b , c , d , e , x , _ , h , i , k , l -cin, a , b , c , d , e , x ,_, h , i , k , l -can, a , b , c , d , e , x _, h , i , k , l -cAn, a , b , c , d , e , x _h , i , k , l -cIN, a , b , c , d , e , x , g , _ , i , k , l -ciN, a , b , c , d , e , x , g ,_, i , k , l -caN, a , b , c , d , e , x , g _, i , k , l -cAN, a , b , c , d , e , x , g _i , k , l -c1IL, a , b , c , _ , e , x , g , h , i , k , l -c1iL, a , b , c ,_, e , x , g , h , i , k , l -c1aL, a , b , c _, e , x , g , h , i , k , l -c1AL, a , b , c _e , x , g , h , i , k , l -c1Il, a , b , c , d , _ , x , g , h , i , k , l -c1il, a , b , c , d ,_, x , g , h , i , k , l -c1al, a , b , c , d _, x , g , h , i , k , l -c1Al, a , b , c , d _x , g , h , i , k , l -c1I, a , b , c , d , e , _ , g , h , i , k , l -c1i, a , b , c , d , e ,_, g , h , i , k , l -c1a, a , b , c , d , e _, g , h , i , k , l -c1A, a , b , c , d , e _g , h , i , k , l -c1In, a , b , c , d , e , x , _ , h , i , k , l -c1in, a , b , c , d , e , x ,_, h , i , k , l -c1an, a , b , c , d , e , x _, h , i , k , l -c1An, a , b , c , d , e , x _h , i , k , l -c1IN, a , b , c , d , e , x , g , _ , i , k , l -c1iN, a , b , c , d , e , x , g ,_, i , k , l -c1aN, a , b , c , d , e , x , g _, i , k , l -c1AN, a , b , c , d , e , x , g _i , k , l -c2IL, a , _ , c , d , e , x , g , h , i , k , l -c2iL, a ,_, c , d , e , x , g , h , i , k , l -c2aL, a _, c , d , e , x , g , h , i , k , l -c2AL, a _c , d , e , x , g , h , i , k , l -c2Il, a , b , c , _ , e , x , g , h , i , k , l -c2il, a , b , c ,_, e , x , g , h , i , k , l -c2al, a , b , c _, e , x , g , h , i , k , l -c2Al, a , b , c _e , x , g , h , i , k , l -c2I, a , b , c , d , e , _ , g , h , i , k , l -c2i, a , b , c , d , e ,_, g , h , i , k , l -c2a, a , b , c , d , e _, g , h , i , k , l -c2A, a , b , c , d , e _g , h , i , k , l -c2In, a , b , c , d , e , x , g , _ , i , k , l -c2in, a , b , c , d , e , x , g ,_, i , k , l -c2an, a , b , c , d , e , x , g _, i , k , l -c2An, a , b , c , d , e , x , g _i , k , l -c2IN, a , b , c , d , e , x , g , h , i , _ , l -c2iN, a , b , c , d , e , x , g , h , i ,_, l -c2aN, a , b , c , d , e , x , g , h , i _, l -c2AN, a , b , c , d , e , x , g , h , i _l -dIL, a , b , c , , e , x , g , h , i , k , l -diL, a , b , c ,, e , x , g , h , i , k , l -daL, a , b , c , e , x , g , h , i , k , l -dAL, a , b , c e , x , g , h , i , k , l -dIl, a , b , c , d , , x , g , h , i , k , l -dil, a , b , c , d ,, x , g , h , i , k , l -dal, a , b , c , d , x , g , h , i , k , l -dAl, a , b , c , d x , g , h , i , k , l -dI, a , b , c , d , e , , g , h , i , k , l -di, a , b , c , d , e ,, g , h , i , k , l -da, a , b , c , d , e , g , h , i , k , l -dA, a , b , c , d , e g , h , i , k , l -dIn, a , b , c , d , e , x , , h , i , k , l -din, a , b , c , d , e , x ,, h , i , k , l -dan, a , b , c , d , e , x , h , i , k , l -dAn, a , b , c , d , e , x h , i , k , l -dIN, a , b , c , d , e , x , g , , i , k , l -diN, a , b , c , d , e , x , g ,, i , k , l -daN, a , b , c , d , e , x , g , i , k , l -dAN, a , b , c , d , e , x , g i , k , l -d1IL, a , b , c , , e , x , g , h , i , k , l -d1iL, a , b , c ,, e , x , g , h , i , k , l -d1aL, a , b , c , e , x , g , h , i , k , l -d1AL, a , b , c e , x , g , h , i , k , l -d1Il, a , b , c , d , , x , g , h , i , k , l -d1il, a , b , c , d ,, x , g , h , i , k , l -d1al, a , b , c , d , x , g , h , i , k , l -d1Al, a , b , c , d x , g , h , i , k , l -d1I, a , b , c , d , e , , g , h , i , k , l -d1i, a , b , c , d , e ,, g , h , i , k , l -d1a, a , b , c , d , e , g , h , i , k , l -d1A, a , b , c , d , e g , h , i , k , l -d1In, a , b , c , d , e , x , , h , i , k , l -d1in, a , b , c , d , e , x ,, h , i , k , l -d1an, a , b , c , d , e , x , h , i , k , l -d1An, a , b , c , d , e , x h , i , k , l -d1IN, a , b , c , d , e , x , g , , i , k , l -d1iN, a , b , c , d , e , x , g ,, i , k , l -d1aN, a , b , c , d , e , x , g , i , k , l -d1AN, a , b , c , d , e , x , g i , k , l -d2IL, a , , c , d , e , x , g , h , i , k , l -d2iL, a ,, c , d , e , x , g , h , i , k , l -d2aL, a , c , d , e , x , g , h , i , k , l -d2AL, a c , d , e , x , g , h , i , k , l -d2Il, a , b , c , , e , x , g , h , i , k , l -d2il, a , b , c ,, e , x , g , h , i , k , l -d2al, a , b , c , e , x , g , h , i , k , l -d2Al, a , b , c e , x , g , h , i , k , l -d2I, a , b , c , d , e , , g , h , i , k , l -d2i, a , b , c , d , e ,, g , h , i , k , l -d2a, a , b , c , d , e , g , h , i , k , l -d2A, a , b , c , d , e g , h , i , k , l -d2In, a , b , c , d , e , x , g , , i , k , l -d2in, a , b , c , d , e , x , g ,, i , k , l -d2an, a , b , c , d , e , x , g , i , k , l -d2An, a , b , c , d , e , x , g i , k , l -d2IN, a , b , c , d , e , x , g , h , i , , l -d2iN, a , b , c , d , e , x , g , h , i ,, l -d2aN, a , b , c , d , e , x , g , h , i , l -d2AN, a , b , c , d , e , x , g , h , i l -yIL, a , b , c , d , e , x , g , h , i , k , l 'd' -yiL, a , b , c , d , e , x , g , h , i , k , l ' d ' -yaL, a , b , c , d , e , x , g , h , i , k , l ', d ' -yAL, a , b , c , d , e , x , g , h , i , k , l ', d , ' -yIl, a , b , c , d , e , x , g , h , i , k , l 'e' -yil, a , b , c , d , e , x , g , h , i , k , l ' e ' -yal, a , b , c , d , e , x , g , h , i , k , l ', e ' -yAl, a , b , c , d , e , x , g , h , i , k , l ', e , ' -yI, a , b , c , d , e , x , g , h , i , k , l 'x' -yi, a , b , c , d , e , x , g , h , i , k , l ' x ' -ya, a , b , c , d , e , x , g , h , i , k , l ', x ' -yA, a , b , c , d , e , x , g , h , i , k , l ', x , ' -yIn, a , b , c , d , e , x , g , h , i , k , l 'g' -yin, a , b , c , d , e , x , g , h , i , k , l ' g ' -yan, a , b , c , d , e , x , g , h , i , k , l ', g ' -yAn, a , b , c , d , e , x , g , h , i , k , l ', g , ' -yIN, a , b , c , d , e , x , g , h , i , k , l 'h' -yiN, a , b , c , d , e , x , g , h , i , k , l ' h ' -yaN, a , b , c , d , e , x , g , h , i , k , l ', h ' -yAN, a , b , c , d , e , x , g , h , i , k , l ', h , ' -y1IL, a , b , c , d , e , x , g , h , i , k , l 'd' -y1iL, a , b , c , d , e , x , g , h , i , k , l ' d ' -y1aL, a , b , c , d , e , x , g , h , i , k , l ', d ' -y1AL, a , b , c , d , e , x , g , h , i , k , l ', d , ' -y1Il, a , b , c , d , e , x , g , h , i , k , l 'e' -y1il, a , b , c , d , e , x , g , h , i , k , l ' e ' -y1al, a , b , c , d , e , x , g , h , i , k , l ', e ' -y1Al, a , b , c , d , e , x , g , h , i , k , l ', e , ' -y1I, a , b , c , d , e , x , g , h , i , k , l 'x' -y1i, a , b , c , d , e , x , g , h , i , k , l ' x ' -y1a, a , b , c , d , e , x , g , h , i , k , l ', x ' -y1A, a , b , c , d , e , x , g , h , i , k , l ', x , ' -y1In, a , b , c , d , e , x , g , h , i , k , l 'g' -y1in, a , b , c , d , e , x , g , h , i , k , l ' g ' -y1an, a , b , c , d , e , x , g , h , i , k , l ', g ' -y1An, a , b , c , d , e , x , g , h , i , k , l ', g , ' -y1IN, a , b , c , d , e , x , g , h , i , k , l 'h' -y1iN, a , b , c , d , e , x , g , h , i , k , l ' h ' -y1aN, a , b , c , d , e , x , g , h , i , k , l ', h ' -y1AN, a , b , c , d , e , x , g , h , i , k , l ', h , ' -y2IL, a , b , c , d , e , x , g , h , i , k , l 'b' -y2iL, a , b , c , d , e , x , g , h , i , k , l ' b ' -y2aL, a , b , c , d , e , x , g , h , i , k , l ', b ' -y2AL, a , b , c , d , e , x , g , h , i , k , l ', b , ' -y2Il, a , b , c , d , e , x , g , h , i , k , l 'd' -y2il, a , b , c , d , e , x , g , h , i , k , l ' d ' -y2al, a , b , c , d , e , x , g , h , i , k , l ', d ' -y2Al, a , b , c , d , e , x , g , h , i , k , l ', d , ' -y2I, a , b , c , d , e , x , g , h , i , k , l 'x' -y2i, a , b , c , d , e , x , g , h , i , k , l ' x ' -y2a, a , b , c , d , e , x , g , h , i , k , l ', x ' -y2A, a , b , c , d , e , x , g , h , i , k , l ', x , ' -y2In, a , b , c , d , e , x , g , h , i , k , l 'h' -y2in, a , b , c , d , e , x , g , h , i , k , l ' h ' -y2an, a , b , c , d , e , x , g , h , i , k , l ', h ' -y2An, a , b , c , d , e , x , g , h , i , k , l ', h , ' -y2IN, a , b , c , d , e , x , g , h , i , k , l 'k' -y2iN, a , b , c , d , e , x , g , h , i , k , l ' k ' -y2aN, a , b , c , d , e , x , g , h , i , k , l ', k ' -y2AN, a , b , c , d , e , x , g , h , i , k , l ', k , ' -vIL, a , b , c , _ , e , x , g , h , i , k , l -viL, a , b , c ,___, e , x , g , h , i , k , l -vaL, a , b , c ____, e , x , g , h , i , k , l -vAL, a , b , c ______e , x , g , h , i , k , l -vIl, a , b , c , d , _ , x , g , h , i , k , l -vil, a , b , c , d ,___, x , g , h , i , k , l -val, a , b , c , d ____, x , g , h , i , k , l -vAl, a , b , c , d ______x , g , h , i , k , l -vI, a , b , c , d , e , _ , g , h , i , k , l -vi, a , b , c , d , e ,___, g , h , i , k , l -va, a , b , c , d , e ____, g , h , i , k , l -vA, a , b , c , d , e ______g , h , i , k , l -vIn, a , b , c , d , e , x , _ , h , i , k , l -vin, a , b , c , d , e , x ,___, h , i , k , l -van, a , b , c , d , e , x ____, h , i , k , l -vAn, a , b , c , d , e , x ______h , i , k , l -vIN, a , b , c , d , e , x , g , _ , i , k , l -viN, a , b , c , d , e , x , g ,___, i , k , l -vaN, a , b , c , d , e , x , g ____, i , k , l -vAN, a , b , c , d , e , x , g ______i , k , l -v1IL, a , b , c , _ , e , x , g , h , i , k , l -v1iL, a , b , c ,___, e , x , g , h , i , k , l -v1aL, a , b , c ____, e , x , g , h , i , k , l -v1AL, a , b , c ______e , x , g , h , i , k , l -v1Il, a , b , c , d , _ , x , g , h , i , k , l -v1il, a , b , c , d ,___, x , g , h , i , k , l -v1al, a , b , c , d ____, x , g , h , i , k , l -v1Al, a , b , c , d ______x , g , h , i , k , l -v1I, a , b , c , d , e , _ , g , h , i , k , l -v1i, a , b , c , d , e ,___, g , h , i , k , l -v1a, a , b , c , d , e ____, g , h , i , k , l -v1A, a , b , c , d , e ______g , h , i , k , l -v1In, a , b , c , d , e , x , _ , h , i , k , l -v1in, a , b , c , d , e , x ,___, h , i , k , l -v1an, a , b , c , d , e , x ____, h , i , k , l -v1An, a , b , c , d , e , x ______h , i , k , l -v1IN, a , b , c , d , e , x , g , _ , i , k , l -v1iN, a , b , c , d , e , x , g ,___, i , k , l -v1aN, a , b , c , d , e , x , g ____, i , k , l -v1AN, a , b , c , d , e , x , g ______i , k , l -v2IL, a , _ , c , d , e , x , g , h , i , k , l -v2iL, a ,___, c , d , e , x , g , h , i , k , l -v2aL, a ____, c , d , e , x , g , h , i , k , l -v2AL, a ______c , d , e , x , g , h , i , k , l -v2Il, a , b , c , _ , e , x , g , h , i , k , l -v2il, a , b , c ,___, e , x , g , h , i , k , l -v2al, a , b , c ____, e , x , g , h , i , k , l -v2Al, a , b , c ______e , x , g , h , i , k , l -v2I, a , b , c , d , e , _ , g , h , i , k , l -v2i, a , b , c , d , e ,___, g , h , i , k , l -v2a, a , b , c , d , e ____, g , h , i , k , l -v2A, a , b , c , d , e ______g , h , i , k , l -v2In, a , b , c , d , e , x , g , _ , i , k , l -v2in, a , b , c , d , e , x , g ,___, i , k , l -v2an, a , b , c , d , e , x , g ____, i , k , l -v2An, a , b , c , d , e , x , g ______i , k , l -v2IN, a , b , c , d , e , x , g , h , i , _ , l -v2iN, a , b , c , d , e , x , g , h , i ,___, l -v2aN, a , b , c , d , e , x , g , h , i ____, l -v2AN, a , b , c , d , e , x , g , h , i ______l -a . b . c . d . e . x . g . h . i . k . l -cIL. a . b . c . _ . e . x . g . h . i . k . l -ciL. a . b . c ._. e . x . g . h . i . k . l -caL. a . b . c _. e . x . g . h . i . k . l -cAL. a . b . c _e . x . g . h . i . k . l -cIl. a . b . c . d . _ . x . g . h . i . k . l -cil. a . b . c . d ._. x . g . h . i . k . l -cal. a . b . c . d _. x . g . h . i . k . l -cAl. a . b . c . d _x . g . h . i . k . l -cI. a . b . c . d . e . _ . g . h . i . k . l -ci. a . b . c . d . e ._. g . h . i . k . l -ca. a . b . c . d . e _. g . h . i . k . l -cA. a . b . c . d . e _g . h . i . k . l -cIn. a . b . c . d . e . x . _ . h . i . k . l -cin. a . b . c . d . e . x ._. h . i . k . l -can. a . b . c . d . e . x _. h . i . k . l -cAn. a . b . c . d . e . x _h . i . k . l -cIN. a . b . c . d . e . x . g . _ . i . k . l -ciN. a . b . c . d . e . x . g ._. i . k . l -caN. a . b . c . d . e . x . g _. i . k . l -cAN. a . b . c . d . e . x . g _i . k . l -c1IL. a . b . c . _ . e . x . g . h . i . k . l -c1iL. a . b . c ._. e . x . g . h . i . k . l -c1aL. a . b . c _. e . x . g . h . i . k . l -c1AL. a . b . c _e . x . g . h . i . k . l -c1Il. a . b . c . d . _ . x . g . h . i . k . l -c1il. a . b . c . d ._. x . g . h . i . k . l -c1al. a . b . c . d _. x . g . h . i . k . l -c1Al. a . b . c . d _x . g . h . i . k . l -c1I. a . b . c . d . e . _ . g . h . i . k . l -c1i. a . b . c . d . e ._. g . h . i . k . l -c1a. a . b . c . d . e _. g . h . i . k . l -c1A. a . b . c . d . e _g . h . i . k . l -c1In. a . b . c . d . e . x . _ . h . i . k . l -c1in. a . b . c . d . e . x ._. h . i . k . l -c1an. a . b . c . d . e . x _. h . i . k . l -c1An. a . b . c . d . e . x _h . i . k . l -c1IN. a . b . c . d . e . x . g . _ . i . k . l -c1iN. a . b . c . d . e . x . g ._. i . k . l -c1aN. a . b . c . d . e . x . g _. i . k . l -c1AN. a . b . c . d . e . x . g _i . k . l -c2IL. a . _ . c . d . e . x . g . h . i . k . l -c2iL. a ._. c . d . e . x . g . h . i . k . l -c2aL. a _. c . d . e . x . g . h . i . k . l -c2AL. a _c . d . e . x . g . h . i . k . l -c2Il. a . b . c . _ . e . x . g . h . i . k . l -c2il. a . b . c ._. e . x . g . h . i . k . l -c2al. a . b . c _. e . x . g . h . i . k . l -c2Al. a . b . c _e . x . g . h . i . k . l -c2I. a . b . c . d . e . _ . g . h . i . k . l -c2i. a . b . c . d . e ._. g . h . i . k . l -c2a. a . b . c . d . e _. g . h . i . k . l -c2A. a . b . c . d . e _g . h . i . k . l -c2In. a . b . c . d . e . x . g . _ . i . k . l -c2in. a . b . c . d . e . x . g ._. i . k . l -c2an. a . b . c . d . e . x . g _. i . k . l -c2An. a . b . c . d . e . x . g _i . k . l -c2IN. a . b . c . d . e . x . g . h . i . _ . l -c2iN. a . b . c . d . e . x . g . h . i ._. l -c2aN. a . b . c . d . e . x . g . h . i _. l -c2AN. a . b . c . d . e . x . g . h . i _l -dIL. a . b . c . . e . x . g . h . i . k . l -diL. a . b . c .. e . x . g . h . i . k . l -daL. a . b . c . e . x . g . h . i . k . l -dAL. a . b . c e . x . g . h . i . k . l -dIl. a . b . c . d . . x . g . h . i . k . l -dil. a . b . c . d .. x . g . h . i . k . l -dal. a . b . c . d . x . g . h . i . k . l -dAl. a . b . c . d x . g . h . i . k . l -dI. a . b . c . d . e . . g . h . i . k . l -di. a . b . c . d . e .. g . h . i . k . l -da. a . b . c . d . e . g . h . i . k . l -dA. a . b . c . d . e g . h . i . k . l -dIn. a . b . c . d . e . x . . h . i . k . l -din. a . b . c . d . e . x .. h . i . k . l -dan. a . b . c . d . e . x . h . i . k . l -dAn. a . b . c . d . e . x h . i . k . l -dIN. a . b . c . d . e . x . g . . i . k . l -diN. a . b . c . d . e . x . g .. i . k . l -daN. a . b . c . d . e . x . g . i . k . l -dAN. a . b . c . d . e . x . g i . k . l -d1IL. a . b . c . . e . x . g . h . i . k . l -d1iL. a . b . c .. e . x . g . h . i . k . l -d1aL. a . b . c . e . x . g . h . i . k . l -d1AL. a . b . c e . x . g . h . i . k . l -d1Il. a . b . c . d . . x . g . h . i . k . l -d1il. a . b . c . d .. x . g . h . i . k . l -d1al. a . b . c . d . x . g . h . i . k . l -d1Al. a . b . c . d x . g . h . i . k . l -d1I. a . b . c . d . e . . g . h . i . k . l -d1i. a . b . c . d . e .. g . h . i . k . l -d1a. a . b . c . d . e . g . h . i . k . l -d1A. a . b . c . d . e g . h . i . k . l -d1In. a . b . c . d . e . x . . h . i . k . l -d1in. a . b . c . d . e . x .. h . i . k . l -d1an. a . b . c . d . e . x . h . i . k . l -d1An. a . b . c . d . e . x h . i . k . l -d1IN. a . b . c . d . e . x . g . . i . k . l -d1iN. a . b . c . d . e . x . g .. i . k . l -d1aN. a . b . c . d . e . x . g . i . k . l -d1AN. a . b . c . d . e . x . g i . k . l -d2IL. a . . c . d . e . x . g . h . i . k . l -d2iL. a .. c . d . e . x . g . h . i . k . l -d2aL. a . c . d . e . x . g . h . i . k . l -d2AL. a c . d . e . x . g . h . i . k . l -d2Il. a . b . c . . e . x . g . h . i . k . l -d2il. a . b . c .. e . x . g . h . i . k . l -d2al. a . b . c . e . x . g . h . i . k . l -d2Al. a . b . c e . x . g . h . i . k . l -d2I. a . b . c . d . e . . g . h . i . k . l -d2i. a . b . c . d . e .. g . h . i . k . l -d2a. a . b . c . d . e . g . h . i . k . l -d2A. a . b . c . d . e g . h . i . k . l -d2In. a . b . c . d . e . x . g . . i . k . l -d2in. a . b . c . d . e . x . g .. i . k . l -d2an. a . b . c . d . e . x . g . i . k . l -d2An. a . b . c . d . e . x . g i . k . l -d2IN. a . b . c . d . e . x . g . h . i . . l -d2iN. a . b . c . d . e . x . g . h . i .. l -d2aN. a . b . c . d . e . x . g . h . i . l -d2AN. a . b . c . d . e . x . g . h . i l -yIL. a . b . c . d . e . x . g . h . i . k . l 'd' -yiL. a . b . c . d . e . x . g . h . i . k . l ' d ' -yaL. a . b . c . d . e . x . g . h . i . k . l '. d ' -yAL. a . b . c . d . e . x . g . h . i . k . l '. d . ' -yIl. a . b . c . d . e . x . g . h . i . k . l 'e' -yil. a . b . c . d . e . x . g . h . i . k . l ' e ' -yal. a . b . c . d . e . x . g . h . i . k . l '. e ' -yAl. a . b . c . d . e . x . g . h . i . k . l '. e . ' -yI. a . b . c . d . e . x . g . h . i . k . l 'x' -yi. a . b . c . d . e . x . g . h . i . k . l ' x ' -ya. a . b . c . d . e . x . g . h . i . k . l '. x ' -yA. a . b . c . d . e . x . g . h . i . k . l '. x . ' -yIn. a . b . c . d . e . x . g . h . i . k . l 'g' -yin. a . b . c . d . e . x . g . h . i . k . l ' g ' -yan. a . b . c . d . e . x . g . h . i . k . l '. g ' -yAn. a . b . c . d . e . x . g . h . i . k . l '. g . ' -yIN. a . b . c . d . e . x . g . h . i . k . l 'h' -yiN. a . b . c . d . e . x . g . h . i . k . l ' h ' -yaN. a . b . c . d . e . x . g . h . i . k . l '. h ' -yAN. a . b . c . d . e . x . g . h . i . k . l '. h . ' -y1IL. a . b . c . d . e . x . g . h . i . k . l 'd' -y1iL. a . b . c . d . e . x . g . h . i . k . l ' d ' -y1aL. a . b . c . d . e . x . g . h . i . k . l '. d ' -y1AL. a . b . c . d . e . x . g . h . i . k . l '. d . ' -y1Il. a . b . c . d . e . x . g . h . i . k . l 'e' -y1il. a . b . c . d . e . x . g . h . i . k . l ' e ' -y1al. a . b . c . d . e . x . g . h . i . k . l '. e ' -y1Al. a . b . c . d . e . x . g . h . i . k . l '. e . ' -y1I. a . b . c . d . e . x . g . h . i . k . l 'x' -y1i. a . b . c . d . e . x . g . h . i . k . l ' x ' -y1a. a . b . c . d . e . x . g . h . i . k . l '. x ' -y1A. a . b . c . d . e . x . g . h . i . k . l '. x . ' -y1In. a . b . c . d . e . x . g . h . i . k . l 'g' -y1in. a . b . c . d . e . x . g . h . i . k . l ' g ' -y1an. a . b . c . d . e . x . g . h . i . k . l '. g ' -y1An. a . b . c . d . e . x . g . h . i . k . l '. g . ' -y1IN. a . b . c . d . e . x . g . h . i . k . l 'h' -y1iN. a . b . c . d . e . x . g . h . i . k . l ' h ' -y1aN. a . b . c . d . e . x . g . h . i . k . l '. h ' -y1AN. a . b . c . d . e . x . g . h . i . k . l '. h . ' -y2IL. a . b . c . d . e . x . g . h . i . k . l 'b' -y2iL. a . b . c . d . e . x . g . h . i . k . l ' b ' -y2aL. a . b . c . d . e . x . g . h . i . k . l '. b ' -y2AL. a . b . c . d . e . x . g . h . i . k . l '. b . ' -y2Il. a . b . c . d . e . x . g . h . i . k . l 'd' -y2il. a . b . c . d . e . x . g . h . i . k . l ' d ' -y2al. a . b . c . d . e . x . g . h . i . k . l '. d ' -y2Al. a . b . c . d . e . x . g . h . i . k . l '. d . ' -y2I. a . b . c . d . e . x . g . h . i . k . l 'x' -y2i. a . b . c . d . e . x . g . h . i . k . l ' x ' -y2a. a . b . c . d . e . x . g . h . i . k . l '. x ' -y2A. a . b . c . d . e . x . g . h . i . k . l '. x . ' -y2In. a . b . c . d . e . x . g . h . i . k . l 'h' -y2in. a . b . c . d . e . x . g . h . i . k . l ' h ' -y2an. a . b . c . d . e . x . g . h . i . k . l '. h ' -y2An. a . b . c . d . e . x . g . h . i . k . l '. h . ' -y2IN. a . b . c . d . e . x . g . h . i . k . l 'k' -y2iN. a . b . c . d . e . x . g . h . i . k . l ' k ' -y2aN. a . b . c . d . e . x . g . h . i . k . l '. k ' -y2AN. a . b . c . d . e . x . g . h . i . k . l '. k . ' -vIL. a . b . c . _ . e . x . g . h . i . k . l -viL. a . b . c .___. e . x . g . h . i . k . l -vaL. a . b . c ____. e . x . g . h . i . k . l -vAL. a . b . c ______e . x . g . h . i . k . l -vIl. a . b . c . d . _ . x . g . h . i . k . l -vil. a . b . c . d .___. x . g . h . i . k . l -val. a . b . c . d ____. x . g . h . i . k . l -vAl. a . b . c . d ______x . g . h . i . k . l -vI. a . b . c . d . e . _ . g . h . i . k . l -vi. a . b . c . d . e .___. g . h . i . k . l -va. a . b . c . d . e ____. g . h . i . k . l -vA. a . b . c . d . e ______g . h . i . k . l -vIn. a . b . c . d . e . x . _ . h . i . k . l -vin. a . b . c . d . e . x .___. h . i . k . l -van. a . b . c . d . e . x ____. h . i . k . l -vAn. a . b . c . d . e . x ______h . i . k . l -vIN. a . b . c . d . e . x . g . _ . i . k . l -viN. a . b . c . d . e . x . g .___. i . k . l -vaN. a . b . c . d . e . x . g ____. i . k . l -vAN. a . b . c . d . e . x . g ______i . k . l -v1IL. a . b . c . _ . e . x . g . h . i . k . l -v1iL. a . b . c .___. e . x . g . h . i . k . l -v1aL. a . b . c ____. e . x . g . h . i . k . l -v1AL. a . b . c ______e . x . g . h . i . k . l -v1Il. a . b . c . d . _ . x . g . h . i . k . l -v1il. a . b . c . d .___. x . g . h . i . k . l -v1al. a . b . c . d ____. x . g . h . i . k . l -v1Al. a . b . c . d ______x . g . h . i . k . l -v1I. a . b . c . d . e . _ . g . h . i . k . l -v1i. a . b . c . d . e .___. g . h . i . k . l -v1a. a . b . c . d . e ____. g . h . i . k . l -v1A. a . b . c . d . e ______g . h . i . k . l -v1In. a . b . c . d . e . x . _ . h . i . k . l -v1in. a . b . c . d . e . x .___. h . i . k . l -v1an. a . b . c . d . e . x ____. h . i . k . l -v1An. a . b . c . d . e . x ______h . i . k . l -v1IN. a . b . c . d . e . x . g . _ . i . k . l -v1iN. a . b . c . d . e . x . g .___. i . k . l -v1aN. a . b . c . d . e . x . g ____. i . k . l -v1AN. a . b . c . d . e . x . g ______i . k . l -v2IL. a . _ . c . d . e . x . g . h . i . k . l -v2iL. a .___. c . d . e . x . g . h . i . k . l -v2aL. a ____. c . d . e . x . g . h . i . k . l -v2AL. a ______c . d . e . x . g . h . i . k . l -v2Il. a . b . c . _ . e . x . g . h . i . k . l -v2il. a . b . c .___. e . x . g . h . i . k . l -v2al. a . b . c ____. e . x . g . h . i . k . l -v2Al. a . b . c ______e . x . g . h . i . k . l -v2I. a . b . c . d . e . _ . g . h . i . k . l -v2i. a . b . c . d . e .___. g . h . i . k . l -v2a. a . b . c . d . e ____. g . h . i . k . l -v2A. a . b . c . d . e ______g . h . i . k . l -v2In. a . b . c . d . e . x . g . _ . i . k . l -v2in. a . b . c . d . e . x . g .___. i . k . l -v2an. a . b . c . d . e . x . g ____. i . k . l -v2An. a . b . c . d . e . x . g ______i . k . l -v2IN. a . b . c . d . e . x . g . h . i . _ . l -v2iN. a . b . c . d . e . x . g . h . i .___. l -v2aN. a . b . c . d . e . x . g . h . i ____. l -v2AN. a . b . c . d . e . x . g . h . i ______l -a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l -cIL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -ciL; a ; b ; c ;_; e ; x ; g ; h ; i ; k ; l -caL; a ; b ; c _; e ; x ; g ; h ; i ; k ; l -cAL; a ; b ; c _e ; x ; g ; h ; i ; k ; l -cIl; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -cil; a ; b ; c ; d ;_; x ; g ; h ; i ; k ; l -cal; a ; b ; c ; d _; x ; g ; h ; i ; k ; l -cAl; a ; b ; c ; d _x ; g ; h ; i ; k ; l -cI; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -ci; a ; b ; c ; d ; e ;_; g ; h ; i ; k ; l -ca; a ; b ; c ; d ; e _; g ; h ; i ; k ; l -cA; a ; b ; c ; d ; e _g ; h ; i ; k ; l -cIn; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -cin; a ; b ; c ; d ; e ; x ;_; h ; i ; k ; l -can; a ; b ; c ; d ; e ; x _; h ; i ; k ; l -cAn; a ; b ; c ; d ; e ; x _h ; i ; k ; l -cIN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -ciN; a ; b ; c ; d ; e ; x ; g ;_; i ; k ; l -caN; a ; b ; c ; d ; e ; x ; g _; i ; k ; l -cAN; a ; b ; c ; d ; e ; x ; g _i ; k ; l -c1IL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -c1iL; a ; b ; c ;_; e ; x ; g ; h ; i ; k ; l -c1aL; a ; b ; c _; e ; x ; g ; h ; i ; k ; l -c1AL; a ; b ; c _e ; x ; g ; h ; i ; k ; l -c1Il; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -c1il; a ; b ; c ; d ;_; x ; g ; h ; i ; k ; l -c1al; a ; b ; c ; d _; x ; g ; h ; i ; k ; l -c1Al; a ; b ; c ; d _x ; g ; h ; i ; k ; l -c1I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -c1i; a ; b ; c ; d ; e ;_; g ; h ; i ; k ; l -c1a; a ; b ; c ; d ; e _; g ; h ; i ; k ; l -c1A; a ; b ; c ; d ; e _g ; h ; i ; k ; l -c1In; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -c1in; a ; b ; c ; d ; e ; x ;_; h ; i ; k ; l -c1an; a ; b ; c ; d ; e ; x _; h ; i ; k ; l -c1An; a ; b ; c ; d ; e ; x _h ; i ; k ; l -c1IN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -c1iN; a ; b ; c ; d ; e ; x ; g ;_; i ; k ; l -c1aN; a ; b ; c ; d ; e ; x ; g _; i ; k ; l -c1AN; a ; b ; c ; d ; e ; x ; g _i ; k ; l -c2IL; a ; _ ; c ; d ; e ; x ; g ; h ; i ; k ; l -c2iL; a ;_; c ; d ; e ; x ; g ; h ; i ; k ; l -c2aL; a _; c ; d ; e ; x ; g ; h ; i ; k ; l -c2AL; a _c ; d ; e ; x ; g ; h ; i ; k ; l -c2Il; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -c2il; a ; b ; c ;_; e ; x ; g ; h ; i ; k ; l -c2al; a ; b ; c _; e ; x ; g ; h ; i ; k ; l -c2Al; a ; b ; c _e ; x ; g ; h ; i ; k ; l -c2I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -c2i; a ; b ; c ; d ; e ;_; g ; h ; i ; k ; l -c2a; a ; b ; c ; d ; e _; g ; h ; i ; k ; l -c2A; a ; b ; c ; d ; e _g ; h ; i ; k ; l -c2In; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -c2in; a ; b ; c ; d ; e ; x ; g ;_; i ; k ; l -c2an; a ; b ; c ; d ; e ; x ; g _; i ; k ; l -c2An; a ; b ; c ; d ; e ; x ; g _i ; k ; l -c2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; _ ; l -c2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ;_; l -c2aN; a ; b ; c ; d ; e ; x ; g ; h ; i _; l -c2AN; a ; b ; c ; d ; e ; x ; g ; h ; i _l -dIL; a ; b ; c ; ; e ; x ; g ; h ; i ; k ; l -diL; a ; b ; c ;; e ; x ; g ; h ; i ; k ; l -daL; a ; b ; c ; e ; x ; g ; h ; i ; k ; l -dAL; a ; b ; c e ; x ; g ; h ; i ; k ; l -dIl; a ; b ; c ; d ; ; x ; g ; h ; i ; k ; l -dil; a ; b ; c ; d ;; x ; g ; h ; i ; k ; l -dal; a ; b ; c ; d ; x ; g ; h ; i ; k ; l -dAl; a ; b ; c ; d x ; g ; h ; i ; k ; l -dI; a ; b ; c ; d ; e ; ; g ; h ; i ; k ; l -di; a ; b ; c ; d ; e ;; g ; h ; i ; k ; l -da; a ; b ; c ; d ; e ; g ; h ; i ; k ; l -dA; a ; b ; c ; d ; e g ; h ; i ; k ; l -dIn; a ; b ; c ; d ; e ; x ; ; h ; i ; k ; l -din; a ; b ; c ; d ; e ; x ;; h ; i ; k ; l -dan; a ; b ; c ; d ; e ; x ; h ; i ; k ; l -dAn; a ; b ; c ; d ; e ; x h ; i ; k ; l -dIN; a ; b ; c ; d ; e ; x ; g ; ; i ; k ; l -diN; a ; b ; c ; d ; e ; x ; g ;; i ; k ; l -daN; a ; b ; c ; d ; e ; x ; g ; i ; k ; l -dAN; a ; b ; c ; d ; e ; x ; g i ; k ; l -d1IL; a ; b ; c ; ; e ; x ; g ; h ; i ; k ; l -d1iL; a ; b ; c ;; e ; x ; g ; h ; i ; k ; l -d1aL; a ; b ; c ; e ; x ; g ; h ; i ; k ; l -d1AL; a ; b ; c e ; x ; g ; h ; i ; k ; l -d1Il; a ; b ; c ; d ; ; x ; g ; h ; i ; k ; l -d1il; a ; b ; c ; d ;; x ; g ; h ; i ; k ; l -d1al; a ; b ; c ; d ; x ; g ; h ; i ; k ; l -d1Al; a ; b ; c ; d x ; g ; h ; i ; k ; l -d1I; a ; b ; c ; d ; e ; ; g ; h ; i ; k ; l -d1i; a ; b ; c ; d ; e ;; g ; h ; i ; k ; l -d1a; a ; b ; c ; d ; e ; g ; h ; i ; k ; l -d1A; a ; b ; c ; d ; e g ; h ; i ; k ; l -d1In; a ; b ; c ; d ; e ; x ; ; h ; i ; k ; l -d1in; a ; b ; c ; d ; e ; x ;; h ; i ; k ; l -d1an; a ; b ; c ; d ; e ; x ; h ; i ; k ; l -d1An; a ; b ; c ; d ; e ; x h ; i ; k ; l -d1IN; a ; b ; c ; d ; e ; x ; g ; ; i ; k ; l -d1iN; a ; b ; c ; d ; e ; x ; g ;; i ; k ; l -d1aN; a ; b ; c ; d ; e ; x ; g ; i ; k ; l -d1AN; a ; b ; c ; d ; e ; x ; g i ; k ; l -d2IL; a ; ; c ; d ; e ; x ; g ; h ; i ; k ; l -d2iL; a ;; c ; d ; e ; x ; g ; h ; i ; k ; l -d2aL; a ; c ; d ; e ; x ; g ; h ; i ; k ; l -d2AL; a c ; d ; e ; x ; g ; h ; i ; k ; l -d2Il; a ; b ; c ; ; e ; x ; g ; h ; i ; k ; l -d2il; a ; b ; c ;; e ; x ; g ; h ; i ; k ; l -d2al; a ; b ; c ; e ; x ; g ; h ; i ; k ; l -d2Al; a ; b ; c e ; x ; g ; h ; i ; k ; l -d2I; a ; b ; c ; d ; e ; ; g ; h ; i ; k ; l -d2i; a ; b ; c ; d ; e ;; g ; h ; i ; k ; l -d2a; a ; b ; c ; d ; e ; g ; h ; i ; k ; l -d2A; a ; b ; c ; d ; e g ; h ; i ; k ; l -d2In; a ; b ; c ; d ; e ; x ; g ; ; i ; k ; l -d2in; a ; b ; c ; d ; e ; x ; g ;; i ; k ; l -d2an; a ; b ; c ; d ; e ; x ; g ; i ; k ; l -d2An; a ; b ; c ; d ; e ; x ; g i ; k ; l -d2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; ; l -d2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ;; l -d2aN; a ; b ; c ; d ; e ; x ; g ; h ; i ; l -d2AN; a ; b ; c ; d ; e ; x ; g ; h ; i l -yIL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'd' -yiL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' d ' -yaL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ' -yAL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ; ' -yIl; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'e' -yil; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' e ' -yal; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ' -yAl; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ; ' -yI; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'x' -yi; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' x ' -ya; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ' -yA; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ; ' -yIn; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'g' -yin; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' g ' -yan; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ' -yAn; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ; ' -yIN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'h' -yiN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' h ' -yaN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ' -yAN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ; ' -y1IL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'd' -y1iL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' d ' -y1aL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ' -y1AL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ; ' -y1Il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'e' -y1il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' e ' -y1al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ' -y1Al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; e ; ' -y1I; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'x' -y1i; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' x ' -y1a; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ' -y1A; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ; ' -y1In; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'g' -y1in; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' g ' -y1an; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ' -y1An; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; g ; ' -y1IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'h' -y1iN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' h ' -y1aN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ' -y1AN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ; ' -y2IL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'b' -y2iL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' b ' -y2aL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; b ' -y2AL; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; b ; ' -y2Il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'd' -y2il; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' d ' -y2al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ' -y2Al; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; d ; ' -y2I; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'x' -y2i; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' x ' -y2a; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ' -y2A; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; x ; ' -y2In; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'h' -y2in; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' h ' -y2an; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ' -y2An; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; h ; ' -y2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l 'k' -y2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l ' k ' -y2aN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; k ' -y2AN; a ; b ; c ; d ; e ; x ; g ; h ; i ; k ; l '; k ; ' -vIL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -viL; a ; b ; c ;___; e ; x ; g ; h ; i ; k ; l -vaL; a ; b ; c ____; e ; x ; g ; h ; i ; k ; l -vAL; a ; b ; c ______e ; x ; g ; h ; i ; k ; l -vIl; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -vil; a ; b ; c ; d ;___; x ; g ; h ; i ; k ; l -val; a ; b ; c ; d ____; x ; g ; h ; i ; k ; l -vAl; a ; b ; c ; d ______x ; g ; h ; i ; k ; l -vI; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -vi; a ; b ; c ; d ; e ;___; g ; h ; i ; k ; l -va; a ; b ; c ; d ; e ____; g ; h ; i ; k ; l -vA; a ; b ; c ; d ; e ______g ; h ; i ; k ; l -vIn; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -vin; a ; b ; c ; d ; e ; x ;___; h ; i ; k ; l -van; a ; b ; c ; d ; e ; x ____; h ; i ; k ; l -vAn; a ; b ; c ; d ; e ; x ______h ; i ; k ; l -vIN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -viN; a ; b ; c ; d ; e ; x ; g ;___; i ; k ; l -vaN; a ; b ; c ; d ; e ; x ; g ____; i ; k ; l -vAN; a ; b ; c ; d ; e ; x ; g ______i ; k ; l -v1IL; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -v1iL; a ; b ; c ;___; e ; x ; g ; h ; i ; k ; l -v1aL; a ; b ; c ____; e ; x ; g ; h ; i ; k ; l -v1AL; a ; b ; c ______e ; x ; g ; h ; i ; k ; l -v1Il; a ; b ; c ; d ; _ ; x ; g ; h ; i ; k ; l -v1il; a ; b ; c ; d ;___; x ; g ; h ; i ; k ; l -v1al; a ; b ; c ; d ____; x ; g ; h ; i ; k ; l -v1Al; a ; b ; c ; d ______x ; g ; h ; i ; k ; l -v1I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -v1i; a ; b ; c ; d ; e ;___; g ; h ; i ; k ; l -v1a; a ; b ; c ; d ; e ____; g ; h ; i ; k ; l -v1A; a ; b ; c ; d ; e ______g ; h ; i ; k ; l -v1In; a ; b ; c ; d ; e ; x ; _ ; h ; i ; k ; l -v1in; a ; b ; c ; d ; e ; x ;___; h ; i ; k ; l -v1an; a ; b ; c ; d ; e ; x ____; h ; i ; k ; l -v1An; a ; b ; c ; d ; e ; x ______h ; i ; k ; l -v1IN; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -v1iN; a ; b ; c ; d ; e ; x ; g ;___; i ; k ; l -v1aN; a ; b ; c ; d ; e ; x ; g ____; i ; k ; l -v1AN; a ; b ; c ; d ; e ; x ; g ______i ; k ; l -v2IL; a ; _ ; c ; d ; e ; x ; g ; h ; i ; k ; l -v2iL; a ;___; c ; d ; e ; x ; g ; h ; i ; k ; l -v2aL; a ____; c ; d ; e ; x ; g ; h ; i ; k ; l -v2AL; a ______c ; d ; e ; x ; g ; h ; i ; k ; l -v2Il; a ; b ; c ; _ ; e ; x ; g ; h ; i ; k ; l -v2il; a ; b ; c ;___; e ; x ; g ; h ; i ; k ; l -v2al; a ; b ; c ____; e ; x ; g ; h ; i ; k ; l -v2Al; a ; b ; c ______e ; x ; g ; h ; i ; k ; l -v2I; a ; b ; c ; d ; e ; _ ; g ; h ; i ; k ; l -v2i; a ; b ; c ; d ; e ;___; g ; h ; i ; k ; l -v2a; a ; b ; c ; d ; e ____; g ; h ; i ; k ; l -v2A; a ; b ; c ; d ; e ______g ; h ; i ; k ; l -v2In; a ; b ; c ; d ; e ; x ; g ; _ ; i ; k ; l -v2in; a ; b ; c ; d ; e ; x ; g ;___; i ; k ; l -v2an; a ; b ; c ; d ; e ; x ; g ____; i ; k ; l -v2An; a ; b ; c ; d ; e ; x ; g ______i ; k ; l -v2IN; a ; b ; c ; d ; e ; x ; g ; h ; i ; _ ; l -v2iN; a ; b ; c ; d ; e ; x ; g ; h ; i ;___; l -v2aN; a ; b ; c ; d ; e ; x ; g ; h ; i ____; l -v2AN; a ; b ; c ; d ; e ; x ; g ; h ; i ______l -a : b : c : d : e : x : g : h : i : k : l -cIL: a : b : c : _ : e : x : g : h : i : k : l -ciL: a : b : c :_: e : x : g : h : i : k : l -caL: a : b : c _: e : x : g : h : i : k : l -cAL: a : b : c _e : x : g : h : i : k : l -cIl: a : b : c : d : _ : x : g : h : i : k : l -cil: a : b : c : d :_: x : g : h : i : k : l -cal: a : b : c : d _: x : g : h : i : k : l -cAl: a : b : c : d _x : g : h : i : k : l -cI: a : b : c : d : e : _ : g : h : i : k : l -ci: a : b : c : d : e :_: g : h : i : k : l -ca: a : b : c : d : e _: g : h : i : k : l -cA: a : b : c : d : e _g : h : i : k : l -cIn: a : b : c : d : e : x : _ : h : i : k : l -cin: a : b : c : d : e : x :_: h : i : k : l -can: a : b : c : d : e : x _: h : i : k : l -cAn: a : b : c : d : e : x _h : i : k : l -cIN: a : b : c : d : e : x : g : _ : i : k : l -ciN: a : b : c : d : e : x : g :_: i : k : l -caN: a : b : c : d : e : x : g _: i : k : l -cAN: a : b : c : d : e : x : g _i : k : l -c1IL: a : b : c : _ : e : x : g : h : i : k : l -c1iL: a : b : c :_: e : x : g : h : i : k : l -c1aL: a : b : c _: e : x : g : h : i : k : l -c1AL: a : b : c _e : x : g : h : i : k : l -c1Il: a : b : c : d : _ : x : g : h : i : k : l -c1il: a : b : c : d :_: x : g : h : i : k : l -c1al: a : b : c : d _: x : g : h : i : k : l -c1Al: a : b : c : d _x : g : h : i : k : l -c1I: a : b : c : d : e : _ : g : h : i : k : l -c1i: a : b : c : d : e :_: g : h : i : k : l -c1a: a : b : c : d : e _: g : h : i : k : l -c1A: a : b : c : d : e _g : h : i : k : l -c1In: a : b : c : d : e : x : _ : h : i : k : l -c1in: a : b : c : d : e : x :_: h : i : k : l -c1an: a : b : c : d : e : x _: h : i : k : l -c1An: a : b : c : d : e : x _h : i : k : l -c1IN: a : b : c : d : e : x : g : _ : i : k : l -c1iN: a : b : c : d : e : x : g :_: i : k : l -c1aN: a : b : c : d : e : x : g _: i : k : l -c1AN: a : b : c : d : e : x : g _i : k : l -c2IL: a : _ : c : d : e : x : g : h : i : k : l -c2iL: a :_: c : d : e : x : g : h : i : k : l -c2aL: a _: c : d : e : x : g : h : i : k : l -c2AL: a _c : d : e : x : g : h : i : k : l -c2Il: a : b : c : _ : e : x : g : h : i : k : l -c2il: a : b : c :_: e : x : g : h : i : k : l -c2al: a : b : c _: e : x : g : h : i : k : l -c2Al: a : b : c _e : x : g : h : i : k : l -c2I: a : b : c : d : e : _ : g : h : i : k : l -c2i: a : b : c : d : e :_: g : h : i : k : l -c2a: a : b : c : d : e _: g : h : i : k : l -c2A: a : b : c : d : e _g : h : i : k : l -c2In: a : b : c : d : e : x : g : _ : i : k : l -c2in: a : b : c : d : e : x : g :_: i : k : l -c2an: a : b : c : d : e : x : g _: i : k : l -c2An: a : b : c : d : e : x : g _i : k : l -c2IN: a : b : c : d : e : x : g : h : i : _ : l -c2iN: a : b : c : d : e : x : g : h : i :_: l -c2aN: a : b : c : d : e : x : g : h : i _: l -c2AN: a : b : c : d : e : x : g : h : i _l -dIL: a : b : c : : e : x : g : h : i : k : l -diL: a : b : c :: e : x : g : h : i : k : l -daL: a : b : c : e : x : g : h : i : k : l -dAL: a : b : c e : x : g : h : i : k : l -dIl: a : b : c : d : : x : g : h : i : k : l -dil: a : b : c : d :: x : g : h : i : k : l -dal: a : b : c : d : x : g : h : i : k : l -dAl: a : b : c : d x : g : h : i : k : l -dI: a : b : c : d : e : : g : h : i : k : l -di: a : b : c : d : e :: g : h : i : k : l -da: a : b : c : d : e : g : h : i : k : l -dA: a : b : c : d : e g : h : i : k : l -dIn: a : b : c : d : e : x : : h : i : k : l -din: a : b : c : d : e : x :: h : i : k : l -dan: a : b : c : d : e : x : h : i : k : l -dAn: a : b : c : d : e : x h : i : k : l -dIN: a : b : c : d : e : x : g : : i : k : l -diN: a : b : c : d : e : x : g :: i : k : l -daN: a : b : c : d : e : x : g : i : k : l -dAN: a : b : c : d : e : x : g i : k : l -d1IL: a : b : c : : e : x : g : h : i : k : l -d1iL: a : b : c :: e : x : g : h : i : k : l -d1aL: a : b : c : e : x : g : h : i : k : l -d1AL: a : b : c e : x : g : h : i : k : l -d1Il: a : b : c : d : : x : g : h : i : k : l -d1il: a : b : c : d :: x : g : h : i : k : l -d1al: a : b : c : d : x : g : h : i : k : l -d1Al: a : b : c : d x : g : h : i : k : l -d1I: a : b : c : d : e : : g : h : i : k : l -d1i: a : b : c : d : e :: g : h : i : k : l -d1a: a : b : c : d : e : g : h : i : k : l -d1A: a : b : c : d : e g : h : i : k : l -d1In: a : b : c : d : e : x : : h : i : k : l -d1in: a : b : c : d : e : x :: h : i : k : l -d1an: a : b : c : d : e : x : h : i : k : l -d1An: a : b : c : d : e : x h : i : k : l -d1IN: a : b : c : d : e : x : g : : i : k : l -d1iN: a : b : c : d : e : x : g :: i : k : l -d1aN: a : b : c : d : e : x : g : i : k : l -d1AN: a : b : c : d : e : x : g i : k : l -d2IL: a : : c : d : e : x : g : h : i : k : l -d2iL: a :: c : d : e : x : g : h : i : k : l -d2aL: a : c : d : e : x : g : h : i : k : l -d2AL: a c : d : e : x : g : h : i : k : l -d2Il: a : b : c : : e : x : g : h : i : k : l -d2il: a : b : c :: e : x : g : h : i : k : l -d2al: a : b : c : e : x : g : h : i : k : l -d2Al: a : b : c e : x : g : h : i : k : l -d2I: a : b : c : d : e : : g : h : i : k : l -d2i: a : b : c : d : e :: g : h : i : k : l -d2a: a : b : c : d : e : g : h : i : k : l -d2A: a : b : c : d : e g : h : i : k : l -d2In: a : b : c : d : e : x : g : : i : k : l -d2in: a : b : c : d : e : x : g :: i : k : l -d2an: a : b : c : d : e : x : g : i : k : l -d2An: a : b : c : d : e : x : g i : k : l -d2IN: a : b : c : d : e : x : g : h : i : : l -d2iN: a : b : c : d : e : x : g : h : i :: l -d2aN: a : b : c : d : e : x : g : h : i : l -d2AN: a : b : c : d : e : x : g : h : i l -yIL: a : b : c : d : e : x : g : h : i : k : l 'd' -yiL: a : b : c : d : e : x : g : h : i : k : l ' d ' -yaL: a : b : c : d : e : x : g : h : i : k : l ': d ' -yAL: a : b : c : d : e : x : g : h : i : k : l ': d : ' -yIl: a : b : c : d : e : x : g : h : i : k : l 'e' -yil: a : b : c : d : e : x : g : h : i : k : l ' e ' -yal: a : b : c : d : e : x : g : h : i : k : l ': e ' -yAl: a : b : c : d : e : x : g : h : i : k : l ': e : ' -yI: a : b : c : d : e : x : g : h : i : k : l 'x' -yi: a : b : c : d : e : x : g : h : i : k : l ' x ' -ya: a : b : c : d : e : x : g : h : i : k : l ': x ' -yA: a : b : c : d : e : x : g : h : i : k : l ': x : ' -yIn: a : b : c : d : e : x : g : h : i : k : l 'g' -yin: a : b : c : d : e : x : g : h : i : k : l ' g ' -yan: a : b : c : d : e : x : g : h : i : k : l ': g ' -yAn: a : b : c : d : e : x : g : h : i : k : l ': g : ' -yIN: a : b : c : d : e : x : g : h : i : k : l 'h' -yiN: a : b : c : d : e : x : g : h : i : k : l ' h ' -yaN: a : b : c : d : e : x : g : h : i : k : l ': h ' -yAN: a : b : c : d : e : x : g : h : i : k : l ': h : ' -y1IL: a : b : c : d : e : x : g : h : i : k : l 'd' -y1iL: a : b : c : d : e : x : g : h : i : k : l ' d ' -y1aL: a : b : c : d : e : x : g : h : i : k : l ': d ' -y1AL: a : b : c : d : e : x : g : h : i : k : l ': d : ' -y1Il: a : b : c : d : e : x : g : h : i : k : l 'e' -y1il: a : b : c : d : e : x : g : h : i : k : l ' e ' -y1al: a : b : c : d : e : x : g : h : i : k : l ': e ' -y1Al: a : b : c : d : e : x : g : h : i : k : l ': e : ' -y1I: a : b : c : d : e : x : g : h : i : k : l 'x' -y1i: a : b : c : d : e : x : g : h : i : k : l ' x ' -y1a: a : b : c : d : e : x : g : h : i : k : l ': x ' -y1A: a : b : c : d : e : x : g : h : i : k : l ': x : ' -y1In: a : b : c : d : e : x : g : h : i : k : l 'g' -y1in: a : b : c : d : e : x : g : h : i : k : l ' g ' -y1an: a : b : c : d : e : x : g : h : i : k : l ': g ' -y1An: a : b : c : d : e : x : g : h : i : k : l ': g : ' -y1IN: a : b : c : d : e : x : g : h : i : k : l 'h' -y1iN: a : b : c : d : e : x : g : h : i : k : l ' h ' -y1aN: a : b : c : d : e : x : g : h : i : k : l ': h ' -y1AN: a : b : c : d : e : x : g : h : i : k : l ': h : ' -y2IL: a : b : c : d : e : x : g : h : i : k : l 'b' -y2iL: a : b : c : d : e : x : g : h : i : k : l ' b ' -y2aL: a : b : c : d : e : x : g : h : i : k : l ': b ' -y2AL: a : b : c : d : e : x : g : h : i : k : l ': b : ' -y2Il: a : b : c : d : e : x : g : h : i : k : l 'd' -y2il: a : b : c : d : e : x : g : h : i : k : l ' d ' -y2al: a : b : c : d : e : x : g : h : i : k : l ': d ' -y2Al: a : b : c : d : e : x : g : h : i : k : l ': d : ' -y2I: a : b : c : d : e : x : g : h : i : k : l 'x' -y2i: a : b : c : d : e : x : g : h : i : k : l ' x ' -y2a: a : b : c : d : e : x : g : h : i : k : l ': x ' -y2A: a : b : c : d : e : x : g : h : i : k : l ': x : ' -y2In: a : b : c : d : e : x : g : h : i : k : l 'h' -y2in: a : b : c : d : e : x : g : h : i : k : l ' h ' -y2an: a : b : c : d : e : x : g : h : i : k : l ': h ' -y2An: a : b : c : d : e : x : g : h : i : k : l ': h : ' -y2IN: a : b : c : d : e : x : g : h : i : k : l 'k' -y2iN: a : b : c : d : e : x : g : h : i : k : l ' k ' -y2aN: a : b : c : d : e : x : g : h : i : k : l ': k ' -y2AN: a : b : c : d : e : x : g : h : i : k : l ': k : ' -vIL: a : b : c : _ : e : x : g : h : i : k : l -viL: a : b : c :___: e : x : g : h : i : k : l -vaL: a : b : c ____: e : x : g : h : i : k : l -vAL: a : b : c ______e : x : g : h : i : k : l -vIl: a : b : c : d : _ : x : g : h : i : k : l -vil: a : b : c : d :___: x : g : h : i : k : l -val: a : b : c : d ____: x : g : h : i : k : l -vAl: a : b : c : d ______x : g : h : i : k : l -vI: a : b : c : d : e : _ : g : h : i : k : l -vi: a : b : c : d : e :___: g : h : i : k : l -va: a : b : c : d : e ____: g : h : i : k : l -vA: a : b : c : d : e ______g : h : i : k : l -vIn: a : b : c : d : e : x : _ : h : i : k : l -vin: a : b : c : d : e : x :___: h : i : k : l -van: a : b : c : d : e : x ____: h : i : k : l -vAn: a : b : c : d : e : x ______h : i : k : l -vIN: a : b : c : d : e : x : g : _ : i : k : l -viN: a : b : c : d : e : x : g :___: i : k : l -vaN: a : b : c : d : e : x : g ____: i : k : l -vAN: a : b : c : d : e : x : g ______i : k : l -v1IL: a : b : c : _ : e : x : g : h : i : k : l -v1iL: a : b : c :___: e : x : g : h : i : k : l -v1aL: a : b : c ____: e : x : g : h : i : k : l -v1AL: a : b : c ______e : x : g : h : i : k : l -v1Il: a : b : c : d : _ : x : g : h : i : k : l -v1il: a : b : c : d :___: x : g : h : i : k : l -v1al: a : b : c : d ____: x : g : h : i : k : l -v1Al: a : b : c : d ______x : g : h : i : k : l -v1I: a : b : c : d : e : _ : g : h : i : k : l -v1i: a : b : c : d : e :___: g : h : i : k : l -v1a: a : b : c : d : e ____: g : h : i : k : l -v1A: a : b : c : d : e ______g : h : i : k : l -v1In: a : b : c : d : e : x : _ : h : i : k : l -v1in: a : b : c : d : e : x :___: h : i : k : l -v1an: a : b : c : d : e : x ____: h : i : k : l -v1An: a : b : c : d : e : x ______h : i : k : l -v1IN: a : b : c : d : e : x : g : _ : i : k : l -v1iN: a : b : c : d : e : x : g :___: i : k : l -v1aN: a : b : c : d : e : x : g ____: i : k : l -v1AN: a : b : c : d : e : x : g ______i : k : l -v2IL: a : _ : c : d : e : x : g : h : i : k : l -v2iL: a :___: c : d : e : x : g : h : i : k : l -v2aL: a ____: c : d : e : x : g : h : i : k : l -v2AL: a ______c : d : e : x : g : h : i : k : l -v2Il: a : b : c : _ : e : x : g : h : i : k : l -v2il: a : b : c :___: e : x : g : h : i : k : l -v2al: a : b : c ____: e : x : g : h : i : k : l -v2Al: a : b : c ______e : x : g : h : i : k : l -v2I: a : b : c : d : e : _ : g : h : i : k : l -v2i: a : b : c : d : e :___: g : h : i : k : l -v2a: a : b : c : d : e ____: g : h : i : k : l -v2A: a : b : c : d : e ______g : h : i : k : l -v2In: a : b : c : d : e : x : g : _ : i : k : l -v2in: a : b : c : d : e : x : g :___: i : k : l -v2an: a : b : c : d : e : x : g ____: i : k : l -v2An: a : b : c : d : e : x : g ______i : k : l -v2IN: a : b : c : d : e : x : g : h : i : _ : l -v2iN: a : b : c : d : e : x : g : h : i :___: l -v2aN: a : b : c : d : e : x : g : h : i ____: l -v2AN: a : b : c : d : e : x : g : h : i ______l -a + b + c + d + e + x + g + h + i + k + l -cIL+ a + b + c + _ + e + x + g + h + i + k + l -ciL+ a + b + c +_+ e + x + g + h + i + k + l -caL+ a + b + c _+ e + x + g + h + i + k + l -cAL+ a + b + c _e + x + g + h + i + k + l -cIl+ a + b + c + d + _ + x + g + h + i + k + l -cil+ a + b + c + d +_+ x + g + h + i + k + l -cal+ a + b + c + d _+ x + g + h + i + k + l -cAl+ a + b + c + d _x + g + h + i + k + l -cI+ a + b + c + d + e + _ + g + h + i + k + l -ci+ a + b + c + d + e +_+ g + h + i + k + l -ca+ a + b + c + d + e _+ g + h + i + k + l -cA+ a + b + c + d + e _g + h + i + k + l -cIn+ a + b + c + d + e + x + _ + h + i + k + l -cin+ a + b + c + d + e + x +_+ h + i + k + l -can+ a + b + c + d + e + x _+ h + i + k + l -cAn+ a + b + c + d + e + x _h + i + k + l -cIN+ a + b + c + d + e + x + g + _ + i + k + l -ciN+ a + b + c + d + e + x + g +_+ i + k + l -caN+ a + b + c + d + e + x + g _+ i + k + l -cAN+ a + b + c + d + e + x + g _i + k + l -c1IL+ a + b + c + _ + e + x + g + h + i + k + l -c1iL+ a + b + c +_+ e + x + g + h + i + k + l -c1aL+ a + b + c _+ e + x + g + h + i + k + l -c1AL+ a + b + c _e + x + g + h + i + k + l -c1Il+ a + b + c + d + _ + x + g + h + i + k + l -c1il+ a + b + c + d +_+ x + g + h + i + k + l -c1al+ a + b + c + d _+ x + g + h + i + k + l -c1Al+ a + b + c + d _x + g + h + i + k + l -c1I+ a + b + c + d + e + _ + g + h + i + k + l -c1i+ a + b + c + d + e +_+ g + h + i + k + l -c1a+ a + b + c + d + e _+ g + h + i + k + l -c1A+ a + b + c + d + e _g + h + i + k + l -c1In+ a + b + c + d + e + x + _ + h + i + k + l -c1in+ a + b + c + d + e + x +_+ h + i + k + l -c1an+ a + b + c + d + e + x _+ h + i + k + l -c1An+ a + b + c + d + e + x _h + i + k + l -c1IN+ a + b + c + d + e + x + g + _ + i + k + l -c1iN+ a + b + c + d + e + x + g +_+ i + k + l -c1aN+ a + b + c + d + e + x + g _+ i + k + l -c1AN+ a + b + c + d + e + x + g _i + k + l -c2IL+ a + _ + c + d + e + x + g + h + i + k + l -c2iL+ a +_+ c + d + e + x + g + h + i + k + l -c2aL+ a _+ c + d + e + x + g + h + i + k + l -c2AL+ a _c + d + e + x + g + h + i + k + l -c2Il+ a + b + c + _ + e + x + g + h + i + k + l -c2il+ a + b + c +_+ e + x + g + h + i + k + l -c2al+ a + b + c _+ e + x + g + h + i + k + l -c2Al+ a + b + c _e + x + g + h + i + k + l -c2I+ a + b + c + d + e + _ + g + h + i + k + l -c2i+ a + b + c + d + e +_+ g + h + i + k + l -c2a+ a + b + c + d + e _+ g + h + i + k + l -c2A+ a + b + c + d + e _g + h + i + k + l -c2In+ a + b + c + d + e + x + g + _ + i + k + l -c2in+ a + b + c + d + e + x + g +_+ i + k + l -c2an+ a + b + c + d + e + x + g _+ i + k + l -c2An+ a + b + c + d + e + x + g _i + k + l -c2IN+ a + b + c + d + e + x + g + h + i + _ + l -c2iN+ a + b + c + d + e + x + g + h + i +_+ l -c2aN+ a + b + c + d + e + x + g + h + i _+ l -c2AN+ a + b + c + d + e + x + g + h + i _l -dIL+ a + b + c + + e + x + g + h + i + k + l -diL+ a + b + c ++ e + x + g + h + i + k + l -daL+ a + b + c + e + x + g + h + i + k + l -dAL+ a + b + c e + x + g + h + i + k + l -dIl+ a + b + c + d + + x + g + h + i + k + l -dil+ a + b + c + d ++ x + g + h + i + k + l -dal+ a + b + c + d + x + g + h + i + k + l -dAl+ a + b + c + d x + g + h + i + k + l -dI+ a + b + c + d + e + + g + h + i + k + l -di+ a + b + c + d + e ++ g + h + i + k + l -da+ a + b + c + d + e + g + h + i + k + l -dA+ a + b + c + d + e g + h + i + k + l -dIn+ a + b + c + d + e + x + + h + i + k + l -din+ a + b + c + d + e + x ++ h + i + k + l -dan+ a + b + c + d + e + x + h + i + k + l -dAn+ a + b + c + d + e + x h + i + k + l -dIN+ a + b + c + d + e + x + g + + i + k + l -diN+ a + b + c + d + e + x + g ++ i + k + l -daN+ a + b + c + d + e + x + g + i + k + l -dAN+ a + b + c + d + e + x + g i + k + l -d1IL+ a + b + c + + e + x + g + h + i + k + l -d1iL+ a + b + c ++ e + x + g + h + i + k + l -d1aL+ a + b + c + e + x + g + h + i + k + l -d1AL+ a + b + c e + x + g + h + i + k + l -d1Il+ a + b + c + d + + x + g + h + i + k + l -d1il+ a + b + c + d ++ x + g + h + i + k + l -d1al+ a + b + c + d + x + g + h + i + k + l -d1Al+ a + b + c + d x + g + h + i + k + l -d1I+ a + b + c + d + e + + g + h + i + k + l -d1i+ a + b + c + d + e ++ g + h + i + k + l -d1a+ a + b + c + d + e + g + h + i + k + l -d1A+ a + b + c + d + e g + h + i + k + l -d1In+ a + b + c + d + e + x + + h + i + k + l -d1in+ a + b + c + d + e + x ++ h + i + k + l -d1an+ a + b + c + d + e + x + h + i + k + l -d1An+ a + b + c + d + e + x h + i + k + l -d1IN+ a + b + c + d + e + x + g + + i + k + l -d1iN+ a + b + c + d + e + x + g ++ i + k + l -d1aN+ a + b + c + d + e + x + g + i + k + l -d1AN+ a + b + c + d + e + x + g i + k + l -d2IL+ a + + c + d + e + x + g + h + i + k + l -d2iL+ a ++ c + d + e + x + g + h + i + k + l -d2aL+ a + c + d + e + x + g + h + i + k + l -d2AL+ a c + d + e + x + g + h + i + k + l -d2Il+ a + b + c + + e + x + g + h + i + k + l -d2il+ a + b + c ++ e + x + g + h + i + k + l -d2al+ a + b + c + e + x + g + h + i + k + l -d2Al+ a + b + c e + x + g + h + i + k + l -d2I+ a + b + c + d + e + + g + h + i + k + l -d2i+ a + b + c + d + e ++ g + h + i + k + l -d2a+ a + b + c + d + e + g + h + i + k + l -d2A+ a + b + c + d + e g + h + i + k + l -d2In+ a + b + c + d + e + x + g + + i + k + l -d2in+ a + b + c + d + e + x + g ++ i + k + l -d2an+ a + b + c + d + e + x + g + i + k + l -d2An+ a + b + c + d + e + x + g i + k + l -d2IN+ a + b + c + d + e + x + g + h + i + + l -d2iN+ a + b + c + d + e + x + g + h + i ++ l -d2aN+ a + b + c + d + e + x + g + h + i + l -d2AN+ a + b + c + d + e + x + g + h + i l -yIL+ a + b + c + d + e + x + g + h + i + k + l 'd' -yiL+ a + b + c + d + e + x + g + h + i + k + l ' d ' -yaL+ a + b + c + d + e + x + g + h + i + k + l '+ d ' -yAL+ a + b + c + d + e + x + g + h + i + k + l '+ d + ' -yIl+ a + b + c + d + e + x + g + h + i + k + l 'e' -yil+ a + b + c + d + e + x + g + h + i + k + l ' e ' -yal+ a + b + c + d + e + x + g + h + i + k + l '+ e ' -yAl+ a + b + c + d + e + x + g + h + i + k + l '+ e + ' -yI+ a + b + c + d + e + x + g + h + i + k + l 'x' -yi+ a + b + c + d + e + x + g + h + i + k + l ' x ' -ya+ a + b + c + d + e + x + g + h + i + k + l '+ x ' -yA+ a + b + c + d + e + x + g + h + i + k + l '+ x + ' -yIn+ a + b + c + d + e + x + g + h + i + k + l 'g' -yin+ a + b + c + d + e + x + g + h + i + k + l ' g ' -yan+ a + b + c + d + e + x + g + h + i + k + l '+ g ' -yAn+ a + b + c + d + e + x + g + h + i + k + l '+ g + ' -yIN+ a + b + c + d + e + x + g + h + i + k + l 'h' -yiN+ a + b + c + d + e + x + g + h + i + k + l ' h ' -yaN+ a + b + c + d + e + x + g + h + i + k + l '+ h ' -yAN+ a + b + c + d + e + x + g + h + i + k + l '+ h + ' -y1IL+ a + b + c + d + e + x + g + h + i + k + l 'd' -y1iL+ a + b + c + d + e + x + g + h + i + k + l ' d ' -y1aL+ a + b + c + d + e + x + g + h + i + k + l '+ d ' -y1AL+ a + b + c + d + e + x + g + h + i + k + l '+ d + ' -y1Il+ a + b + c + d + e + x + g + h + i + k + l 'e' -y1il+ a + b + c + d + e + x + g + h + i + k + l ' e ' -y1al+ a + b + c + d + e + x + g + h + i + k + l '+ e ' -y1Al+ a + b + c + d + e + x + g + h + i + k + l '+ e + ' -y1I+ a + b + c + d + e + x + g + h + i + k + l 'x' -y1i+ a + b + c + d + e + x + g + h + i + k + l ' x ' -y1a+ a + b + c + d + e + x + g + h + i + k + l '+ x ' -y1A+ a + b + c + d + e + x + g + h + i + k + l '+ x + ' -y1In+ a + b + c + d + e + x + g + h + i + k + l 'g' -y1in+ a + b + c + d + e + x + g + h + i + k + l ' g ' -y1an+ a + b + c + d + e + x + g + h + i + k + l '+ g ' -y1An+ a + b + c + d + e + x + g + h + i + k + l '+ g + ' -y1IN+ a + b + c + d + e + x + g + h + i + k + l 'h' -y1iN+ a + b + c + d + e + x + g + h + i + k + l ' h ' -y1aN+ a + b + c + d + e + x + g + h + i + k + l '+ h ' -y1AN+ a + b + c + d + e + x + g + h + i + k + l '+ h + ' -y2IL+ a + b + c + d + e + x + g + h + i + k + l 'b' -y2iL+ a + b + c + d + e + x + g + h + i + k + l ' b ' -y2aL+ a + b + c + d + e + x + g + h + i + k + l '+ b ' -y2AL+ a + b + c + d + e + x + g + h + i + k + l '+ b + ' -y2Il+ a + b + c + d + e + x + g + h + i + k + l 'd' -y2il+ a + b + c + d + e + x + g + h + i + k + l ' d ' -y2al+ a + b + c + d + e + x + g + h + i + k + l '+ d ' -y2Al+ a + b + c + d + e + x + g + h + i + k + l '+ d + ' -y2I+ a + b + c + d + e + x + g + h + i + k + l 'x' -y2i+ a + b + c + d + e + x + g + h + i + k + l ' x ' -y2a+ a + b + c + d + e + x + g + h + i + k + l '+ x ' -y2A+ a + b + c + d + e + x + g + h + i + k + l '+ x + ' -y2In+ a + b + c + d + e + x + g + h + i + k + l 'h' -y2in+ a + b + c + d + e + x + g + h + i + k + l ' h ' -y2an+ a + b + c + d + e + x + g + h + i + k + l '+ h ' -y2An+ a + b + c + d + e + x + g + h + i + k + l '+ h + ' -y2IN+ a + b + c + d + e + x + g + h + i + k + l 'k' -y2iN+ a + b + c + d + e + x + g + h + i + k + l ' k ' -y2aN+ a + b + c + d + e + x + g + h + i + k + l '+ k ' -y2AN+ a + b + c + d + e + x + g + h + i + k + l '+ k + ' -vIL+ a + b + c + _ + e + x + g + h + i + k + l -viL+ a + b + c +___+ e + x + g + h + i + k + l -vaL+ a + b + c ____+ e + x + g + h + i + k + l -vAL+ a + b + c ______e + x + g + h + i + k + l -vIl+ a + b + c + d + _ + x + g + h + i + k + l -vil+ a + b + c + d +___+ x + g + h + i + k + l -val+ a + b + c + d ____+ x + g + h + i + k + l -vAl+ a + b + c + d ______x + g + h + i + k + l -vI+ a + b + c + d + e + _ + g + h + i + k + l -vi+ a + b + c + d + e +___+ g + h + i + k + l -va+ a + b + c + d + e ____+ g + h + i + k + l -vA+ a + b + c + d + e ______g + h + i + k + l -vIn+ a + b + c + d + e + x + _ + h + i + k + l -vin+ a + b + c + d + e + x +___+ h + i + k + l -van+ a + b + c + d + e + x ____+ h + i + k + l -vAn+ a + b + c + d + e + x ______h + i + k + l -vIN+ a + b + c + d + e + x + g + _ + i + k + l -viN+ a + b + c + d + e + x + g +___+ i + k + l -vaN+ a + b + c + d + e + x + g ____+ i + k + l -vAN+ a + b + c + d + e + x + g ______i + k + l -v1IL+ a + b + c + _ + e + x + g + h + i + k + l -v1iL+ a + b + c +___+ e + x + g + h + i + k + l -v1aL+ a + b + c ____+ e + x + g + h + i + k + l -v1AL+ a + b + c ______e + x + g + h + i + k + l -v1Il+ a + b + c + d + _ + x + g + h + i + k + l -v1il+ a + b + c + d +___+ x + g + h + i + k + l -v1al+ a + b + c + d ____+ x + g + h + i + k + l -v1Al+ a + b + c + d ______x + g + h + i + k + l -v1I+ a + b + c + d + e + _ + g + h + i + k + l -v1i+ a + b + c + d + e +___+ g + h + i + k + l -v1a+ a + b + c + d + e ____+ g + h + i + k + l -v1A+ a + b + c + d + e ______g + h + i + k + l -v1In+ a + b + c + d + e + x + _ + h + i + k + l -v1in+ a + b + c + d + e + x +___+ h + i + k + l -v1an+ a + b + c + d + e + x ____+ h + i + k + l -v1An+ a + b + c + d + e + x ______h + i + k + l -v1IN+ a + b + c + d + e + x + g + _ + i + k + l -v1iN+ a + b + c + d + e + x + g +___+ i + k + l -v1aN+ a + b + c + d + e + x + g ____+ i + k + l -v1AN+ a + b + c + d + e + x + g ______i + k + l -v2IL+ a + _ + c + d + e + x + g + h + i + k + l -v2iL+ a +___+ c + d + e + x + g + h + i + k + l -v2aL+ a ____+ c + d + e + x + g + h + i + k + l -v2AL+ a ______c + d + e + x + g + h + i + k + l -v2Il+ a + b + c + _ + e + x + g + h + i + k + l -v2il+ a + b + c +___+ e + x + g + h + i + k + l -v2al+ a + b + c ____+ e + x + g + h + i + k + l -v2Al+ a + b + c ______e + x + g + h + i + k + l -v2I+ a + b + c + d + e + _ + g + h + i + k + l -v2i+ a + b + c + d + e +___+ g + h + i + k + l -v2a+ a + b + c + d + e ____+ g + h + i + k + l -v2A+ a + b + c + d + e ______g + h + i + k + l -v2In+ a + b + c + d + e + x + g + _ + i + k + l -v2in+ a + b + c + d + e + x + g +___+ i + k + l -v2an+ a + b + c + d + e + x + g ____+ i + k + l -v2An+ a + b + c + d + e + x + g ______i + k + l -v2IN+ a + b + c + d + e + x + g + h + i + _ + l -v2iN+ a + b + c + d + e + x + g + h + i +___+ l -v2aN+ a + b + c + d + e + x + g + h + i ____+ l -v2AN+ a + b + c + d + e + x + g + h + i ______l -a - b - c - d - e - x - g - h - i - k - l -cIL- a - b - c - _ - e - x - g - h - i - k - l -ciL- a - b - c -_- e - x - g - h - i - k - l -caL- a - b - c _- e - x - g - h - i - k - l -cAL- a - b - c _e - x - g - h - i - k - l -cIl- a - b - c - d - _ - x - g - h - i - k - l -cil- a - b - c - d -_- x - g - h - i - k - l -cal- a - b - c - d _- x - g - h - i - k - l -cAl- a - b - c - d _x - g - h - i - k - l -cI- a - b - c - d - e - _ - g - h - i - k - l -ci- a - b - c - d - e -_- g - h - i - k - l -ca- a - b - c - d - e _- g - h - i - k - l -cA- a - b - c - d - e _g - h - i - k - l -cIn- a - b - c - d - e - x - _ - h - i - k - l -cin- a - b - c - d - e - x -_- h - i - k - l -can- a - b - c - d - e - x _- h - i - k - l -cAn- a - b - c - d - e - x _h - i - k - l -cIN- a - b - c - d - e - x - g - _ - i - k - l -ciN- a - b - c - d - e - x - g -_- i - k - l -caN- a - b - c - d - e - x - g _- i - k - l -cAN- a - b - c - d - e - x - g _i - k - l -c1IL- a - b - c - _ - e - x - g - h - i - k - l -c1iL- a - b - c -_- e - x - g - h - i - k - l -c1aL- a - b - c _- e - x - g - h - i - k - l -c1AL- a - b - c _e - x - g - h - i - k - l -c1Il- a - b - c - d - _ - x - g - h - i - k - l -c1il- a - b - c - d -_- x - g - h - i - k - l -c1al- a - b - c - d _- x - g - h - i - k - l -c1Al- a - b - c - d _x - g - h - i - k - l -c1I- a - b - c - d - e - _ - g - h - i - k - l -c1i- a - b - c - d - e -_- g - h - i - k - l -c1a- a - b - c - d - e _- g - h - i - k - l -c1A- a - b - c - d - e _g - h - i - k - l -c1In- a - b - c - d - e - x - _ - h - i - k - l -c1in- a - b - c - d - e - x -_- h - i - k - l -c1an- a - b - c - d - e - x _- h - i - k - l -c1An- a - b - c - d - e - x _h - i - k - l -c1IN- a - b - c - d - e - x - g - _ - i - k - l -c1iN- a - b - c - d - e - x - g -_- i - k - l -c1aN- a - b - c - d - e - x - g _- i - k - l -c1AN- a - b - c - d - e - x - g _i - k - l -c2IL- a - _ - c - d - e - x - g - h - i - k - l -c2iL- a -_- c - d - e - x - g - h - i - k - l -c2aL- a _- c - d - e - x - g - h - i - k - l -c2AL- a _c - d - e - x - g - h - i - k - l -c2Il- a - b - c - _ - e - x - g - h - i - k - l -c2il- a - b - c -_- e - x - g - h - i - k - l -c2al- a - b - c _- e - x - g - h - i - k - l -c2Al- a - b - c _e - x - g - h - i - k - l -c2I- a - b - c - d - e - _ - g - h - i - k - l -c2i- a - b - c - d - e -_- g - h - i - k - l -c2a- a - b - c - d - e _- g - h - i - k - l -c2A- a - b - c - d - e _g - h - i - k - l -c2In- a - b - c - d - e - x - g - _ - i - k - l -c2in- a - b - c - d - e - x - g -_- i - k - l -c2an- a - b - c - d - e - x - g _- i - k - l -c2An- a - b - c - d - e - x - g _i - k - l -c2IN- a - b - c - d - e - x - g - h - i - _ - l -c2iN- a - b - c - d - e - x - g - h - i -_- l -c2aN- a - b - c - d - e - x - g - h - i _- l -c2AN- a - b - c - d - e - x - g - h - i _l -dIL- a - b - c - - e - x - g - h - i - k - l -diL- a - b - c -- e - x - g - h - i - k - l -daL- a - b - c - e - x - g - h - i - k - l -dAL- a - b - c e - x - g - h - i - k - l -dIl- a - b - c - d - - x - g - h - i - k - l -dil- a - b - c - d -- x - g - h - i - k - l -dal- a - b - c - d - x - g - h - i - k - l -dAl- a - b - c - d x - g - h - i - k - l -dI- a - b - c - d - e - - g - h - i - k - l -di- a - b - c - d - e -- g - h - i - k - l -da- a - b - c - d - e - g - h - i - k - l -dA- a - b - c - d - e g - h - i - k - l -dIn- a - b - c - d - e - x - - h - i - k - l -din- a - b - c - d - e - x -- h - i - k - l -dan- a - b - c - d - e - x - h - i - k - l -dAn- a - b - c - d - e - x h - i - k - l -dIN- a - b - c - d - e - x - g - - i - k - l -diN- a - b - c - d - e - x - g -- i - k - l -daN- a - b - c - d - e - x - g - i - k - l -dAN- a - b - c - d - e - x - g i - k - l -d1IL- a - b - c - - e - x - g - h - i - k - l -d1iL- a - b - c -- e - x - g - h - i - k - l -d1aL- a - b - c - e - x - g - h - i - k - l -d1AL- a - b - c e - x - g - h - i - k - l -d1Il- a - b - c - d - - x - g - h - i - k - l -d1il- a - b - c - d -- x - g - h - i - k - l -d1al- a - b - c - d - x - g - h - i - k - l -d1Al- a - b - c - d x - g - h - i - k - l -d1I- a - b - c - d - e - - g - h - i - k - l -d1i- a - b - c - d - e -- g - h - i - k - l -d1a- a - b - c - d - e - g - h - i - k - l -d1A- a - b - c - d - e g - h - i - k - l -d1In- a - b - c - d - e - x - - h - i - k - l -d1in- a - b - c - d - e - x -- h - i - k - l -d1an- a - b - c - d - e - x - h - i - k - l -d1An- a - b - c - d - e - x h - i - k - l -d1IN- a - b - c - d - e - x - g - - i - k - l -d1iN- a - b - c - d - e - x - g -- i - k - l -d1aN- a - b - c - d - e - x - g - i - k - l -d1AN- a - b - c - d - e - x - g i - k - l -d2IL- a - - c - d - e - x - g - h - i - k - l -d2iL- a -- c - d - e - x - g - h - i - k - l -d2aL- a - c - d - e - x - g - h - i - k - l -d2AL- a c - d - e - x - g - h - i - k - l -d2Il- a - b - c - - e - x - g - h - i - k - l -d2il- a - b - c -- e - x - g - h - i - k - l -d2al- a - b - c - e - x - g - h - i - k - l -d2Al- a - b - c e - x - g - h - i - k - l -d2I- a - b - c - d - e - - g - h - i - k - l -d2i- a - b - c - d - e -- g - h - i - k - l -d2a- a - b - c - d - e - g - h - i - k - l -d2A- a - b - c - d - e g - h - i - k - l -d2In- a - b - c - d - e - x - g - - i - k - l -d2in- a - b - c - d - e - x - g -- i - k - l -d2an- a - b - c - d - e - x - g - i - k - l -d2An- a - b - c - d - e - x - g i - k - l -d2IN- a - b - c - d - e - x - g - h - i - - l -d2iN- a - b - c - d - e - x - g - h - i -- l -d2aN- a - b - c - d - e - x - g - h - i - l -d2AN- a - b - c - d - e - x - g - h - i l -yIL- a - b - c - d - e - x - g - h - i - k - l 'd' -yiL- a - b - c - d - e - x - g - h - i - k - l ' d ' -yaL- a - b - c - d - e - x - g - h - i - k - l '- d ' -yAL- a - b - c - d - e - x - g - h - i - k - l '- d - ' -yIl- a - b - c - d - e - x - g - h - i - k - l 'e' -yil- a - b - c - d - e - x - g - h - i - k - l ' e ' -yal- a - b - c - d - e - x - g - h - i - k - l '- e ' -yAl- a - b - c - d - e - x - g - h - i - k - l '- e - ' -yI- a - b - c - d - e - x - g - h - i - k - l 'x' -yi- a - b - c - d - e - x - g - h - i - k - l ' x ' -ya- a - b - c - d - e - x - g - h - i - k - l '- x ' -yA- a - b - c - d - e - x - g - h - i - k - l '- x - ' -yIn- a - b - c - d - e - x - g - h - i - k - l 'g' -yin- a - b - c - d - e - x - g - h - i - k - l ' g ' -yan- a - b - c - d - e - x - g - h - i - k - l '- g ' -yAn- a - b - c - d - e - x - g - h - i - k - l '- g - ' -yIN- a - b - c - d - e - x - g - h - i - k - l 'h' -yiN- a - b - c - d - e - x - g - h - i - k - l ' h ' -yaN- a - b - c - d - e - x - g - h - i - k - l '- h ' -yAN- a - b - c - d - e - x - g - h - i - k - l '- h - ' -y1IL- a - b - c - d - e - x - g - h - i - k - l 'd' -y1iL- a - b - c - d - e - x - g - h - i - k - l ' d ' -y1aL- a - b - c - d - e - x - g - h - i - k - l '- d ' -y1AL- a - b - c - d - e - x - g - h - i - k - l '- d - ' -y1Il- a - b - c - d - e - x - g - h - i - k - l 'e' -y1il- a - b - c - d - e - x - g - h - i - k - l ' e ' -y1al- a - b - c - d - e - x - g - h - i - k - l '- e ' -y1Al- a - b - c - d - e - x - g - h - i - k - l '- e - ' -y1I- a - b - c - d - e - x - g - h - i - k - l 'x' -y1i- a - b - c - d - e - x - g - h - i - k - l ' x ' -y1a- a - b - c - d - e - x - g - h - i - k - l '- x ' -y1A- a - b - c - d - e - x - g - h - i - k - l '- x - ' -y1In- a - b - c - d - e - x - g - h - i - k - l 'g' -y1in- a - b - c - d - e - x - g - h - i - k - l ' g ' -y1an- a - b - c - d - e - x - g - h - i - k - l '- g ' -y1An- a - b - c - d - e - x - g - h - i - k - l '- g - ' -y1IN- a - b - c - d - e - x - g - h - i - k - l 'h' -y1iN- a - b - c - d - e - x - g - h - i - k - l ' h ' -y1aN- a - b - c - d - e - x - g - h - i - k - l '- h ' -y1AN- a - b - c - d - e - x - g - h - i - k - l '- h - ' -y2IL- a - b - c - d - e - x - g - h - i - k - l 'b' -y2iL- a - b - c - d - e - x - g - h - i - k - l ' b ' -y2aL- a - b - c - d - e - x - g - h - i - k - l '- b ' -y2AL- a - b - c - d - e - x - g - h - i - k - l '- b - ' -y2Il- a - b - c - d - e - x - g - h - i - k - l 'd' -y2il- a - b - c - d - e - x - g - h - i - k - l ' d ' -y2al- a - b - c - d - e - x - g - h - i - k - l '- d ' -y2Al- a - b - c - d - e - x - g - h - i - k - l '- d - ' -y2I- a - b - c - d - e - x - g - h - i - k - l 'x' -y2i- a - b - c - d - e - x - g - h - i - k - l ' x ' -y2a- a - b - c - d - e - x - g - h - i - k - l '- x ' -y2A- a - b - c - d - e - x - g - h - i - k - l '- x - ' -y2In- a - b - c - d - e - x - g - h - i - k - l 'h' -y2in- a - b - c - d - e - x - g - h - i - k - l ' h ' -y2an- a - b - c - d - e - x - g - h - i - k - l '- h ' -y2An- a - b - c - d - e - x - g - h - i - k - l '- h - ' -y2IN- a - b - c - d - e - x - g - h - i - k - l 'k' -y2iN- a - b - c - d - e - x - g - h - i - k - l ' k ' -y2aN- a - b - c - d - e - x - g - h - i - k - l '- k ' -y2AN- a - b - c - d - e - x - g - h - i - k - l '- k - ' -vIL- a - b - c - _ - e - x - g - h - i - k - l -viL- a - b - c -___- e - x - g - h - i - k - l -vaL- a - b - c ____- e - x - g - h - i - k - l -vAL- a - b - c ______e - x - g - h - i - k - l -vIl- a - b - c - d - _ - x - g - h - i - k - l -vil- a - b - c - d -___- x - g - h - i - k - l -val- a - b - c - d ____- x - g - h - i - k - l -vAl- a - b - c - d ______x - g - h - i - k - l -vI- a - b - c - d - e - _ - g - h - i - k - l -vi- a - b - c - d - e -___- g - h - i - k - l -va- a - b - c - d - e ____- g - h - i - k - l -vA- a - b - c - d - e ______g - h - i - k - l -vIn- a - b - c - d - e - x - _ - h - i - k - l -vin- a - b - c - d - e - x -___- h - i - k - l -van- a - b - c - d - e - x ____- h - i - k - l -vAn- a - b - c - d - e - x ______h - i - k - l -vIN- a - b - c - d - e - x - g - _ - i - k - l -viN- a - b - c - d - e - x - g -___- i - k - l -vaN- a - b - c - d - e - x - g ____- i - k - l -vAN- a - b - c - d - e - x - g ______i - k - l -v1IL- a - b - c - _ - e - x - g - h - i - k - l -v1iL- a - b - c -___- e - x - g - h - i - k - l -v1aL- a - b - c ____- e - x - g - h - i - k - l -v1AL- a - b - c ______e - x - g - h - i - k - l -v1Il- a - b - c - d - _ - x - g - h - i - k - l -v1il- a - b - c - d -___- x - g - h - i - k - l -v1al- a - b - c - d ____- x - g - h - i - k - l -v1Al- a - b - c - d ______x - g - h - i - k - l -v1I- a - b - c - d - e - _ - g - h - i - k - l -v1i- a - b - c - d - e -___- g - h - i - k - l -v1a- a - b - c - d - e ____- g - h - i - k - l -v1A- a - b - c - d - e ______g - h - i - k - l -v1In- a - b - c - d - e - x - _ - h - i - k - l -v1in- a - b - c - d - e - x -___- h - i - k - l -v1an- a - b - c - d - e - x ____- h - i - k - l -v1An- a - b - c - d - e - x ______h - i - k - l -v1IN- a - b - c - d - e - x - g - _ - i - k - l -v1iN- a - b - c - d - e - x - g -___- i - k - l -v1aN- a - b - c - d - e - x - g ____- i - k - l -v1AN- a - b - c - d - e - x - g ______i - k - l -v2IL- a - _ - c - d - e - x - g - h - i - k - l -v2iL- a -___- c - d - e - x - g - h - i - k - l -v2aL- a ____- c - d - e - x - g - h - i - k - l -v2AL- a ______c - d - e - x - g - h - i - k - l -v2Il- a - b - c - _ - e - x - g - h - i - k - l -v2il- a - b - c -___- e - x - g - h - i - k - l -v2al- a - b - c ____- e - x - g - h - i - k - l -v2Al- a - b - c ______e - x - g - h - i - k - l -v2I- a - b - c - d - e - _ - g - h - i - k - l -v2i- a - b - c - d - e -___- g - h - i - k - l -v2a- a - b - c - d - e ____- g - h - i - k - l -v2A- a - b - c - d - e ______g - h - i - k - l -v2In- a - b - c - d - e - x - g - _ - i - k - l -v2in- a - b - c - d - e - x - g -___- i - k - l -v2an- a - b - c - d - e - x - g ____- i - k - l -v2An- a - b - c - d - e - x - g ______i - k - l -v2IN- a - b - c - d - e - x - g - h - i - _ - l -v2iN- a - b - c - d - e - x - g - h - i -___- l -v2aN- a - b - c - d - e - x - g - h - i ____- l -v2AN- a - b - c - d - e - x - g - h - i ______l -a = b = c = d = e = x = g = h = i = k = l -cIL= a = b = c = _ = e = x = g = h = i = k = l -ciL= a = b = c =_= e = x = g = h = i = k = l -caL= a = b = c _= e = x = g = h = i = k = l -cAL= a = b = c _e = x = g = h = i = k = l -cIl= a = b = c = d = _ = x = g = h = i = k = l -cil= a = b = c = d =_= x = g = h = i = k = l -cal= a = b = c = d _= x = g = h = i = k = l -cAl= a = b = c = d _x = g = h = i = k = l -cI= a = b = c = d = e = _ = g = h = i = k = l -ci= a = b = c = d = e =_= g = h = i = k = l -ca= a = b = c = d = e _= g = h = i = k = l -cA= a = b = c = d = e _g = h = i = k = l -cIn= a = b = c = d = e = x = _ = h = i = k = l -cin= a = b = c = d = e = x =_= h = i = k = l -can= a = b = c = d = e = x _= h = i = k = l -cAn= a = b = c = d = e = x _h = i = k = l -cIN= a = b = c = d = e = x = g = _ = i = k = l -ciN= a = b = c = d = e = x = g =_= i = k = l -caN= a = b = c = d = e = x = g _= i = k = l -cAN= a = b = c = d = e = x = g _i = k = l -c1IL= a = b = c = _ = e = x = g = h = i = k = l -c1iL= a = b = c =_= e = x = g = h = i = k = l -c1aL= a = b = c _= e = x = g = h = i = k = l -c1AL= a = b = c _e = x = g = h = i = k = l -c1Il= a = b = c = d = _ = x = g = h = i = k = l -c1il= a = b = c = d =_= x = g = h = i = k = l -c1al= a = b = c = d _= x = g = h = i = k = l -c1Al= a = b = c = d _x = g = h = i = k = l -c1I= a = b = c = d = e = _ = g = h = i = k = l -c1i= a = b = c = d = e =_= g = h = i = k = l -c1a= a = b = c = d = e _= g = h = i = k = l -c1A= a = b = c = d = e _g = h = i = k = l -c1In= a = b = c = d = e = x = _ = h = i = k = l -c1in= a = b = c = d = e = x =_= h = i = k = l -c1an= a = b = c = d = e = x _= h = i = k = l -c1An= a = b = c = d = e = x _h = i = k = l -c1IN= a = b = c = d = e = x = g = _ = i = k = l -c1iN= a = b = c = d = e = x = g =_= i = k = l -c1aN= a = b = c = d = e = x = g _= i = k = l -c1AN= a = b = c = d = e = x = g _i = k = l -c2IL= a = _ = c = d = e = x = g = h = i = k = l -c2iL= a =_= c = d = e = x = g = h = i = k = l -c2aL= a _= c = d = e = x = g = h = i = k = l -c2AL= a _c = d = e = x = g = h = i = k = l -c2Il= a = b = c = _ = e = x = g = h = i = k = l -c2il= a = b = c =_= e = x = g = h = i = k = l -c2al= a = b = c _= e = x = g = h = i = k = l -c2Al= a = b = c _e = x = g = h = i = k = l -c2I= a = b = c = d = e = _ = g = h = i = k = l -c2i= a = b = c = d = e =_= g = h = i = k = l -c2a= a = b = c = d = e _= g = h = i = k = l -c2A= a = b = c = d = e _g = h = i = k = l -c2In= a = b = c = d = e = x = g = _ = i = k = l -c2in= a = b = c = d = e = x = g =_= i = k = l -c2an= a = b = c = d = e = x = g _= i = k = l -c2An= a = b = c = d = e = x = g _i = k = l -c2IN= a = b = c = d = e = x = g = h = i = _ = l -c2iN= a = b = c = d = e = x = g = h = i =_= l -c2aN= a = b = c = d = e = x = g = h = i _= l -c2AN= a = b = c = d = e = x = g = h = i _l -dIL= a = b = c = = e = x = g = h = i = k = l -diL= a = b = c == e = x = g = h = i = k = l -daL= a = b = c = e = x = g = h = i = k = l -dAL= a = b = c e = x = g = h = i = k = l -dIl= a = b = c = d = = x = g = h = i = k = l -dil= a = b = c = d == x = g = h = i = k = l -dal= a = b = c = d = x = g = h = i = k = l -dAl= a = b = c = d x = g = h = i = k = l -dI= a = b = c = d = e = = g = h = i = k = l -di= a = b = c = d = e == g = h = i = k = l -da= a = b = c = d = e = g = h = i = k = l -dA= a = b = c = d = e g = h = i = k = l -dIn= a = b = c = d = e = x = = h = i = k = l -din= a = b = c = d = e = x == h = i = k = l -dan= a = b = c = d = e = x = h = i = k = l -dAn= a = b = c = d = e = x h = i = k = l -dIN= a = b = c = d = e = x = g = = i = k = l -diN= a = b = c = d = e = x = g == i = k = l -daN= a = b = c = d = e = x = g = i = k = l -dAN= a = b = c = d = e = x = g i = k = l -d1IL= a = b = c = = e = x = g = h = i = k = l -d1iL= a = b = c == e = x = g = h = i = k = l -d1aL= a = b = c = e = x = g = h = i = k = l -d1AL= a = b = c e = x = g = h = i = k = l -d1Il= a = b = c = d = = x = g = h = i = k = l -d1il= a = b = c = d == x = g = h = i = k = l -d1al= a = b = c = d = x = g = h = i = k = l -d1Al= a = b = c = d x = g = h = i = k = l -d1I= a = b = c = d = e = = g = h = i = k = l -d1i= a = b = c = d = e == g = h = i = k = l -d1a= a = b = c = d = e = g = h = i = k = l -d1A= a = b = c = d = e g = h = i = k = l -d1In= a = b = c = d = e = x = = h = i = k = l -d1in= a = b = c = d = e = x == h = i = k = l -d1an= a = b = c = d = e = x = h = i = k = l -d1An= a = b = c = d = e = x h = i = k = l -d1IN= a = b = c = d = e = x = g = = i = k = l -d1iN= a = b = c = d = e = x = g == i = k = l -d1aN= a = b = c = d = e = x = g = i = k = l -d1AN= a = b = c = d = e = x = g i = k = l -d2IL= a = = c = d = e = x = g = h = i = k = l -d2iL= a == c = d = e = x = g = h = i = k = l -d2aL= a = c = d = e = x = g = h = i = k = l -d2AL= a c = d = e = x = g = h = i = k = l -d2Il= a = b = c = = e = x = g = h = i = k = l -d2il= a = b = c == e = x = g = h = i = k = l -d2al= a = b = c = e = x = g = h = i = k = l -d2Al= a = b = c e = x = g = h = i = k = l -d2I= a = b = c = d = e = = g = h = i = k = l -d2i= a = b = c = d = e == g = h = i = k = l -d2a= a = b = c = d = e = g = h = i = k = l -d2A= a = b = c = d = e g = h = i = k = l -d2In= a = b = c = d = e = x = g = = i = k = l -d2in= a = b = c = d = e = x = g == i = k = l -d2an= a = b = c = d = e = x = g = i = k = l -d2An= a = b = c = d = e = x = g i = k = l -d2IN= a = b = c = d = e = x = g = h = i = = l -d2iN= a = b = c = d = e = x = g = h = i == l -d2aN= a = b = c = d = e = x = g = h = i = l -d2AN= a = b = c = d = e = x = g = h = i l -yIL= a = b = c = d = e = x = g = h = i = k = l 'd' -yiL= a = b = c = d = e = x = g = h = i = k = l ' d ' -yaL= a = b = c = d = e = x = g = h = i = k = l '= d ' -yAL= a = b = c = d = e = x = g = h = i = k = l '= d = ' -yIl= a = b = c = d = e = x = g = h = i = k = l 'e' -yil= a = b = c = d = e = x = g = h = i = k = l ' e ' -yal= a = b = c = d = e = x = g = h = i = k = l '= e ' -yAl= a = b = c = d = e = x = g = h = i = k = l '= e = ' -yI= a = b = c = d = e = x = g = h = i = k = l 'x' -yi= a = b = c = d = e = x = g = h = i = k = l ' x ' -ya= a = b = c = d = e = x = g = h = i = k = l '= x ' -yA= a = b = c = d = e = x = g = h = i = k = l '= x = ' -yIn= a = b = c = d = e = x = g = h = i = k = l 'g' -yin= a = b = c = d = e = x = g = h = i = k = l ' g ' -yan= a = b = c = d = e = x = g = h = i = k = l '= g ' -yAn= a = b = c = d = e = x = g = h = i = k = l '= g = ' -yIN= a = b = c = d = e = x = g = h = i = k = l 'h' -yiN= a = b = c = d = e = x = g = h = i = k = l ' h ' -yaN= a = b = c = d = e = x = g = h = i = k = l '= h ' -yAN= a = b = c = d = e = x = g = h = i = k = l '= h = ' -y1IL= a = b = c = d = e = x = g = h = i = k = l 'd' -y1iL= a = b = c = d = e = x = g = h = i = k = l ' d ' -y1aL= a = b = c = d = e = x = g = h = i = k = l '= d ' -y1AL= a = b = c = d = e = x = g = h = i = k = l '= d = ' -y1Il= a = b = c = d = e = x = g = h = i = k = l 'e' -y1il= a = b = c = d = e = x = g = h = i = k = l ' e ' -y1al= a = b = c = d = e = x = g = h = i = k = l '= e ' -y1Al= a = b = c = d = e = x = g = h = i = k = l '= e = ' -y1I= a = b = c = d = e = x = g = h = i = k = l 'x' -y1i= a = b = c = d = e = x = g = h = i = k = l ' x ' -y1a= a = b = c = d = e = x = g = h = i = k = l '= x ' -y1A= a = b = c = d = e = x = g = h = i = k = l '= x = ' -y1In= a = b = c = d = e = x = g = h = i = k = l 'g' -y1in= a = b = c = d = e = x = g = h = i = k = l ' g ' -y1an= a = b = c = d = e = x = g = h = i = k = l '= g ' -y1An= a = b = c = d = e = x = g = h = i = k = l '= g = ' -y1IN= a = b = c = d = e = x = g = h = i = k = l 'h' -y1iN= a = b = c = d = e = x = g = h = i = k = l ' h ' -y1aN= a = b = c = d = e = x = g = h = i = k = l '= h ' -y1AN= a = b = c = d = e = x = g = h = i = k = l '= h = ' -y2IL= a = b = c = d = e = x = g = h = i = k = l 'b' -y2iL= a = b = c = d = e = x = g = h = i = k = l ' b ' -y2aL= a = b = c = d = e = x = g = h = i = k = l '= b ' -y2AL= a = b = c = d = e = x = g = h = i = k = l '= b = ' -y2Il= a = b = c = d = e = x = g = h = i = k = l 'd' -y2il= a = b = c = d = e = x = g = h = i = k = l ' d ' -y2al= a = b = c = d = e = x = g = h = i = k = l '= d ' -y2Al= a = b = c = d = e = x = g = h = i = k = l '= d = ' -y2I= a = b = c = d = e = x = g = h = i = k = l 'x' -y2i= a = b = c = d = e = x = g = h = i = k = l ' x ' -y2a= a = b = c = d = e = x = g = h = i = k = l '= x ' -y2A= a = b = c = d = e = x = g = h = i = k = l '= x = ' -y2In= a = b = c = d = e = x = g = h = i = k = l 'h' -y2in= a = b = c = d = e = x = g = h = i = k = l ' h ' -y2an= a = b = c = d = e = x = g = h = i = k = l '= h ' -y2An= a = b = c = d = e = x = g = h = i = k = l '= h = ' -y2IN= a = b = c = d = e = x = g = h = i = k = l 'k' -y2iN= a = b = c = d = e = x = g = h = i = k = l ' k ' -y2aN= a = b = c = d = e = x = g = h = i = k = l '= k ' -y2AN= a = b = c = d = e = x = g = h = i = k = l '= k = ' -vIL= a = b = c = _ = e = x = g = h = i = k = l -viL= a = b = c =___= e = x = g = h = i = k = l -vaL= a = b = c ____= e = x = g = h = i = k = l -vAL= a = b = c ______e = x = g = h = i = k = l -vIl= a = b = c = d = _ = x = g = h = i = k = l -vil= a = b = c = d =___= x = g = h = i = k = l -val= a = b = c = d ____= x = g = h = i = k = l -vAl= a = b = c = d ______x = g = h = i = k = l -vI= a = b = c = d = e = _ = g = h = i = k = l -vi= a = b = c = d = e =___= g = h = i = k = l -va= a = b = c = d = e ____= g = h = i = k = l -vA= a = b = c = d = e ______g = h = i = k = l -vIn= a = b = c = d = e = x = _ = h = i = k = l -vin= a = b = c = d = e = x =___= h = i = k = l -van= a = b = c = d = e = x ____= h = i = k = l -vAn= a = b = c = d = e = x ______h = i = k = l -vIN= a = b = c = d = e = x = g = _ = i = k = l -viN= a = b = c = d = e = x = g =___= i = k = l -vaN= a = b = c = d = e = x = g ____= i = k = l -vAN= a = b = c = d = e = x = g ______i = k = l -v1IL= a = b = c = _ = e = x = g = h = i = k = l -v1iL= a = b = c =___= e = x = g = h = i = k = l -v1aL= a = b = c ____= e = x = g = h = i = k = l -v1AL= a = b = c ______e = x = g = h = i = k = l -v1Il= a = b = c = d = _ = x = g = h = i = k = l -v1il= a = b = c = d =___= x = g = h = i = k = l -v1al= a = b = c = d ____= x = g = h = i = k = l -v1Al= a = b = c = d ______x = g = h = i = k = l -v1I= a = b = c = d = e = _ = g = h = i = k = l -v1i= a = b = c = d = e =___= g = h = i = k = l -v1a= a = b = c = d = e ____= g = h = i = k = l -v1A= a = b = c = d = e ______g = h = i = k = l -v1In= a = b = c = d = e = x = _ = h = i = k = l -v1in= a = b = c = d = e = x =___= h = i = k = l -v1an= a = b = c = d = e = x ____= h = i = k = l -v1An= a = b = c = d = e = x ______h = i = k = l -v1IN= a = b = c = d = e = x = g = _ = i = k = l -v1iN= a = b = c = d = e = x = g =___= i = k = l -v1aN= a = b = c = d = e = x = g ____= i = k = l -v1AN= a = b = c = d = e = x = g ______i = k = l -v2IL= a = _ = c = d = e = x = g = h = i = k = l -v2iL= a =___= c = d = e = x = g = h = i = k = l -v2aL= a ____= c = d = e = x = g = h = i = k = l -v2AL= a ______c = d = e = x = g = h = i = k = l -v2Il= a = b = c = _ = e = x = g = h = i = k = l -v2il= a = b = c =___= e = x = g = h = i = k = l -v2al= a = b = c ____= e = x = g = h = i = k = l -v2Al= a = b = c ______e = x = g = h = i = k = l -v2I= a = b = c = d = e = _ = g = h = i = k = l -v2i= a = b = c = d = e =___= g = h = i = k = l -v2a= a = b = c = d = e ____= g = h = i = k = l -v2A= a = b = c = d = e ______g = h = i = k = l -v2In= a = b = c = d = e = x = g = _ = i = k = l -v2in= a = b = c = d = e = x = g =___= i = k = l -v2an= a = b = c = d = e = x = g ____= i = k = l -v2An= a = b = c = d = e = x = g ______i = k = l -v2IN= a = b = c = d = e = x = g = h = i = _ = l -v2iN= a = b = c = d = e = x = g = h = i =___= l -v2aN= a = b = c = d = e = x = g = h = i ____= l -v2AN= a = b = c = d = e = x = g = h = i ______l -a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -cIL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -ciL~ a ~ b ~ c ~_~ e ~ x ~ g ~ h ~ i ~ k ~ l -caL~ a ~ b ~ c _~ e ~ x ~ g ~ h ~ i ~ k ~ l -cAL~ a ~ b ~ c _e ~ x ~ g ~ h ~ i ~ k ~ l -cIl~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -cil~ a ~ b ~ c ~ d ~_~ x ~ g ~ h ~ i ~ k ~ l -cal~ a ~ b ~ c ~ d _~ x ~ g ~ h ~ i ~ k ~ l -cAl~ a ~ b ~ c ~ d _x ~ g ~ h ~ i ~ k ~ l -cI~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -ci~ a ~ b ~ c ~ d ~ e ~_~ g ~ h ~ i ~ k ~ l -ca~ a ~ b ~ c ~ d ~ e _~ g ~ h ~ i ~ k ~ l -cA~ a ~ b ~ c ~ d ~ e _g ~ h ~ i ~ k ~ l -cIn~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -cin~ a ~ b ~ c ~ d ~ e ~ x ~_~ h ~ i ~ k ~ l -can~ a ~ b ~ c ~ d ~ e ~ x _~ h ~ i ~ k ~ l -cAn~ a ~ b ~ c ~ d ~ e ~ x _h ~ i ~ k ~ l -cIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -ciN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~_~ i ~ k ~ l -caN~ a ~ b ~ c ~ d ~ e ~ x ~ g _~ i ~ k ~ l -cAN~ a ~ b ~ c ~ d ~ e ~ x ~ g _i ~ k ~ l -c1IL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c1iL~ a ~ b ~ c ~_~ e ~ x ~ g ~ h ~ i ~ k ~ l -c1aL~ a ~ b ~ c _~ e ~ x ~ g ~ h ~ i ~ k ~ l -c1AL~ a ~ b ~ c _e ~ x ~ g ~ h ~ i ~ k ~ l -c1Il~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -c1il~ a ~ b ~ c ~ d ~_~ x ~ g ~ h ~ i ~ k ~ l -c1al~ a ~ b ~ c ~ d _~ x ~ g ~ h ~ i ~ k ~ l -c1Al~ a ~ b ~ c ~ d _x ~ g ~ h ~ i ~ k ~ l -c1I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -c1i~ a ~ b ~ c ~ d ~ e ~_~ g ~ h ~ i ~ k ~ l -c1a~ a ~ b ~ c ~ d ~ e _~ g ~ h ~ i ~ k ~ l -c1A~ a ~ b ~ c ~ d ~ e _g ~ h ~ i ~ k ~ l -c1In~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -c1in~ a ~ b ~ c ~ d ~ e ~ x ~_~ h ~ i ~ k ~ l -c1an~ a ~ b ~ c ~ d ~ e ~ x _~ h ~ i ~ k ~ l -c1An~ a ~ b ~ c ~ d ~ e ~ x _h ~ i ~ k ~ l -c1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -c1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~_~ i ~ k ~ l -c1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g _~ i ~ k ~ l -c1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g _i ~ k ~ l -c2IL~ a ~ _ ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2iL~ a ~_~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2aL~ a _~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2AL~ a _c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2Il~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2il~ a ~ b ~ c ~_~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2al~ a ~ b ~ c _~ e ~ x ~ g ~ h ~ i ~ k ~ l -c2Al~ a ~ b ~ c _e ~ x ~ g ~ h ~ i ~ k ~ l -c2I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -c2i~ a ~ b ~ c ~ d ~ e ~_~ g ~ h ~ i ~ k ~ l -c2a~ a ~ b ~ c ~ d ~ e _~ g ~ h ~ i ~ k ~ l -c2A~ a ~ b ~ c ~ d ~ e _g ~ h ~ i ~ k ~ l -c2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -c2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~_~ i ~ k ~ l -c2an~ a ~ b ~ c ~ d ~ e ~ x ~ g _~ i ~ k ~ l -c2An~ a ~ b ~ c ~ d ~ e ~ x ~ g _i ~ k ~ l -c2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ _ ~ l -c2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~_~ l -c2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i _~ l -c2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i _l -dIL~ a ~ b ~ c ~ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -diL~ a ~ b ~ c ~~ e ~ x ~ g ~ h ~ i ~ k ~ l -daL~ a ~ b ~ c ~ e ~ x ~ g ~ h ~ i ~ k ~ l -dAL~ a ~ b ~ c e ~ x ~ g ~ h ~ i ~ k ~ l -dIl~ a ~ b ~ c ~ d ~ ~ x ~ g ~ h ~ i ~ k ~ l -dil~ a ~ b ~ c ~ d ~~ x ~ g ~ h ~ i ~ k ~ l -dal~ a ~ b ~ c ~ d ~ x ~ g ~ h ~ i ~ k ~ l -dAl~ a ~ b ~ c ~ d x ~ g ~ h ~ i ~ k ~ l -dI~ a ~ b ~ c ~ d ~ e ~ ~ g ~ h ~ i ~ k ~ l -di~ a ~ b ~ c ~ d ~ e ~~ g ~ h ~ i ~ k ~ l -da~ a ~ b ~ c ~ d ~ e ~ g ~ h ~ i ~ k ~ l -dA~ a ~ b ~ c ~ d ~ e g ~ h ~ i ~ k ~ l -dIn~ a ~ b ~ c ~ d ~ e ~ x ~ ~ h ~ i ~ k ~ l -din~ a ~ b ~ c ~ d ~ e ~ x ~~ h ~ i ~ k ~ l -dan~ a ~ b ~ c ~ d ~ e ~ x ~ h ~ i ~ k ~ l -dAn~ a ~ b ~ c ~ d ~ e ~ x h ~ i ~ k ~ l -dIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ ~ i ~ k ~ l -diN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~~ i ~ k ~ l -daN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ i ~ k ~ l -dAN~ a ~ b ~ c ~ d ~ e ~ x ~ g i ~ k ~ l -d1IL~ a ~ b ~ c ~ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d1iL~ a ~ b ~ c ~~ e ~ x ~ g ~ h ~ i ~ k ~ l -d1aL~ a ~ b ~ c ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d1AL~ a ~ b ~ c e ~ x ~ g ~ h ~ i ~ k ~ l -d1Il~ a ~ b ~ c ~ d ~ ~ x ~ g ~ h ~ i ~ k ~ l -d1il~ a ~ b ~ c ~ d ~~ x ~ g ~ h ~ i ~ k ~ l -d1al~ a ~ b ~ c ~ d ~ x ~ g ~ h ~ i ~ k ~ l -d1Al~ a ~ b ~ c ~ d x ~ g ~ h ~ i ~ k ~ l -d1I~ a ~ b ~ c ~ d ~ e ~ ~ g ~ h ~ i ~ k ~ l -d1i~ a ~ b ~ c ~ d ~ e ~~ g ~ h ~ i ~ k ~ l -d1a~ a ~ b ~ c ~ d ~ e ~ g ~ h ~ i ~ k ~ l -d1A~ a ~ b ~ c ~ d ~ e g ~ h ~ i ~ k ~ l -d1In~ a ~ b ~ c ~ d ~ e ~ x ~ ~ h ~ i ~ k ~ l -d1in~ a ~ b ~ c ~ d ~ e ~ x ~~ h ~ i ~ k ~ l -d1an~ a ~ b ~ c ~ d ~ e ~ x ~ h ~ i ~ k ~ l -d1An~ a ~ b ~ c ~ d ~ e ~ x h ~ i ~ k ~ l -d1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ ~ i ~ k ~ l -d1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~~ i ~ k ~ l -d1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ i ~ k ~ l -d1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g i ~ k ~ l -d2IL~ a ~ ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2iL~ a ~~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2aL~ a ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2AL~ a c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2Il~ a ~ b ~ c ~ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2il~ a ~ b ~ c ~~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2al~ a ~ b ~ c ~ e ~ x ~ g ~ h ~ i ~ k ~ l -d2Al~ a ~ b ~ c e ~ x ~ g ~ h ~ i ~ k ~ l -d2I~ a ~ b ~ c ~ d ~ e ~ ~ g ~ h ~ i ~ k ~ l -d2i~ a ~ b ~ c ~ d ~ e ~~ g ~ h ~ i ~ k ~ l -d2a~ a ~ b ~ c ~ d ~ e ~ g ~ h ~ i ~ k ~ l -d2A~ a ~ b ~ c ~ d ~ e g ~ h ~ i ~ k ~ l -d2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ ~ i ~ k ~ l -d2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~~ i ~ k ~ l -d2an~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ i ~ k ~ l -d2An~ a ~ b ~ c ~ d ~ e ~ x ~ g i ~ k ~ l -d2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ ~ l -d2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~~ l -d2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ l -d2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i l -yIL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'd' -yiL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' d ' -yaL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ' -yAL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ~ ' -yIl~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'e' -yil~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' e ' -yal~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ' -yAl~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ~ ' -yI~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'x' -yi~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' x ' -ya~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ' -yA~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ~ ' -yIn~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'g' -yin~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' g ' -yan~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ' -yAn~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ~ ' -yIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'h' -yiN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' h ' -yaN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ' -yAN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ~ ' -y1IL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'd' -y1iL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' d ' -y1aL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ' -y1AL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ~ ' -y1Il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'e' -y1il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' e ' -y1al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ' -y1Al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ e ~ ' -y1I~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'x' -y1i~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' x ' -y1a~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ' -y1A~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ~ ' -y1In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'g' -y1in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' g ' -y1an~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ' -y1An~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ g ~ ' -y1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'h' -y1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' h ' -y1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ' -y1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ~ ' -y2IL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'b' -y2iL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' b ' -y2aL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ b ' -y2AL~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ b ~ ' -y2Il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'd' -y2il~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' d ' -y2al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ' -y2Al~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ d ~ ' -y2I~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'x' -y2i~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' x ' -y2a~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ' -y2A~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ x ~ ' -y2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'h' -y2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' h ' -y2an~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ' -y2An~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ h ~ ' -y2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l 'k' -y2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l ' k ' -y2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ k ' -y2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l '~ k ~ ' -vIL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -viL~ a ~ b ~ c ~___~ e ~ x ~ g ~ h ~ i ~ k ~ l -vaL~ a ~ b ~ c ____~ e ~ x ~ g ~ h ~ i ~ k ~ l -vAL~ a ~ b ~ c ______e ~ x ~ g ~ h ~ i ~ k ~ l -vIl~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -vil~ a ~ b ~ c ~ d ~___~ x ~ g ~ h ~ i ~ k ~ l -val~ a ~ b ~ c ~ d ____~ x ~ g ~ h ~ i ~ k ~ l -vAl~ a ~ b ~ c ~ d ______x ~ g ~ h ~ i ~ k ~ l -vI~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -vi~ a ~ b ~ c ~ d ~ e ~___~ g ~ h ~ i ~ k ~ l -va~ a ~ b ~ c ~ d ~ e ____~ g ~ h ~ i ~ k ~ l -vA~ a ~ b ~ c ~ d ~ e ______g ~ h ~ i ~ k ~ l -vIn~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -vin~ a ~ b ~ c ~ d ~ e ~ x ~___~ h ~ i ~ k ~ l -van~ a ~ b ~ c ~ d ~ e ~ x ____~ h ~ i ~ k ~ l -vAn~ a ~ b ~ c ~ d ~ e ~ x ______h ~ i ~ k ~ l -vIN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -viN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~___~ i ~ k ~ l -vaN~ a ~ b ~ c ~ d ~ e ~ x ~ g ____~ i ~ k ~ l -vAN~ a ~ b ~ c ~ d ~ e ~ x ~ g ______i ~ k ~ l -v1IL~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v1iL~ a ~ b ~ c ~___~ e ~ x ~ g ~ h ~ i ~ k ~ l -v1aL~ a ~ b ~ c ____~ e ~ x ~ g ~ h ~ i ~ k ~ l -v1AL~ a ~ b ~ c ______e ~ x ~ g ~ h ~ i ~ k ~ l -v1Il~ a ~ b ~ c ~ d ~ _ ~ x ~ g ~ h ~ i ~ k ~ l -v1il~ a ~ b ~ c ~ d ~___~ x ~ g ~ h ~ i ~ k ~ l -v1al~ a ~ b ~ c ~ d ____~ x ~ g ~ h ~ i ~ k ~ l -v1Al~ a ~ b ~ c ~ d ______x ~ g ~ h ~ i ~ k ~ l -v1I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -v1i~ a ~ b ~ c ~ d ~ e ~___~ g ~ h ~ i ~ k ~ l -v1a~ a ~ b ~ c ~ d ~ e ____~ g ~ h ~ i ~ k ~ l -v1A~ a ~ b ~ c ~ d ~ e ______g ~ h ~ i ~ k ~ l -v1In~ a ~ b ~ c ~ d ~ e ~ x ~ _ ~ h ~ i ~ k ~ l -v1in~ a ~ b ~ c ~ d ~ e ~ x ~___~ h ~ i ~ k ~ l -v1an~ a ~ b ~ c ~ d ~ e ~ x ____~ h ~ i ~ k ~ l -v1An~ a ~ b ~ c ~ d ~ e ~ x ______h ~ i ~ k ~ l -v1IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -v1iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~___~ i ~ k ~ l -v1aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ____~ i ~ k ~ l -v1AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ______i ~ k ~ l -v2IL~ a ~ _ ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2iL~ a ~___~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2aL~ a ____~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2AL~ a ______c ~ d ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2Il~ a ~ b ~ c ~ _ ~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2il~ a ~ b ~ c ~___~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2al~ a ~ b ~ c ____~ e ~ x ~ g ~ h ~ i ~ k ~ l -v2Al~ a ~ b ~ c ______e ~ x ~ g ~ h ~ i ~ k ~ l -v2I~ a ~ b ~ c ~ d ~ e ~ _ ~ g ~ h ~ i ~ k ~ l -v2i~ a ~ b ~ c ~ d ~ e ~___~ g ~ h ~ i ~ k ~ l -v2a~ a ~ b ~ c ~ d ~ e ____~ g ~ h ~ i ~ k ~ l -v2A~ a ~ b ~ c ~ d ~ e ______g ~ h ~ i ~ k ~ l -v2In~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ _ ~ i ~ k ~ l -v2in~ a ~ b ~ c ~ d ~ e ~ x ~ g ~___~ i ~ k ~ l -v2an~ a ~ b ~ c ~ d ~ e ~ x ~ g ____~ i ~ k ~ l -v2An~ a ~ b ~ c ~ d ~ e ~ x ~ g ______i ~ k ~ l -v2IN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~ _ ~ l -v2iN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ~___~ l -v2aN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ____~ l -v2AN~ a ~ b ~ c ~ d ~ e ~ x ~ g ~ h ~ i ______l -a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l -cIL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -ciL_ a _ b _ c ___ e _ x _ g _ h _ i _ k _ l -caL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -cAL_ a _ b _ c _e _ x _ g _ h _ i _ k _ l -cIl_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -cil_ a _ b _ c _ d ___ x _ g _ h _ i _ k _ l -cal_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -cAl_ a _ b _ c _ d _x _ g _ h _ i _ k _ l -cI_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -ci_ a _ b _ c _ d _ e ___ g _ h _ i _ k _ l -ca_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -cA_ a _ b _ c _ d _ e _g _ h _ i _ k _ l -cIn_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -cin_ a _ b _ c _ d _ e _ x ___ h _ i _ k _ l -can_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -cAn_ a _ b _ c _ d _ e _ x _h _ i _ k _ l -cIN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -ciN_ a _ b _ c _ d _ e _ x _ g ___ i _ k _ l -caN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -cAN_ a _ b _ c _ d _ e _ x _ g _i _ k _ l -c1IL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -c1iL_ a _ b _ c ___ e _ x _ g _ h _ i _ k _ l -c1aL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -c1AL_ a _ b _ c _e _ x _ g _ h _ i _ k _ l -c1Il_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -c1il_ a _ b _ c _ d ___ x _ g _ h _ i _ k _ l -c1al_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -c1Al_ a _ b _ c _ d _x _ g _ h _ i _ k _ l -c1I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -c1i_ a _ b _ c _ d _ e ___ g _ h _ i _ k _ l -c1a_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -c1A_ a _ b _ c _ d _ e _g _ h _ i _ k _ l -c1In_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -c1in_ a _ b _ c _ d _ e _ x ___ h _ i _ k _ l -c1an_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -c1An_ a _ b _ c _ d _ e _ x _h _ i _ k _ l -c1IN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -c1iN_ a _ b _ c _ d _ e _ x _ g ___ i _ k _ l -c1aN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -c1AN_ a _ b _ c _ d _ e _ x _ g _i _ k _ l -c2IL_ a _ _ _ c _ d _ e _ x _ g _ h _ i _ k _ l -c2iL_ a ___ c _ d _ e _ x _ g _ h _ i _ k _ l -c2aL_ a __ c _ d _ e _ x _ g _ h _ i _ k _ l -c2AL_ a _c _ d _ e _ x _ g _ h _ i _ k _ l -c2Il_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -c2il_ a _ b _ c ___ e _ x _ g _ h _ i _ k _ l -c2al_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -c2Al_ a _ b _ c _e _ x _ g _ h _ i _ k _ l -c2I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -c2i_ a _ b _ c _ d _ e ___ g _ h _ i _ k _ l -c2a_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -c2A_ a _ b _ c _ d _ e _g _ h _ i _ k _ l -c2In_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -c2in_ a _ b _ c _ d _ e _ x _ g ___ i _ k _ l -c2an_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -c2An_ a _ b _ c _ d _ e _ x _ g _i _ k _ l -c2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ _ _ l -c2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i ___ l -c2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i __ l -c2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i _l -dIL_ a _ b _ c _ _ e _ x _ g _ h _ i _ k _ l -diL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -daL_ a _ b _ c _ e _ x _ g _ h _ i _ k _ l -dAL_ a _ b _ c e _ x _ g _ h _ i _ k _ l -dIl_ a _ b _ c _ d _ _ x _ g _ h _ i _ k _ l -dil_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -dal_ a _ b _ c _ d _ x _ g _ h _ i _ k _ l -dAl_ a _ b _ c _ d x _ g _ h _ i _ k _ l -dI_ a _ b _ c _ d _ e _ _ g _ h _ i _ k _ l -di_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -da_ a _ b _ c _ d _ e _ g _ h _ i _ k _ l -dA_ a _ b _ c _ d _ e g _ h _ i _ k _ l -dIn_ a _ b _ c _ d _ e _ x _ _ h _ i _ k _ l -din_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -dan_ a _ b _ c _ d _ e _ x _ h _ i _ k _ l -dAn_ a _ b _ c _ d _ e _ x h _ i _ k _ l -dIN_ a _ b _ c _ d _ e _ x _ g _ _ i _ k _ l -diN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -daN_ a _ b _ c _ d _ e _ x _ g _ i _ k _ l -dAN_ a _ b _ c _ d _ e _ x _ g i _ k _ l -d1IL_ a _ b _ c _ _ e _ x _ g _ h _ i _ k _ l -d1iL_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -d1aL_ a _ b _ c _ e _ x _ g _ h _ i _ k _ l -d1AL_ a _ b _ c e _ x _ g _ h _ i _ k _ l -d1Il_ a _ b _ c _ d _ _ x _ g _ h _ i _ k _ l -d1il_ a _ b _ c _ d __ x _ g _ h _ i _ k _ l -d1al_ a _ b _ c _ d _ x _ g _ h _ i _ k _ l -d1Al_ a _ b _ c _ d x _ g _ h _ i _ k _ l -d1I_ a _ b _ c _ d _ e _ _ g _ h _ i _ k _ l -d1i_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -d1a_ a _ b _ c _ d _ e _ g _ h _ i _ k _ l -d1A_ a _ b _ c _ d _ e g _ h _ i _ k _ l -d1In_ a _ b _ c _ d _ e _ x _ _ h _ i _ k _ l -d1in_ a _ b _ c _ d _ e _ x __ h _ i _ k _ l -d1an_ a _ b _ c _ d _ e _ x _ h _ i _ k _ l -d1An_ a _ b _ c _ d _ e _ x h _ i _ k _ l -d1IN_ a _ b _ c _ d _ e _ x _ g _ _ i _ k _ l -d1iN_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -d1aN_ a _ b _ c _ d _ e _ x _ g _ i _ k _ l -d1AN_ a _ b _ c _ d _ e _ x _ g i _ k _ l -d2IL_ a _ _ c _ d _ e _ x _ g _ h _ i _ k _ l -d2iL_ a __ c _ d _ e _ x _ g _ h _ i _ k _ l -d2aL_ a _ c _ d _ e _ x _ g _ h _ i _ k _ l -d2AL_ a c _ d _ e _ x _ g _ h _ i _ k _ l -d2Il_ a _ b _ c _ _ e _ x _ g _ h _ i _ k _ l -d2il_ a _ b _ c __ e _ x _ g _ h _ i _ k _ l -d2al_ a _ b _ c _ e _ x _ g _ h _ i _ k _ l -d2Al_ a _ b _ c e _ x _ g _ h _ i _ k _ l -d2I_ a _ b _ c _ d _ e _ _ g _ h _ i _ k _ l -d2i_ a _ b _ c _ d _ e __ g _ h _ i _ k _ l -d2a_ a _ b _ c _ d _ e _ g _ h _ i _ k _ l -d2A_ a _ b _ c _ d _ e g _ h _ i _ k _ l -d2In_ a _ b _ c _ d _ e _ x _ g _ _ i _ k _ l -d2in_ a _ b _ c _ d _ e _ x _ g __ i _ k _ l -d2an_ a _ b _ c _ d _ e _ x _ g _ i _ k _ l -d2An_ a _ b _ c _ d _ e _ x _ g i _ k _ l -d2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ _ l -d2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i __ l -d2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ l -d2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i l -yIL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'd' -yiL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' d ' -yaL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d ' -yAL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d _ ' -yIl_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'e' -yil_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' e ' -yal_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e ' -yAl_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e _ ' -yI_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'x' -yi_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' x ' -ya_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x ' -yA_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x _ ' -yIn_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'g' -yin_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' g ' -yan_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g ' -yAn_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g _ ' -yIN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'h' -yiN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' h ' -yaN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h ' -yAN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h _ ' -y1IL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'd' -y1iL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' d ' -y1aL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d ' -y1AL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d _ ' -y1Il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'e' -y1il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' e ' -y1al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e ' -y1Al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ e _ ' -y1I_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'x' -y1i_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' x ' -y1a_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x ' -y1A_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x _ ' -y1In_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'g' -y1in_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' g ' -y1an_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g ' -y1An_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ g _ ' -y1IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'h' -y1iN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' h ' -y1aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h ' -y1AN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h _ ' -y2IL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'b' -y2iL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' b ' -y2aL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ b ' -y2AL_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ b _ ' -y2Il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'd' -y2il_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' d ' -y2al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d ' -y2Al_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ d _ ' -y2I_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'x' -y2i_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' x ' -y2a_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x ' -y2A_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ x _ ' -y2In_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'h' -y2in_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' h ' -y2an_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h ' -y2An_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ h _ ' -y2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l 'k' -y2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l ' k ' -y2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ k ' -y2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ k _ l '_ k _ ' -vIL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -viL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -vaL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -vAL_ a _ b _ c ______e _ x _ g _ h _ i _ k _ l -vIl_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -vil_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -val_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -vAl_ a _ b _ c _ d ______x _ g _ h _ i _ k _ l -vI_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -vi_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -va_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -vA_ a _ b _ c _ d _ e ______g _ h _ i _ k _ l -vIn_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -vin_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -van_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -vAn_ a _ b _ c _ d _ e _ x ______h _ i _ k _ l -vIN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -viN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -vaN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -vAN_ a _ b _ c _ d _ e _ x _ g ______i _ k _ l -v1IL_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -v1iL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v1aL_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v1AL_ a _ b _ c ______e _ x _ g _ h _ i _ k _ l -v1Il_ a _ b _ c _ d _ _ _ x _ g _ h _ i _ k _ l -v1il_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -v1al_ a _ b _ c _ d _____ x _ g _ h _ i _ k _ l -v1Al_ a _ b _ c _ d ______x _ g _ h _ i _ k _ l -v1I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -v1i_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v1a_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v1A_ a _ b _ c _ d _ e ______g _ h _ i _ k _ l -v1In_ a _ b _ c _ d _ e _ x _ _ _ h _ i _ k _ l -v1in_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -v1an_ a _ b _ c _ d _ e _ x _____ h _ i _ k _ l -v1An_ a _ b _ c _ d _ e _ x ______h _ i _ k _ l -v1IN_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -v1iN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v1aN_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v1AN_ a _ b _ c _ d _ e _ x _ g ______i _ k _ l -v2IL_ a _ _ _ c _ d _ e _ x _ g _ h _ i _ k _ l -v2iL_ a _____ c _ d _ e _ x _ g _ h _ i _ k _ l -v2aL_ a _____ c _ d _ e _ x _ g _ h _ i _ k _ l -v2AL_ a ______c _ d _ e _ x _ g _ h _ i _ k _ l -v2Il_ a _ b _ c _ _ _ e _ x _ g _ h _ i _ k _ l -v2il_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v2al_ a _ b _ c _____ e _ x _ g _ h _ i _ k _ l -v2Al_ a _ b _ c ______e _ x _ g _ h _ i _ k _ l -v2I_ a _ b _ c _ d _ e _ _ _ g _ h _ i _ k _ l -v2i_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v2a_ a _ b _ c _ d _ e _____ g _ h _ i _ k _ l -v2A_ a _ b _ c _ d _ e ______g _ h _ i _ k _ l -v2In_ a _ b _ c _ d _ e _ x _ g _ _ _ i _ k _ l -v2in_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v2an_ a _ b _ c _ d _ e _ x _ g _____ i _ k _ l -v2An_ a _ b _ c _ d _ e _ x _ g ______i _ k _ l -v2IN_ a _ b _ c _ d _ e _ x _ g _ h _ i _ _ _ l -v2iN_ a _ b _ c _ d _ e _ x _ g _ h _ i _____ l -v2aN_ a _ b _ c _ d _ e _ x _ g _ h _ i _____ l -v2AN_ a _ b _ c _ d _ e _ x _ g _ h _ i ______l -a * b * c * d * e * x * g * h * i * k * l -cIL* a * b * c * _ * e * x * g * h * i * k * l -ciL* a * b * c *_* e * x * g * h * i * k * l -caL* a * b * c _* e * x * g * h * i * k * l -cAL* a * b * c _e * x * g * h * i * k * l -cIl* a * b * c * d * _ * x * g * h * i * k * l -cil* a * b * c * d *_* x * g * h * i * k * l -cal* a * b * c * d _* x * g * h * i * k * l -cAl* a * b * c * d _x * g * h * i * k * l -cI* a * b * c * d * e * _ * g * h * i * k * l -ci* a * b * c * d * e *_* g * h * i * k * l -ca* a * b * c * d * e _* g * h * i * k * l -cA* a * b * c * d * e _g * h * i * k * l -cIn* a * b * c * d * e * x * _ * h * i * k * l -cin* a * b * c * d * e * x *_* h * i * k * l -can* a * b * c * d * e * x _* h * i * k * l -cAn* a * b * c * d * e * x _h * i * k * l -cIN* a * b * c * d * e * x * g * _ * i * k * l -ciN* a * b * c * d * e * x * g *_* i * k * l -caN* a * b * c * d * e * x * g _* i * k * l -cAN* a * b * c * d * e * x * g _i * k * l -c1IL* a * b * c * _ * e * x * g * h * i * k * l -c1iL* a * b * c *_* e * x * g * h * i * k * l -c1aL* a * b * c _* e * x * g * h * i * k * l -c1AL* a * b * c _e * x * g * h * i * k * l -c1Il* a * b * c * d * _ * x * g * h * i * k * l -c1il* a * b * c * d *_* x * g * h * i * k * l -c1al* a * b * c * d _* x * g * h * i * k * l -c1Al* a * b * c * d _x * g * h * i * k * l -c1I* a * b * c * d * e * _ * g * h * i * k * l -c1i* a * b * c * d * e *_* g * h * i * k * l -c1a* a * b * c * d * e _* g * h * i * k * l -c1A* a * b * c * d * e _g * h * i * k * l -c1In* a * b * c * d * e * x * _ * h * i * k * l -c1in* a * b * c * d * e * x *_* h * i * k * l -c1an* a * b * c * d * e * x _* h * i * k * l -c1An* a * b * c * d * e * x _h * i * k * l -c1IN* a * b * c * d * e * x * g * _ * i * k * l -c1iN* a * b * c * d * e * x * g *_* i * k * l -c1aN* a * b * c * d * e * x * g _* i * k * l -c1AN* a * b * c * d * e * x * g _i * k * l -c2IL* a * _ * c * d * e * x * g * h * i * k * l -c2iL* a *_* c * d * e * x * g * h * i * k * l -c2aL* a _* c * d * e * x * g * h * i * k * l -c2AL* a _c * d * e * x * g * h * i * k * l -c2Il* a * b * c * _ * e * x * g * h * i * k * l -c2il* a * b * c *_* e * x * g * h * i * k * l -c2al* a * b * c _* e * x * g * h * i * k * l -c2Al* a * b * c _e * x * g * h * i * k * l -c2I* a * b * c * d * e * _ * g * h * i * k * l -c2i* a * b * c * d * e *_* g * h * i * k * l -c2a* a * b * c * d * e _* g * h * i * k * l -c2A* a * b * c * d * e _g * h * i * k * l -c2In* a * b * c * d * e * x * g * _ * i * k * l -c2in* a * b * c * d * e * x * g *_* i * k * l -c2an* a * b * c * d * e * x * g _* i * k * l -c2An* a * b * c * d * e * x * g _i * k * l -c2IN* a * b * c * d * e * x * g * h * i * _ * l -c2iN* a * b * c * d * e * x * g * h * i *_* l -c2aN* a * b * c * d * e * x * g * h * i _* l -c2AN* a * b * c * d * e * x * g * h * i _l -dIL* a * b * c * * e * x * g * h * i * k * l -diL* a * b * c ** e * x * g * h * i * k * l -daL* a * b * c * e * x * g * h * i * k * l -dAL* a * b * c e * x * g * h * i * k * l -dIl* a * b * c * d * * x * g * h * i * k * l -dil* a * b * c * d ** x * g * h * i * k * l -dal* a * b * c * d * x * g * h * i * k * l -dAl* a * b * c * d x * g * h * i * k * l -dI* a * b * c * d * e * * g * h * i * k * l -di* a * b * c * d * e ** g * h * i * k * l -da* a * b * c * d * e * g * h * i * k * l -dA* a * b * c * d * e g * h * i * k * l -dIn* a * b * c * d * e * x * * h * i * k * l -din* a * b * c * d * e * x ** h * i * k * l -dan* a * b * c * d * e * x * h * i * k * l -dAn* a * b * c * d * e * x h * i * k * l -dIN* a * b * c * d * e * x * g * * i * k * l -diN* a * b * c * d * e * x * g ** i * k * l -daN* a * b * c * d * e * x * g * i * k * l -dAN* a * b * c * d * e * x * g i * k * l -d1IL* a * b * c * * e * x * g * h * i * k * l -d1iL* a * b * c ** e * x * g * h * i * k * l -d1aL* a * b * c * e * x * g * h * i * k * l -d1AL* a * b * c e * x * g * h * i * k * l -d1Il* a * b * c * d * * x * g * h * i * k * l -d1il* a * b * c * d ** x * g * h * i * k * l -d1al* a * b * c * d * x * g * h * i * k * l -d1Al* a * b * c * d x * g * h * i * k * l -d1I* a * b * c * d * e * * g * h * i * k * l -d1i* a * b * c * d * e ** g * h * i * k * l -d1a* a * b * c * d * e * g * h * i * k * l -d1A* a * b * c * d * e g * h * i * k * l -d1In* a * b * c * d * e * x * * h * i * k * l -d1in* a * b * c * d * e * x ** h * i * k * l -d1an* a * b * c * d * e * x * h * i * k * l -d1An* a * b * c * d * e * x h * i * k * l -d1IN* a * b * c * d * e * x * g * * i * k * l -d1iN* a * b * c * d * e * x * g ** i * k * l -d1aN* a * b * c * d * e * x * g * i * k * l -d1AN* a * b * c * d * e * x * g i * k * l -d2IL* a * * c * d * e * x * g * h * i * k * l -d2iL* a ** c * d * e * x * g * h * i * k * l -d2aL* a * c * d * e * x * g * h * i * k * l -d2AL* a c * d * e * x * g * h * i * k * l -d2Il* a * b * c * * e * x * g * h * i * k * l -d2il* a * b * c ** e * x * g * h * i * k * l -d2al* a * b * c * e * x * g * h * i * k * l -d2Al* a * b * c e * x * g * h * i * k * l -d2I* a * b * c * d * e * * g * h * i * k * l -d2i* a * b * c * d * e ** g * h * i * k * l -d2a* a * b * c * d * e * g * h * i * k * l -d2A* a * b * c * d * e g * h * i * k * l -d2In* a * b * c * d * e * x * g * * i * k * l -d2in* a * b * c * d * e * x * g ** i * k * l -d2an* a * b * c * d * e * x * g * i * k * l -d2An* a * b * c * d * e * x * g i * k * l -d2IN* a * b * c * d * e * x * g * h * i * * l -d2iN* a * b * c * d * e * x * g * h * i ** l -d2aN* a * b * c * d * e * x * g * h * i * l -d2AN* a * b * c * d * e * x * g * h * i l -yIL* a * b * c * d * e * x * g * h * i * k * l 'd' -yiL* a * b * c * d * e * x * g * h * i * k * l ' d ' -yaL* a * b * c * d * e * x * g * h * i * k * l '* d ' -yAL* a * b * c * d * e * x * g * h * i * k * l '* d * ' -yIl* a * b * c * d * e * x * g * h * i * k * l 'e' -yil* a * b * c * d * e * x * g * h * i * k * l ' e ' -yal* a * b * c * d * e * x * g * h * i * k * l '* e ' -yAl* a * b * c * d * e * x * g * h * i * k * l '* e * ' -yI* a * b * c * d * e * x * g * h * i * k * l 'x' -yi* a * b * c * d * e * x * g * h * i * k * l ' x ' -ya* a * b * c * d * e * x * g * h * i * k * l '* x ' -yA* a * b * c * d * e * x * g * h * i * k * l '* x * ' -yIn* a * b * c * d * e * x * g * h * i * k * l 'g' -yin* a * b * c * d * e * x * g * h * i * k * l ' g ' -yan* a * b * c * d * e * x * g * h * i * k * l '* g ' -yAn* a * b * c * d * e * x * g * h * i * k * l '* g * ' -yIN* a * b * c * d * e * x * g * h * i * k * l 'h' -yiN* a * b * c * d * e * x * g * h * i * k * l ' h ' -yaN* a * b * c * d * e * x * g * h * i * k * l '* h ' -yAN* a * b * c * d * e * x * g * h * i * k * l '* h * ' -y1IL* a * b * c * d * e * x * g * h * i * k * l 'd' -y1iL* a * b * c * d * e * x * g * h * i * k * l ' d ' -y1aL* a * b * c * d * e * x * g * h * i * k * l '* d ' -y1AL* a * b * c * d * e * x * g * h * i * k * l '* d * ' -y1Il* a * b * c * d * e * x * g * h * i * k * l 'e' -y1il* a * b * c * d * e * x * g * h * i * k * l ' e ' -y1al* a * b * c * d * e * x * g * h * i * k * l '* e ' -y1Al* a * b * c * d * e * x * g * h * i * k * l '* e * ' -y1I* a * b * c * d * e * x * g * h * i * k * l 'x' -y1i* a * b * c * d * e * x * g * h * i * k * l ' x ' -y1a* a * b * c * d * e * x * g * h * i * k * l '* x ' -y1A* a * b * c * d * e * x * g * h * i * k * l '* x * ' -y1In* a * b * c * d * e * x * g * h * i * k * l 'g' -y1in* a * b * c * d * e * x * g * h * i * k * l ' g ' -y1an* a * b * c * d * e * x * g * h * i * k * l '* g ' -y1An* a * b * c * d * e * x * g * h * i * k * l '* g * ' -y1IN* a * b * c * d * e * x * g * h * i * k * l 'h' -y1iN* a * b * c * d * e * x * g * h * i * k * l ' h ' -y1aN* a * b * c * d * e * x * g * h * i * k * l '* h ' -y1AN* a * b * c * d * e * x * g * h * i * k * l '* h * ' -y2IL* a * b * c * d * e * x * g * h * i * k * l 'b' -y2iL* a * b * c * d * e * x * g * h * i * k * l ' b ' -y2aL* a * b * c * d * e * x * g * h * i * k * l '* b ' -y2AL* a * b * c * d * e * x * g * h * i * k * l '* b * ' -y2Il* a * b * c * d * e * x * g * h * i * k * l 'd' -y2il* a * b * c * d * e * x * g * h * i * k * l ' d ' -y2al* a * b * c * d * e * x * g * h * i * k * l '* d ' -y2Al* a * b * c * d * e * x * g * h * i * k * l '* d * ' -y2I* a * b * c * d * e * x * g * h * i * k * l 'x' -y2i* a * b * c * d * e * x * g * h * i * k * l ' x ' -y2a* a * b * c * d * e * x * g * h * i * k * l '* x ' -y2A* a * b * c * d * e * x * g * h * i * k * l '* x * ' -y2In* a * b * c * d * e * x * g * h * i * k * l 'h' -y2in* a * b * c * d * e * x * g * h * i * k * l ' h ' -y2an* a * b * c * d * e * x * g * h * i * k * l '* h ' -y2An* a * b * c * d * e * x * g * h * i * k * l '* h * ' -y2IN* a * b * c * d * e * x * g * h * i * k * l 'k' -y2iN* a * b * c * d * e * x * g * h * i * k * l ' k ' -y2aN* a * b * c * d * e * x * g * h * i * k * l '* k ' -y2AN* a * b * c * d * e * x * g * h * i * k * l '* k * ' -vIL* a * b * c * _ * e * x * g * h * i * k * l -viL* a * b * c *___* e * x * g * h * i * k * l -vaL* a * b * c ____* e * x * g * h * i * k * l -vAL* a * b * c ______e * x * g * h * i * k * l -vIl* a * b * c * d * _ * x * g * h * i * k * l -vil* a * b * c * d *___* x * g * h * i * k * l -val* a * b * c * d ____* x * g * h * i * k * l -vAl* a * b * c * d ______x * g * h * i * k * l -vI* a * b * c * d * e * _ * g * h * i * k * l -vi* a * b * c * d * e *___* g * h * i * k * l -va* a * b * c * d * e ____* g * h * i * k * l -vA* a * b * c * d * e ______g * h * i * k * l -vIn* a * b * c * d * e * x * _ * h * i * k * l -vin* a * b * c * d * e * x *___* h * i * k * l -van* a * b * c * d * e * x ____* h * i * k * l -vAn* a * b * c * d * e * x ______h * i * k * l -vIN* a * b * c * d * e * x * g * _ * i * k * l -viN* a * b * c * d * e * x * g *___* i * k * l -vaN* a * b * c * d * e * x * g ____* i * k * l -vAN* a * b * c * d * e * x * g ______i * k * l -v1IL* a * b * c * _ * e * x * g * h * i * k * l -v1iL* a * b * c *___* e * x * g * h * i * k * l -v1aL* a * b * c ____* e * x * g * h * i * k * l -v1AL* a * b * c ______e * x * g * h * i * k * l -v1Il* a * b * c * d * _ * x * g * h * i * k * l -v1il* a * b * c * d *___* x * g * h * i * k * l -v1al* a * b * c * d ____* x * g * h * i * k * l -v1Al* a * b * c * d ______x * g * h * i * k * l -v1I* a * b * c * d * e * _ * g * h * i * k * l -v1i* a * b * c * d * e *___* g * h * i * k * l -v1a* a * b * c * d * e ____* g * h * i * k * l -v1A* a * b * c * d * e ______g * h * i * k * l -v1In* a * b * c * d * e * x * _ * h * i * k * l -v1in* a * b * c * d * e * x *___* h * i * k * l -v1an* a * b * c * d * e * x ____* h * i * k * l -v1An* a * b * c * d * e * x ______h * i * k * l -v1IN* a * b * c * d * e * x * g * _ * i * k * l -v1iN* a * b * c * d * e * x * g *___* i * k * l -v1aN* a * b * c * d * e * x * g ____* i * k * l -v1AN* a * b * c * d * e * x * g ______i * k * l -v2IL* a * _ * c * d * e * x * g * h * i * k * l -v2iL* a *___* c * d * e * x * g * h * i * k * l -v2aL* a ____* c * d * e * x * g * h * i * k * l -v2AL* a ______c * d * e * x * g * h * i * k * l -v2Il* a * b * c * _ * e * x * g * h * i * k * l -v2il* a * b * c *___* e * x * g * h * i * k * l -v2al* a * b * c ____* e * x * g * h * i * k * l -v2Al* a * b * c ______e * x * g * h * i * k * l -v2I* a * b * c * d * e * _ * g * h * i * k * l -v2i* a * b * c * d * e *___* g * h * i * k * l -v2a* a * b * c * d * e ____* g * h * i * k * l -v2A* a * b * c * d * e ______g * h * i * k * l -v2In* a * b * c * d * e * x * g * _ * i * k * l -v2in* a * b * c * d * e * x * g *___* i * k * l -v2an* a * b * c * d * e * x * g ____* i * k * l -v2An* a * b * c * d * e * x * g ______i * k * l -v2IN* a * b * c * d * e * x * g * h * i * _ * l -v2iN* a * b * c * d * e * x * g * h * i *___* l -v2aN* a * b * c * d * e * x * g * h * i ____* l -v2AN* a * b * c * d * e * x * g * h * i ______l -a # b # c # d # e # x # g # h # i # k # l -cIL# a # b # c # _ # e # x # g # h # i # k # l -ciL# a # b # c #_# e # x # g # h # i # k # l -caL# a # b # c _# e # x # g # h # i # k # l -cAL# a # b # c _e # x # g # h # i # k # l -cIl# a # b # c # d # _ # x # g # h # i # k # l -cil# a # b # c # d #_# x # g # h # i # k # l -cal# a # b # c # d _# x # g # h # i # k # l -cAl# a # b # c # d _x # g # h # i # k # l -cI# a # b # c # d # e # _ # g # h # i # k # l -ci# a # b # c # d # e #_# g # h # i # k # l -ca# a # b # c # d # e _# g # h # i # k # l -cA# a # b # c # d # e _g # h # i # k # l -cIn# a # b # c # d # e # x # _ # h # i # k # l -cin# a # b # c # d # e # x #_# h # i # k # l -can# a # b # c # d # e # x _# h # i # k # l -cAn# a # b # c # d # e # x _h # i # k # l -cIN# a # b # c # d # e # x # g # _ # i # k # l -ciN# a # b # c # d # e # x # g #_# i # k # l -caN# a # b # c # d # e # x # g _# i # k # l -cAN# a # b # c # d # e # x # g _i # k # l -c1IL# a # b # c # _ # e # x # g # h # i # k # l -c1iL# a # b # c #_# e # x # g # h # i # k # l -c1aL# a # b # c _# e # x # g # h # i # k # l -c1AL# a # b # c _e # x # g # h # i # k # l -c1Il# a # b # c # d # _ # x # g # h # i # k # l -c1il# a # b # c # d #_# x # g # h # i # k # l -c1al# a # b # c # d _# x # g # h # i # k # l -c1Al# a # b # c # d _x # g # h # i # k # l -c1I# a # b # c # d # e # _ # g # h # i # k # l -c1i# a # b # c # d # e #_# g # h # i # k # l -c1a# a # b # c # d # e _# g # h # i # k # l -c1A# a # b # c # d # e _g # h # i # k # l -c1In# a # b # c # d # e # x # _ # h # i # k # l -c1in# a # b # c # d # e # x #_# h # i # k # l -c1an# a # b # c # d # e # x _# h # i # k # l -c1An# a # b # c # d # e # x _h # i # k # l -c1IN# a # b # c # d # e # x # g # _ # i # k # l -c1iN# a # b # c # d # e # x # g #_# i # k # l -c1aN# a # b # c # d # e # x # g _# i # k # l -c1AN# a # b # c # d # e # x # g _i # k # l -c2IL# a # _ # c # d # e # x # g # h # i # k # l -c2iL# a #_# c # d # e # x # g # h # i # k # l -c2aL# a _# c # d # e # x # g # h # i # k # l -c2AL# a _c # d # e # x # g # h # i # k # l -c2Il# a # b # c # _ # e # x # g # h # i # k # l -c2il# a # b # c #_# e # x # g # h # i # k # l -c2al# a # b # c _# e # x # g # h # i # k # l -c2Al# a # b # c _e # x # g # h # i # k # l -c2I# a # b # c # d # e # _ # g # h # i # k # l -c2i# a # b # c # d # e #_# g # h # i # k # l -c2a# a # b # c # d # e _# g # h # i # k # l -c2A# a # b # c # d # e _g # h # i # k # l -c2In# a # b # c # d # e # x # g # _ # i # k # l -c2in# a # b # c # d # e # x # g #_# i # k # l -c2an# a # b # c # d # e # x # g _# i # k # l -c2An# a # b # c # d # e # x # g _i # k # l -c2IN# a # b # c # d # e # x # g # h # i # _ # l -c2iN# a # b # c # d # e # x # g # h # i #_# l -c2aN# a # b # c # d # e # x # g # h # i _# l -c2AN# a # b # c # d # e # x # g # h # i _l -dIL# a # b # c # # e # x # g # h # i # k # l -diL# a # b # c ## e # x # g # h # i # k # l -daL# a # b # c # e # x # g # h # i # k # l -dAL# a # b # c e # x # g # h # i # k # l -dIl# a # b # c # d # # x # g # h # i # k # l -dil# a # b # c # d ## x # g # h # i # k # l -dal# a # b # c # d # x # g # h # i # k # l -dAl# a # b # c # d x # g # h # i # k # l -dI# a # b # c # d # e # # g # h # i # k # l -di# a # b # c # d # e ## g # h # i # k # l -da# a # b # c # d # e # g # h # i # k # l -dA# a # b # c # d # e g # h # i # k # l -dIn# a # b # c # d # e # x # # h # i # k # l -din# a # b # c # d # e # x ## h # i # k # l -dan# a # b # c # d # e # x # h # i # k # l -dAn# a # b # c # d # e # x h # i # k # l -dIN# a # b # c # d # e # x # g # # i # k # l -diN# a # b # c # d # e # x # g ## i # k # l -daN# a # b # c # d # e # x # g # i # k # l -dAN# a # b # c # d # e # x # g i # k # l -d1IL# a # b # c # # e # x # g # h # i # k # l -d1iL# a # b # c ## e # x # g # h # i # k # l -d1aL# a # b # c # e # x # g # h # i # k # l -d1AL# a # b # c e # x # g # h # i # k # l -d1Il# a # b # c # d # # x # g # h # i # k # l -d1il# a # b # c # d ## x # g # h # i # k # l -d1al# a # b # c # d # x # g # h # i # k # l -d1Al# a # b # c # d x # g # h # i # k # l -d1I# a # b # c # d # e # # g # h # i # k # l -d1i# a # b # c # d # e ## g # h # i # k # l -d1a# a # b # c # d # e # g # h # i # k # l -d1A# a # b # c # d # e g # h # i # k # l -d1In# a # b # c # d # e # x # # h # i # k # l -d1in# a # b # c # d # e # x ## h # i # k # l -d1an# a # b # c # d # e # x # h # i # k # l -d1An# a # b # c # d # e # x h # i # k # l -d1IN# a # b # c # d # e # x # g # # i # k # l -d1iN# a # b # c # d # e # x # g ## i # k # l -d1aN# a # b # c # d # e # x # g # i # k # l -d1AN# a # b # c # d # e # x # g i # k # l -d2IL# a # # c # d # e # x # g # h # i # k # l -d2iL# a ## c # d # e # x # g # h # i # k # l -d2aL# a # c # d # e # x # g # h # i # k # l -d2AL# a c # d # e # x # g # h # i # k # l -d2Il# a # b # c # # e # x # g # h # i # k # l -d2il# a # b # c ## e # x # g # h # i # k # l -d2al# a # b # c # e # x # g # h # i # k # l -d2Al# a # b # c e # x # g # h # i # k # l -d2I# a # b # c # d # e # # g # h # i # k # l -d2i# a # b # c # d # e ## g # h # i # k # l -d2a# a # b # c # d # e # g # h # i # k # l -d2A# a # b # c # d # e g # h # i # k # l -d2In# a # b # c # d # e # x # g # # i # k # l -d2in# a # b # c # d # e # x # g ## i # k # l -d2an# a # b # c # d # e # x # g # i # k # l -d2An# a # b # c # d # e # x # g i # k # l -d2IN# a # b # c # d # e # x # g # h # i # # l -d2iN# a # b # c # d # e # x # g # h # i ## l -d2aN# a # b # c # d # e # x # g # h # i # l -d2AN# a # b # c # d # e # x # g # h # i l -yIL# a # b # c # d # e # x # g # h # i # k # l 'd' -yiL# a # b # c # d # e # x # g # h # i # k # l ' d ' -yaL# a # b # c # d # e # x # g # h # i # k # l '# d ' -yAL# a # b # c # d # e # x # g # h # i # k # l '# d # ' -yIl# a # b # c # d # e # x # g # h # i # k # l 'e' -yil# a # b # c # d # e # x # g # h # i # k # l ' e ' -yal# a # b # c # d # e # x # g # h # i # k # l '# e ' -yAl# a # b # c # d # e # x # g # h # i # k # l '# e # ' -yI# a # b # c # d # e # x # g # h # i # k # l 'x' -yi# a # b # c # d # e # x # g # h # i # k # l ' x ' -ya# a # b # c # d # e # x # g # h # i # k # l '# x ' -yA# a # b # c # d # e # x # g # h # i # k # l '# x # ' -yIn# a # b # c # d # e # x # g # h # i # k # l 'g' -yin# a # b # c # d # e # x # g # h # i # k # l ' g ' -yan# a # b # c # d # e # x # g # h # i # k # l '# g ' -yAn# a # b # c # d # e # x # g # h # i # k # l '# g # ' -yIN# a # b # c # d # e # x # g # h # i # k # l 'h' -yiN# a # b # c # d # e # x # g # h # i # k # l ' h ' -yaN# a # b # c # d # e # x # g # h # i # k # l '# h ' -yAN# a # b # c # d # e # x # g # h # i # k # l '# h # ' -y1IL# a # b # c # d # e # x # g # h # i # k # l 'd' -y1iL# a # b # c # d # e # x # g # h # i # k # l ' d ' -y1aL# a # b # c # d # e # x # g # h # i # k # l '# d ' -y1AL# a # b # c # d # e # x # g # h # i # k # l '# d # ' -y1Il# a # b # c # d # e # x # g # h # i # k # l 'e' -y1il# a # b # c # d # e # x # g # h # i # k # l ' e ' -y1al# a # b # c # d # e # x # g # h # i # k # l '# e ' -y1Al# a # b # c # d # e # x # g # h # i # k # l '# e # ' -y1I# a # b # c # d # e # x # g # h # i # k # l 'x' -y1i# a # b # c # d # e # x # g # h # i # k # l ' x ' -y1a# a # b # c # d # e # x # g # h # i # k # l '# x ' -y1A# a # b # c # d # e # x # g # h # i # k # l '# x # ' -y1In# a # b # c # d # e # x # g # h # i # k # l 'g' -y1in# a # b # c # d # e # x # g # h # i # k # l ' g ' -y1an# a # b # c # d # e # x # g # h # i # k # l '# g ' -y1An# a # b # c # d # e # x # g # h # i # k # l '# g # ' -y1IN# a # b # c # d # e # x # g # h # i # k # l 'h' -y1iN# a # b # c # d # e # x # g # h # i # k # l ' h ' -y1aN# a # b # c # d # e # x # g # h # i # k # l '# h ' -y1AN# a # b # c # d # e # x # g # h # i # k # l '# h # ' -y2IL# a # b # c # d # e # x # g # h # i # k # l 'b' -y2iL# a # b # c # d # e # x # g # h # i # k # l ' b ' -y2aL# a # b # c # d # e # x # g # h # i # k # l '# b ' -y2AL# a # b # c # d # e # x # g # h # i # k # l '# b # ' -y2Il# a # b # c # d # e # x # g # h # i # k # l 'd' -y2il# a # b # c # d # e # x # g # h # i # k # l ' d ' -y2al# a # b # c # d # e # x # g # h # i # k # l '# d ' -y2Al# a # b # c # d # e # x # g # h # i # k # l '# d # ' -y2I# a # b # c # d # e # x # g # h # i # k # l 'x' -y2i# a # b # c # d # e # x # g # h # i # k # l ' x ' -y2a# a # b # c # d # e # x # g # h # i # k # l '# x ' -y2A# a # b # c # d # e # x # g # h # i # k # l '# x # ' -y2In# a # b # c # d # e # x # g # h # i # k # l 'h' -y2in# a # b # c # d # e # x # g # h # i # k # l ' h ' -y2an# a # b # c # d # e # x # g # h # i # k # l '# h ' -y2An# a # b # c # d # e # x # g # h # i # k # l '# h # ' -y2IN# a # b # c # d # e # x # g # h # i # k # l 'k' -y2iN# a # b # c # d # e # x # g # h # i # k # l ' k ' -y2aN# a # b # c # d # e # x # g # h # i # k # l '# k ' -y2AN# a # b # c # d # e # x # g # h # i # k # l '# k # ' -vIL# a # b # c # _ # e # x # g # h # i # k # l -viL# a # b # c #___# e # x # g # h # i # k # l -vaL# a # b # c ____# e # x # g # h # i # k # l -vAL# a # b # c ______e # x # g # h # i # k # l -vIl# a # b # c # d # _ # x # g # h # i # k # l -vil# a # b # c # d #___# x # g # h # i # k # l -val# a # b # c # d ____# x # g # h # i # k # l -vAl# a # b # c # d ______x # g # h # i # k # l -vI# a # b # c # d # e # _ # g # h # i # k # l -vi# a # b # c # d # e #___# g # h # i # k # l -va# a # b # c # d # e ____# g # h # i # k # l -vA# a # b # c # d # e ______g # h # i # k # l -vIn# a # b # c # d # e # x # _ # h # i # k # l -vin# a # b # c # d # e # x #___# h # i # k # l -van# a # b # c # d # e # x ____# h # i # k # l -vAn# a # b # c # d # e # x ______h # i # k # l -vIN# a # b # c # d # e # x # g # _ # i # k # l -viN# a # b # c # d # e # x # g #___# i # k # l -vaN# a # b # c # d # e # x # g ____# i # k # l -vAN# a # b # c # d # e # x # g ______i # k # l -v1IL# a # b # c # _ # e # x # g # h # i # k # l -v1iL# a # b # c #___# e # x # g # h # i # k # l -v1aL# a # b # c ____# e # x # g # h # i # k # l -v1AL# a # b # c ______e # x # g # h # i # k # l -v1Il# a # b # c # d # _ # x # g # h # i # k # l -v1il# a # b # c # d #___# x # g # h # i # k # l -v1al# a # b # c # d ____# x # g # h # i # k # l -v1Al# a # b # c # d ______x # g # h # i # k # l -v1I# a # b # c # d # e # _ # g # h # i # k # l -v1i# a # b # c # d # e #___# g # h # i # k # l -v1a# a # b # c # d # e ____# g # h # i # k # l -v1A# a # b # c # d # e ______g # h # i # k # l -v1In# a # b # c # d # e # x # _ # h # i # k # l -v1in# a # b # c # d # e # x #___# h # i # k # l -v1an# a # b # c # d # e # x ____# h # i # k # l -v1An# a # b # c # d # e # x ______h # i # k # l -v1IN# a # b # c # d # e # x # g # _ # i # k # l -v1iN# a # b # c # d # e # x # g #___# i # k # l -v1aN# a # b # c # d # e # x # g ____# i # k # l -v1AN# a # b # c # d # e # x # g ______i # k # l -v2IL# a # _ # c # d # e # x # g # h # i # k # l -v2iL# a #___# c # d # e # x # g # h # i # k # l -v2aL# a ____# c # d # e # x # g # h # i # k # l -v2AL# a ______c # d # e # x # g # h # i # k # l -v2Il# a # b # c # _ # e # x # g # h # i # k # l -v2il# a # b # c #___# e # x # g # h # i # k # l -v2al# a # b # c ____# e # x # g # h # i # k # l -v2Al# a # b # c ______e # x # g # h # i # k # l -v2I# a # b # c # d # e # _ # g # h # i # k # l -v2i# a # b # c # d # e #___# g # h # i # k # l -v2a# a # b # c # d # e ____# g # h # i # k # l -v2A# a # b # c # d # e ______g # h # i # k # l -v2In# a # b # c # d # e # x # g # _ # i # k # l -v2in# a # b # c # d # e # x # g #___# i # k # l -v2an# a # b # c # d # e # x # g ____# i # k # l -v2An# a # b # c # d # e # x # g ______i # k # l -v2IN# a # b # c # d # e # x # g # h # i # _ # l -v2iN# a # b # c # d # e # x # g # h # i #___# l -v2aN# a # b # c # d # e # x # g # h # i ____# l -v2AN# a # b # c # d # e # x # g # h # i ______l -a / b / c / d / e / x / g / h / i / k / l -cIL/ a / b / c / _ / e / x / g / h / i / k / l -ciL/ a / b / c /_/ e / x / g / h / i / k / l -caL/ a / b / c _/ e / x / g / h / i / k / l -cAL/ a / b / c _e / x / g / h / i / k / l -cIl/ a / b / c / d / _ / x / g / h / i / k / l -cil/ a / b / c / d /_/ x / g / h / i / k / l -cal/ a / b / c / d _/ x / g / h / i / k / l -cAl/ a / b / c / d _x / g / h / i / k / l -cI/ a / b / c / d / e / _ / g / h / i / k / l -ci/ a / b / c / d / e /_/ g / h / i / k / l -ca/ a / b / c / d / e _/ g / h / i / k / l -cA/ a / b / c / d / e _g / h / i / k / l -cIn/ a / b / c / d / e / x / _ / h / i / k / l -cin/ a / b / c / d / e / x /_/ h / i / k / l -can/ a / b / c / d / e / x _/ h / i / k / l -cAn/ a / b / c / d / e / x _h / i / k / l -cIN/ a / b / c / d / e / x / g / _ / i / k / l -ciN/ a / b / c / d / e / x / g /_/ i / k / l -caN/ a / b / c / d / e / x / g _/ i / k / l -cAN/ a / b / c / d / e / x / g _i / k / l -c1IL/ a / b / c / _ / e / x / g / h / i / k / l -c1iL/ a / b / c /_/ e / x / g / h / i / k / l -c1aL/ a / b / c _/ e / x / g / h / i / k / l -c1AL/ a / b / c _e / x / g / h / i / k / l -c1Il/ a / b / c / d / _ / x / g / h / i / k / l -c1il/ a / b / c / d /_/ x / g / h / i / k / l -c1al/ a / b / c / d _/ x / g / h / i / k / l -c1Al/ a / b / c / d _x / g / h / i / k / l -c1I/ a / b / c / d / e / _ / g / h / i / k / l -c1i/ a / b / c / d / e /_/ g / h / i / k / l -c1a/ a / b / c / d / e _/ g / h / i / k / l -c1A/ a / b / c / d / e _g / h / i / k / l -c1In/ a / b / c / d / e / x / _ / h / i / k / l -c1in/ a / b / c / d / e / x /_/ h / i / k / l -c1an/ a / b / c / d / e / x _/ h / i / k / l -c1An/ a / b / c / d / e / x _h / i / k / l -c1IN/ a / b / c / d / e / x / g / _ / i / k / l -c1iN/ a / b / c / d / e / x / g /_/ i / k / l -c1aN/ a / b / c / d / e / x / g _/ i / k / l -c1AN/ a / b / c / d / e / x / g _i / k / l -c2IL/ a / _ / c / d / e / x / g / h / i / k / l -c2iL/ a /_/ c / d / e / x / g / h / i / k / l -c2aL/ a _/ c / d / e / x / g / h / i / k / l -c2AL/ a _c / d / e / x / g / h / i / k / l -c2Il/ a / b / c / _ / e / x / g / h / i / k / l -c2il/ a / b / c /_/ e / x / g / h / i / k / l -c2al/ a / b / c _/ e / x / g / h / i / k / l -c2Al/ a / b / c _e / x / g / h / i / k / l -c2I/ a / b / c / d / e / _ / g / h / i / k / l -c2i/ a / b / c / d / e /_/ g / h / i / k / l -c2a/ a / b / c / d / e _/ g / h / i / k / l -c2A/ a / b / c / d / e _g / h / i / k / l -c2In/ a / b / c / d / e / x / g / _ / i / k / l -c2in/ a / b / c / d / e / x / g /_/ i / k / l -c2an/ a / b / c / d / e / x / g _/ i / k / l -c2An/ a / b / c / d / e / x / g _i / k / l -c2IN/ a / b / c / d / e / x / g / h / i / _ / l -c2iN/ a / b / c / d / e / x / g / h / i /_/ l -c2aN/ a / b / c / d / e / x / g / h / i _/ l -c2AN/ a / b / c / d / e / x / g / h / i _l -dIL/ a / b / c / / e / x / g / h / i / k / l -diL/ a / b / c // e / x / g / h / i / k / l -daL/ a / b / c / e / x / g / h / i / k / l -dAL/ a / b / c e / x / g / h / i / k / l -dIl/ a / b / c / d / / x / g / h / i / k / l -dil/ a / b / c / d // x / g / h / i / k / l -dal/ a / b / c / d / x / g / h / i / k / l -dAl/ a / b / c / d x / g / h / i / k / l -dI/ a / b / c / d / e / / g / h / i / k / l -di/ a / b / c / d / e // g / h / i / k / l -da/ a / b / c / d / e / g / h / i / k / l -dA/ a / b / c / d / e g / h / i / k / l -dIn/ a / b / c / d / e / x / / h / i / k / l -din/ a / b / c / d / e / x // h / i / k / l -dan/ a / b / c / d / e / x / h / i / k / l -dAn/ a / b / c / d / e / x h / i / k / l -dIN/ a / b / c / d / e / x / g / / i / k / l -diN/ a / b / c / d / e / x / g // i / k / l -daN/ a / b / c / d / e / x / g / i / k / l -dAN/ a / b / c / d / e / x / g i / k / l -d1IL/ a / b / c / / e / x / g / h / i / k / l -d1iL/ a / b / c // e / x / g / h / i / k / l -d1aL/ a / b / c / e / x / g / h / i / k / l -d1AL/ a / b / c e / x / g / h / i / k / l -d1Il/ a / b / c / d / / x / g / h / i / k / l -d1il/ a / b / c / d // x / g / h / i / k / l -d1al/ a / b / c / d / x / g / h / i / k / l -d1Al/ a / b / c / d x / g / h / i / k / l -d1I/ a / b / c / d / e / / g / h / i / k / l -d1i/ a / b / c / d / e // g / h / i / k / l -d1a/ a / b / c / d / e / g / h / i / k / l -d1A/ a / b / c / d / e g / h / i / k / l -d1In/ a / b / c / d / e / x / / h / i / k / l -d1in/ a / b / c / d / e / x // h / i / k / l -d1an/ a / b / c / d / e / x / h / i / k / l -d1An/ a / b / c / d / e / x h / i / k / l -d1IN/ a / b / c / d / e / x / g / / i / k / l -d1iN/ a / b / c / d / e / x / g // i / k / l -d1aN/ a / b / c / d / e / x / g / i / k / l -d1AN/ a / b / c / d / e / x / g i / k / l -d2IL/ a / / c / d / e / x / g / h / i / k / l -d2iL/ a // c / d / e / x / g / h / i / k / l -d2aL/ a / c / d / e / x / g / h / i / k / l -d2AL/ a c / d / e / x / g / h / i / k / l -d2Il/ a / b / c / / e / x / g / h / i / k / l -d2il/ a / b / c // e / x / g / h / i / k / l -d2al/ a / b / c / e / x / g / h / i / k / l -d2Al/ a / b / c e / x / g / h / i / k / l -d2I/ a / b / c / d / e / / g / h / i / k / l -d2i/ a / b / c / d / e // g / h / i / k / l -d2a/ a / b / c / d / e / g / h / i / k / l -d2A/ a / b / c / d / e g / h / i / k / l -d2In/ a / b / c / d / e / x / g / / i / k / l -d2in/ a / b / c / d / e / x / g // i / k / l -d2an/ a / b / c / d / e / x / g / i / k / l -d2An/ a / b / c / d / e / x / g i / k / l -d2IN/ a / b / c / d / e / x / g / h / i / / l -d2iN/ a / b / c / d / e / x / g / h / i // l -d2aN/ a / b / c / d / e / x / g / h / i / l -d2AN/ a / b / c / d / e / x / g / h / i l -yIL/ a / b / c / d / e / x / g / h / i / k / l 'd' -yiL/ a / b / c / d / e / x / g / h / i / k / l ' d ' -yaL/ a / b / c / d / e / x / g / h / i / k / l '/ d ' -yAL/ a / b / c / d / e / x / g / h / i / k / l '/ d / ' -yIl/ a / b / c / d / e / x / g / h / i / k / l 'e' -yil/ a / b / c / d / e / x / g / h / i / k / l ' e ' -yal/ a / b / c / d / e / x / g / h / i / k / l '/ e ' -yAl/ a / b / c / d / e / x / g / h / i / k / l '/ e / ' -yI/ a / b / c / d / e / x / g / h / i / k / l 'x' -yi/ a / b / c / d / e / x / g / h / i / k / l ' x ' -ya/ a / b / c / d / e / x / g / h / i / k / l '/ x ' -yA/ a / b / c / d / e / x / g / h / i / k / l '/ x / ' -yIn/ a / b / c / d / e / x / g / h / i / k / l 'g' -yin/ a / b / c / d / e / x / g / h / i / k / l ' g ' -yan/ a / b / c / d / e / x / g / h / i / k / l '/ g ' -yAn/ a / b / c / d / e / x / g / h / i / k / l '/ g / ' -yIN/ a / b / c / d / e / x / g / h / i / k / l 'h' -yiN/ a / b / c / d / e / x / g / h / i / k / l ' h ' -yaN/ a / b / c / d / e / x / g / h / i / k / l '/ h ' -yAN/ a / b / c / d / e / x / g / h / i / k / l '/ h / ' -y1IL/ a / b / c / d / e / x / g / h / i / k / l 'd' -y1iL/ a / b / c / d / e / x / g / h / i / k / l ' d ' -y1aL/ a / b / c / d / e / x / g / h / i / k / l '/ d ' -y1AL/ a / b / c / d / e / x / g / h / i / k / l '/ d / ' -y1Il/ a / b / c / d / e / x / g / h / i / k / l 'e' -y1il/ a / b / c / d / e / x / g / h / i / k / l ' e ' -y1al/ a / b / c / d / e / x / g / h / i / k / l '/ e ' -y1Al/ a / b / c / d / e / x / g / h / i / k / l '/ e / ' -y1I/ a / b / c / d / e / x / g / h / i / k / l 'x' -y1i/ a / b / c / d / e / x / g / h / i / k / l ' x ' -y1a/ a / b / c / d / e / x / g / h / i / k / l '/ x ' -y1A/ a / b / c / d / e / x / g / h / i / k / l '/ x / ' -y1In/ a / b / c / d / e / x / g / h / i / k / l 'g' -y1in/ a / b / c / d / e / x / g / h / i / k / l ' g ' -y1an/ a / b / c / d / e / x / g / h / i / k / l '/ g ' -y1An/ a / b / c / d / e / x / g / h / i / k / l '/ g / ' -y1IN/ a / b / c / d / e / x / g / h / i / k / l 'h' -y1iN/ a / b / c / d / e / x / g / h / i / k / l ' h ' -y1aN/ a / b / c / d / e / x / g / h / i / k / l '/ h ' -y1AN/ a / b / c / d / e / x / g / h / i / k / l '/ h / ' -y2IL/ a / b / c / d / e / x / g / h / i / k / l 'b' -y2iL/ a / b / c / d / e / x / g / h / i / k / l ' b ' -y2aL/ a / b / c / d / e / x / g / h / i / k / l '/ b ' -y2AL/ a / b / c / d / e / x / g / h / i / k / l '/ b / ' -y2Il/ a / b / c / d / e / x / g / h / i / k / l 'd' -y2il/ a / b / c / d / e / x / g / h / i / k / l ' d ' -y2al/ a / b / c / d / e / x / g / h / i / k / l '/ d ' -y2Al/ a / b / c / d / e / x / g / h / i / k / l '/ d / ' -y2I/ a / b / c / d / e / x / g / h / i / k / l 'x' -y2i/ a / b / c / d / e / x / g / h / i / k / l ' x ' -y2a/ a / b / c / d / e / x / g / h / i / k / l '/ x ' -y2A/ a / b / c / d / e / x / g / h / i / k / l '/ x / ' -y2In/ a / b / c / d / e / x / g / h / i / k / l 'h' -y2in/ a / b / c / d / e / x / g / h / i / k / l ' h ' -y2an/ a / b / c / d / e / x / g / h / i / k / l '/ h ' -y2An/ a / b / c / d / e / x / g / h / i / k / l '/ h / ' -y2IN/ a / b / c / d / e / x / g / h / i / k / l 'k' -y2iN/ a / b / c / d / e / x / g / h / i / k / l ' k ' -y2aN/ a / b / c / d / e / x / g / h / i / k / l '/ k ' -y2AN/ a / b / c / d / e / x / g / h / i / k / l '/ k / ' -vIL/ a / b / c / _ / e / x / g / h / i / k / l -viL/ a / b / c /___/ e / x / g / h / i / k / l -vaL/ a / b / c ____/ e / x / g / h / i / k / l -vAL/ a / b / c ______e / x / g / h / i / k / l -vIl/ a / b / c / d / _ / x / g / h / i / k / l -vil/ a / b / c / d /___/ x / g / h / i / k / l -val/ a / b / c / d ____/ x / g / h / i / k / l -vAl/ a / b / c / d ______x / g / h / i / k / l -vI/ a / b / c / d / e / _ / g / h / i / k / l -vi/ a / b / c / d / e /___/ g / h / i / k / l -va/ a / b / c / d / e ____/ g / h / i / k / l -vA/ a / b / c / d / e ______g / h / i / k / l -vIn/ a / b / c / d / e / x / _ / h / i / k / l -vin/ a / b / c / d / e / x /___/ h / i / k / l -van/ a / b / c / d / e / x ____/ h / i / k / l -vAn/ a / b / c / d / e / x ______h / i / k / l -vIN/ a / b / c / d / e / x / g / _ / i / k / l -viN/ a / b / c / d / e / x / g /___/ i / k / l -vaN/ a / b / c / d / e / x / g ____/ i / k / l -vAN/ a / b / c / d / e / x / g ______i / k / l -v1IL/ a / b / c / _ / e / x / g / h / i / k / l -v1iL/ a / b / c /___/ e / x / g / h / i / k / l -v1aL/ a / b / c ____/ e / x / g / h / i / k / l -v1AL/ a / b / c ______e / x / g / h / i / k / l -v1Il/ a / b / c / d / _ / x / g / h / i / k / l -v1il/ a / b / c / d /___/ x / g / h / i / k / l -v1al/ a / b / c / d ____/ x / g / h / i / k / l -v1Al/ a / b / c / d ______x / g / h / i / k / l -v1I/ a / b / c / d / e / _ / g / h / i / k / l -v1i/ a / b / c / d / e /___/ g / h / i / k / l -v1a/ a / b / c / d / e ____/ g / h / i / k / l -v1A/ a / b / c / d / e ______g / h / i / k / l -v1In/ a / b / c / d / e / x / _ / h / i / k / l -v1in/ a / b / c / d / e / x /___/ h / i / k / l -v1an/ a / b / c / d / e / x ____/ h / i / k / l -v1An/ a / b / c / d / e / x ______h / i / k / l -v1IN/ a / b / c / d / e / x / g / _ / i / k / l -v1iN/ a / b / c / d / e / x / g /___/ i / k / l -v1aN/ a / b / c / d / e / x / g ____/ i / k / l -v1AN/ a / b / c / d / e / x / g ______i / k / l -v2IL/ a / _ / c / d / e / x / g / h / i / k / l -v2iL/ a /___/ c / d / e / x / g / h / i / k / l -v2aL/ a ____/ c / d / e / x / g / h / i / k / l -v2AL/ a ______c / d / e / x / g / h / i / k / l -v2Il/ a / b / c / _ / e / x / g / h / i / k / l -v2il/ a / b / c /___/ e / x / g / h / i / k / l -v2al/ a / b / c ____/ e / x / g / h / i / k / l -v2Al/ a / b / c ______e / x / g / h / i / k / l -v2I/ a / b / c / d / e / _ / g / h / i / k / l -v2i/ a / b / c / d / e /___/ g / h / i / k / l -v2a/ a / b / c / d / e ____/ g / h / i / k / l -v2A/ a / b / c / d / e ______g / h / i / k / l -v2In/ a / b / c / d / e / x / g / _ / i / k / l -v2in/ a / b / c / d / e / x / g /___/ i / k / l -v2an/ a / b / c / d / e / x / g ____/ i / k / l -v2An/ a / b / c / d / e / x / g ______i / k / l -v2IN/ a / b / c / d / e / x / g / h / i / _ / l -v2iN/ a / b / c / d / e / x / g / h / i /___/ l -v2aN/ a / b / c / d / e / x / g / h / i ____/ l -v2AN/ a / b / c / d / e / x / g / h / i ______l -a | b | c | d | e | x | g | h | i | k | l -cIL| a | b | c | _ | e | x | g | h | i | k | l -ciL| a | b | c |_| e | x | g | h | i | k | l -caL| a | b | c _| e | x | g | h | i | k | l -cAL| a | b | c _e | x | g | h | i | k | l -cIl| a | b | c | d | _ | x | g | h | i | k | l -cil| a | b | c | d |_| x | g | h | i | k | l -cal| a | b | c | d _| x | g | h | i | k | l -cAl| a | b | c | d _x | g | h | i | k | l -cI| a | b | c | d | e | _ | g | h | i | k | l -ci| a | b | c | d | e |_| g | h | i | k | l -ca| a | b | c | d | e _| g | h | i | k | l -cA| a | b | c | d | e _g | h | i | k | l -cIn| a | b | c | d | e | x | _ | h | i | k | l -cin| a | b | c | d | e | x |_| h | i | k | l -can| a | b | c | d | e | x _| h | i | k | l -cAn| a | b | c | d | e | x _h | i | k | l -cIN| a | b | c | d | e | x | g | _ | i | k | l -ciN| a | b | c | d | e | x | g |_| i | k | l -caN| a | b | c | d | e | x | g _| i | k | l -cAN| a | b | c | d | e | x | g _i | k | l -c1IL| a | b | c | _ | e | x | g | h | i | k | l -c1iL| a | b | c |_| e | x | g | h | i | k | l -c1aL| a | b | c _| e | x | g | h | i | k | l -c1AL| a | b | c _e | x | g | h | i | k | l -c1Il| a | b | c | d | _ | x | g | h | i | k | l -c1il| a | b | c | d |_| x | g | h | i | k | l -c1al| a | b | c | d _| x | g | h | i | k | l -c1Al| a | b | c | d _x | g | h | i | k | l -c1I| a | b | c | d | e | _ | g | h | i | k | l -c1i| a | b | c | d | e |_| g | h | i | k | l -c1a| a | b | c | d | e _| g | h | i | k | l -c1A| a | b | c | d | e _g | h | i | k | l -c1In| a | b | c | d | e | x | _ | h | i | k | l -c1in| a | b | c | d | e | x |_| h | i | k | l -c1an| a | b | c | d | e | x _| h | i | k | l -c1An| a | b | c | d | e | x _h | i | k | l -c1IN| a | b | c | d | e | x | g | _ | i | k | l -c1iN| a | b | c | d | e | x | g |_| i | k | l -c1aN| a | b | c | d | e | x | g _| i | k | l -c1AN| a | b | c | d | e | x | g _i | k | l -c2IL| a | _ | c | d | e | x | g | h | i | k | l -c2iL| a |_| c | d | e | x | g | h | i | k | l -c2aL| a _| c | d | e | x | g | h | i | k | l -c2AL| a _c | d | e | x | g | h | i | k | l -c2Il| a | b | c | _ | e | x | g | h | i | k | l -c2il| a | b | c |_| e | x | g | h | i | k | l -c2al| a | b | c _| e | x | g | h | i | k | l -c2Al| a | b | c _e | x | g | h | i | k | l -c2I| a | b | c | d | e | _ | g | h | i | k | l -c2i| a | b | c | d | e |_| g | h | i | k | l -c2a| a | b | c | d | e _| g | h | i | k | l -c2A| a | b | c | d | e _g | h | i | k | l -c2In| a | b | c | d | e | x | g | _ | i | k | l -c2in| a | b | c | d | e | x | g |_| i | k | l -c2an| a | b | c | d | e | x | g _| i | k | l -c2An| a | b | c | d | e | x | g _i | k | l -c2IN| a | b | c | d | e | x | g | h | i | _ | l -c2iN| a | b | c | d | e | x | g | h | i |_| l -c2aN| a | b | c | d | e | x | g | h | i _| l -c2AN| a | b | c | d | e | x | g | h | i _l -dIL| a | b | c | | e | x | g | h | i | k | l -diL| a | b | c || e | x | g | h | i | k | l -daL| a | b | c | e | x | g | h | i | k | l -dAL| a | b | c e | x | g | h | i | k | l -dIl| a | b | c | d | | x | g | h | i | k | l -dil| a | b | c | d || x | g | h | i | k | l -dal| a | b | c | d | x | g | h | i | k | l -dAl| a | b | c | d x | g | h | i | k | l -dI| a | b | c | d | e | | g | h | i | k | l -di| a | b | c | d | e || g | h | i | k | l -da| a | b | c | d | e | g | h | i | k | l -dA| a | b | c | d | e g | h | i | k | l -dIn| a | b | c | d | e | x | | h | i | k | l -din| a | b | c | d | e | x || h | i | k | l -dan| a | b | c | d | e | x | h | i | k | l -dAn| a | b | c | d | e | x h | i | k | l -dIN| a | b | c | d | e | x | g | | i | k | l -diN| a | b | c | d | e | x | g || i | k | l -daN| a | b | c | d | e | x | g | i | k | l -dAN| a | b | c | d | e | x | g i | k | l -d1IL| a | b | c | | e | x | g | h | i | k | l -d1iL| a | b | c || e | x | g | h | i | k | l -d1aL| a | b | c | e | x | g | h | i | k | l -d1AL| a | b | c e | x | g | h | i | k | l -d1Il| a | b | c | d | | x | g | h | i | k | l -d1il| a | b | c | d || x | g | h | i | k | l -d1al| a | b | c | d | x | g | h | i | k | l -d1Al| a | b | c | d x | g | h | i | k | l -d1I| a | b | c | d | e | | g | h | i | k | l -d1i| a | b | c | d | e || g | h | i | k | l -d1a| a | b | c | d | e | g | h | i | k | l -d1A| a | b | c | d | e g | h | i | k | l -d1In| a | b | c | d | e | x | | h | i | k | l -d1in| a | b | c | d | e | x || h | i | k | l -d1an| a | b | c | d | e | x | h | i | k | l -d1An| a | b | c | d | e | x h | i | k | l -d1IN| a | b | c | d | e | x | g | | i | k | l -d1iN| a | b | c | d | e | x | g || i | k | l -d1aN| a | b | c | d | e | x | g | i | k | l -d1AN| a | b | c | d | e | x | g i | k | l -d2IL| a | | c | d | e | x | g | h | i | k | l -d2iL| a || c | d | e | x | g | h | i | k | l -d2aL| a | c | d | e | x | g | h | i | k | l -d2AL| a c | d | e | x | g | h | i | k | l -d2Il| a | b | c | | e | x | g | h | i | k | l -d2il| a | b | c || e | x | g | h | i | k | l -d2al| a | b | c | e | x | g | h | i | k | l -d2Al| a | b | c e | x | g | h | i | k | l -d2I| a | b | c | d | e | | g | h | i | k | l -d2i| a | b | c | d | e || g | h | i | k | l -d2a| a | b | c | d | e | g | h | i | k | l -d2A| a | b | c | d | e g | h | i | k | l -d2In| a | b | c | d | e | x | g | | i | k | l -d2in| a | b | c | d | e | x | g || i | k | l -d2an| a | b | c | d | e | x | g | i | k | l -d2An| a | b | c | d | e | x | g i | k | l -d2IN| a | b | c | d | e | x | g | h | i | | l -d2iN| a | b | c | d | e | x | g | h | i || l -d2aN| a | b | c | d | e | x | g | h | i | l -d2AN| a | b | c | d | e | x | g | h | i l -yIL| a | b | c | d | e | x | g | h | i | k | l 'd' -yiL| a | b | c | d | e | x | g | h | i | k | l ' d ' -yaL| a | b | c | d | e | x | g | h | i | k | l '| d ' -yAL| a | b | c | d | e | x | g | h | i | k | l '| d | ' -yIl| a | b | c | d | e | x | g | h | i | k | l 'e' -yil| a | b | c | d | e | x | g | h | i | k | l ' e ' -yal| a | b | c | d | e | x | g | h | i | k | l '| e ' -yAl| a | b | c | d | e | x | g | h | i | k | l '| e | ' -yI| a | b | c | d | e | x | g | h | i | k | l 'x' -yi| a | b | c | d | e | x | g | h | i | k | l ' x ' -ya| a | b | c | d | e | x | g | h | i | k | l '| x ' -yA| a | b | c | d | e | x | g | h | i | k | l '| x | ' -yIn| a | b | c | d | e | x | g | h | i | k | l 'g' -yin| a | b | c | d | e | x | g | h | i | k | l ' g ' -yan| a | b | c | d | e | x | g | h | i | k | l '| g ' -yAn| a | b | c | d | e | x | g | h | i | k | l '| g | ' -yIN| a | b | c | d | e | x | g | h | i | k | l 'h' -yiN| a | b | c | d | e | x | g | h | i | k | l ' h ' -yaN| a | b | c | d | e | x | g | h | i | k | l '| h ' -yAN| a | b | c | d | e | x | g | h | i | k | l '| h | ' -y1IL| a | b | c | d | e | x | g | h | i | k | l 'd' -y1iL| a | b | c | d | e | x | g | h | i | k | l ' d ' -y1aL| a | b | c | d | e | x | g | h | i | k | l '| d ' -y1AL| a | b | c | d | e | x | g | h | i | k | l '| d | ' -y1Il| a | b | c | d | e | x | g | h | i | k | l 'e' -y1il| a | b | c | d | e | x | g | h | i | k | l ' e ' -y1al| a | b | c | d | e | x | g | h | i | k | l '| e ' -y1Al| a | b | c | d | e | x | g | h | i | k | l '| e | ' -y1I| a | b | c | d | e | x | g | h | i | k | l 'x' -y1i| a | b | c | d | e | x | g | h | i | k | l ' x ' -y1a| a | b | c | d | e | x | g | h | i | k | l '| x ' -y1A| a | b | c | d | e | x | g | h | i | k | l '| x | ' -y1In| a | b | c | d | e | x | g | h | i | k | l 'g' -y1in| a | b | c | d | e | x | g | h | i | k | l ' g ' -y1an| a | b | c | d | e | x | g | h | i | k | l '| g ' -y1An| a | b | c | d | e | x | g | h | i | k | l '| g | ' -y1IN| a | b | c | d | e | x | g | h | i | k | l 'h' -y1iN| a | b | c | d | e | x | g | h | i | k | l ' h ' -y1aN| a | b | c | d | e | x | g | h | i | k | l '| h ' -y1AN| a | b | c | d | e | x | g | h | i | k | l '| h | ' -y2IL| a | b | c | d | e | x | g | h | i | k | l 'b' -y2iL| a | b | c | d | e | x | g | h | i | k | l ' b ' -y2aL| a | b | c | d | e | x | g | h | i | k | l '| b ' -y2AL| a | b | c | d | e | x | g | h | i | k | l '| b | ' -y2Il| a | b | c | d | e | x | g | h | i | k | l 'd' -y2il| a | b | c | d | e | x | g | h | i | k | l ' d ' -y2al| a | b | c | d | e | x | g | h | i | k | l '| d ' -y2Al| a | b | c | d | e | x | g | h | i | k | l '| d | ' -y2I| a | b | c | d | e | x | g | h | i | k | l 'x' -y2i| a | b | c | d | e | x | g | h | i | k | l ' x ' -y2a| a | b | c | d | e | x | g | h | i | k | l '| x ' -y2A| a | b | c | d | e | x | g | h | i | k | l '| x | ' -y2In| a | b | c | d | e | x | g | h | i | k | l 'h' -y2in| a | b | c | d | e | x | g | h | i | k | l ' h ' -y2an| a | b | c | d | e | x | g | h | i | k | l '| h ' -y2An| a | b | c | d | e | x | g | h | i | k | l '| h | ' -y2IN| a | b | c | d | e | x | g | h | i | k | l 'k' -y2iN| a | b | c | d | e | x | g | h | i | k | l ' k ' -y2aN| a | b | c | d | e | x | g | h | i | k | l '| k ' -y2AN| a | b | c | d | e | x | g | h | i | k | l '| k | ' -vIL| a | b | c | _ | e | x | g | h | i | k | l -viL| a | b | c |___| e | x | g | h | i | k | l -vaL| a | b | c ____| e | x | g | h | i | k | l -vAL| a | b | c ______e | x | g | h | i | k | l -vIl| a | b | c | d | _ | x | g | h | i | k | l -vil| a | b | c | d |___| x | g | h | i | k | l -val| a | b | c | d ____| x | g | h | i | k | l -vAl| a | b | c | d ______x | g | h | i | k | l -vI| a | b | c | d | e | _ | g | h | i | k | l -vi| a | b | c | d | e |___| g | h | i | k | l -va| a | b | c | d | e ____| g | h | i | k | l -vA| a | b | c | d | e ______g | h | i | k | l -vIn| a | b | c | d | e | x | _ | h | i | k | l -vin| a | b | c | d | e | x |___| h | i | k | l -van| a | b | c | d | e | x ____| h | i | k | l -vAn| a | b | c | d | e | x ______h | i | k | l -vIN| a | b | c | d | e | x | g | _ | i | k | l -viN| a | b | c | d | e | x | g |___| i | k | l -vaN| a | b | c | d | e | x | g ____| i | k | l -vAN| a | b | c | d | e | x | g ______i | k | l -v1IL| a | b | c | _ | e | x | g | h | i | k | l -v1iL| a | b | c |___| e | x | g | h | i | k | l -v1aL| a | b | c ____| e | x | g | h | i | k | l -v1AL| a | b | c ______e | x | g | h | i | k | l -v1Il| a | b | c | d | _ | x | g | h | i | k | l -v1il| a | b | c | d |___| x | g | h | i | k | l -v1al| a | b | c | d ____| x | g | h | i | k | l -v1Al| a | b | c | d ______x | g | h | i | k | l -v1I| a | b | c | d | e | _ | g | h | i | k | l -v1i| a | b | c | d | e |___| g | h | i | k | l -v1a| a | b | c | d | e ____| g | h | i | k | l -v1A| a | b | c | d | e ______g | h | i | k | l -v1In| a | b | c | d | e | x | _ | h | i | k | l -v1in| a | b | c | d | e | x |___| h | i | k | l -v1an| a | b | c | d | e | x ____| h | i | k | l -v1An| a | b | c | d | e | x ______h | i | k | l -v1IN| a | b | c | d | e | x | g | _ | i | k | l -v1iN| a | b | c | d | e | x | g |___| i | k | l -v1aN| a | b | c | d | e | x | g ____| i | k | l -v1AN| a | b | c | d | e | x | g ______i | k | l -v2IL| a | _ | c | d | e | x | g | h | i | k | l -v2iL| a |___| c | d | e | x | g | h | i | k | l -v2aL| a ____| c | d | e | x | g | h | i | k | l -v2AL| a ______c | d | e | x | g | h | i | k | l -v2Il| a | b | c | _ | e | x | g | h | i | k | l -v2il| a | b | c |___| e | x | g | h | i | k | l -v2al| a | b | c ____| e | x | g | h | i | k | l -v2Al| a | b | c ______e | x | g | h | i | k | l -v2I| a | b | c | d | e | _ | g | h | i | k | l -v2i| a | b | c | d | e |___| g | h | i | k | l -v2a| a | b | c | d | e ____| g | h | i | k | l -v2A| a | b | c | d | e ______g | h | i | k | l -v2In| a | b | c | d | e | x | g | _ | i | k | l -v2in| a | b | c | d | e | x | g |___| i | k | l -v2an| a | b | c | d | e | x | g ____| i | k | l -v2An| a | b | c | d | e | x | g ______i | k | l -v2IN| a | b | c | d | e | x | g | h | i | _ | l -v2iN| a | b | c | d | e | x | g | h | i |___| l -v2aN| a | b | c | d | e | x | g | h | i ____| l -v2AN| a | b | c | d | e | x | g | h | i ______l -a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l -cIL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -ciL\ a \ b \ c \_\ e \ x \ g \ h \ i \ k \ l -caL\ a \ b \ c _\ e \ x \ g \ h \ i \ k \ l -cAL\ a \ b \ c _e \ x \ g \ h \ i \ k \ l -cIl\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -cil\ a \ b \ c \ d \_\ x \ g \ h \ i \ k \ l -cal\ a \ b \ c \ d _\ x \ g \ h \ i \ k \ l -cAl\ a \ b \ c \ d _x \ g \ h \ i \ k \ l -cI\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -ci\ a \ b \ c \ d \ e \_\ g \ h \ i \ k \ l -ca\ a \ b \ c \ d \ e _\ g \ h \ i \ k \ l -cA\ a \ b \ c \ d \ e _g \ h \ i \ k \ l -cIn\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -cin\ a \ b \ c \ d \ e \ x \_\ h \ i \ k \ l -can\ a \ b \ c \ d \ e \ x _\ h \ i \ k \ l -cAn\ a \ b \ c \ d \ e \ x _h \ i \ k \ l -cIN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -ciN\ a \ b \ c \ d \ e \ x \ g \_\ i \ k \ l -caN\ a \ b \ c \ d \ e \ x \ g _\ i \ k \ l -cAN\ a \ b \ c \ d \ e \ x \ g _i \ k \ l -c1IL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -c1iL\ a \ b \ c \_\ e \ x \ g \ h \ i \ k \ l -c1aL\ a \ b \ c _\ e \ x \ g \ h \ i \ k \ l -c1AL\ a \ b \ c _e \ x \ g \ h \ i \ k \ l -c1Il\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -c1il\ a \ b \ c \ d \_\ x \ g \ h \ i \ k \ l -c1al\ a \ b \ c \ d _\ x \ g \ h \ i \ k \ l -c1Al\ a \ b \ c \ d _x \ g \ h \ i \ k \ l -c1I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -c1i\ a \ b \ c \ d \ e \_\ g \ h \ i \ k \ l -c1a\ a \ b \ c \ d \ e _\ g \ h \ i \ k \ l -c1A\ a \ b \ c \ d \ e _g \ h \ i \ k \ l -c1In\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -c1in\ a \ b \ c \ d \ e \ x \_\ h \ i \ k \ l -c1an\ a \ b \ c \ d \ e \ x _\ h \ i \ k \ l -c1An\ a \ b \ c \ d \ e \ x _h \ i \ k \ l -c1IN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -c1iN\ a \ b \ c \ d \ e \ x \ g \_\ i \ k \ l -c1aN\ a \ b \ c \ d \ e \ x \ g _\ i \ k \ l -c1AN\ a \ b \ c \ d \ e \ x \ g _i \ k \ l -c2IL\ a \ _ \ c \ d \ e \ x \ g \ h \ i \ k \ l -c2iL\ a \_\ c \ d \ e \ x \ g \ h \ i \ k \ l -c2aL\ a _\ c \ d \ e \ x \ g \ h \ i \ k \ l -c2AL\ a _c \ d \ e \ x \ g \ h \ i \ k \ l -c2Il\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -c2il\ a \ b \ c \_\ e \ x \ g \ h \ i \ k \ l -c2al\ a \ b \ c _\ e \ x \ g \ h \ i \ k \ l -c2Al\ a \ b \ c _e \ x \ g \ h \ i \ k \ l -c2I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -c2i\ a \ b \ c \ d \ e \_\ g \ h \ i \ k \ l -c2a\ a \ b \ c \ d \ e _\ g \ h \ i \ k \ l -c2A\ a \ b \ c \ d \ e _g \ h \ i \ k \ l -c2In\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -c2in\ a \ b \ c \ d \ e \ x \ g \_\ i \ k \ l -c2an\ a \ b \ c \ d \ e \ x \ g _\ i \ k \ l -c2An\ a \ b \ c \ d \ e \ x \ g _i \ k \ l -c2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ _ \ l -c2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \_\ l -c2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i _\ l -c2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i _l -dIL\ a \ b \ c \ \ e \ x \ g \ h \ i \ k \ l -diL\ a \ b \ c \\ e \ x \ g \ h \ i \ k \ l -daL\ a \ b \ c \ e \ x \ g \ h \ i \ k \ l -dAL\ a \ b \ c e \ x \ g \ h \ i \ k \ l -dIl\ a \ b \ c \ d \ \ x \ g \ h \ i \ k \ l -dil\ a \ b \ c \ d \\ x \ g \ h \ i \ k \ l -dal\ a \ b \ c \ d \ x \ g \ h \ i \ k \ l -dAl\ a \ b \ c \ d x \ g \ h \ i \ k \ l -dI\ a \ b \ c \ d \ e \ \ g \ h \ i \ k \ l -di\ a \ b \ c \ d \ e \\ g \ h \ i \ k \ l -da\ a \ b \ c \ d \ e \ g \ h \ i \ k \ l -dA\ a \ b \ c \ d \ e g \ h \ i \ k \ l -dIn\ a \ b \ c \ d \ e \ x \ \ h \ i \ k \ l -din\ a \ b \ c \ d \ e \ x \\ h \ i \ k \ l -dan\ a \ b \ c \ d \ e \ x \ h \ i \ k \ l -dAn\ a \ b \ c \ d \ e \ x h \ i \ k \ l -dIN\ a \ b \ c \ d \ e \ x \ g \ \ i \ k \ l -diN\ a \ b \ c \ d \ e \ x \ g \\ i \ k \ l -daN\ a \ b \ c \ d \ e \ x \ g \ i \ k \ l -dAN\ a \ b \ c \ d \ e \ x \ g i \ k \ l -d1IL\ a \ b \ c \ \ e \ x \ g \ h \ i \ k \ l -d1iL\ a \ b \ c \\ e \ x \ g \ h \ i \ k \ l -d1aL\ a \ b \ c \ e \ x \ g \ h \ i \ k \ l -d1AL\ a \ b \ c e \ x \ g \ h \ i \ k \ l -d1Il\ a \ b \ c \ d \ \ x \ g \ h \ i \ k \ l -d1il\ a \ b \ c \ d \\ x \ g \ h \ i \ k \ l -d1al\ a \ b \ c \ d \ x \ g \ h \ i \ k \ l -d1Al\ a \ b \ c \ d x \ g \ h \ i \ k \ l -d1I\ a \ b \ c \ d \ e \ \ g \ h \ i \ k \ l -d1i\ a \ b \ c \ d \ e \\ g \ h \ i \ k \ l -d1a\ a \ b \ c \ d \ e \ g \ h \ i \ k \ l -d1A\ a \ b \ c \ d \ e g \ h \ i \ k \ l -d1In\ a \ b \ c \ d \ e \ x \ \ h \ i \ k \ l -d1in\ a \ b \ c \ d \ e \ x \\ h \ i \ k \ l -d1an\ a \ b \ c \ d \ e \ x \ h \ i \ k \ l -d1An\ a \ b \ c \ d \ e \ x h \ i \ k \ l -d1IN\ a \ b \ c \ d \ e \ x \ g \ \ i \ k \ l -d1iN\ a \ b \ c \ d \ e \ x \ g \\ i \ k \ l -d1aN\ a \ b \ c \ d \ e \ x \ g \ i \ k \ l -d1AN\ a \ b \ c \ d \ e \ x \ g i \ k \ l -d2IL\ a \ \ c \ d \ e \ x \ g \ h \ i \ k \ l -d2iL\ a \\ c \ d \ e \ x \ g \ h \ i \ k \ l -d2aL\ a \ c \ d \ e \ x \ g \ h \ i \ k \ l -d2AL\ a c \ d \ e \ x \ g \ h \ i \ k \ l -d2Il\ a \ b \ c \ \ e \ x \ g \ h \ i \ k \ l -d2il\ a \ b \ c \\ e \ x \ g \ h \ i \ k \ l -d2al\ a \ b \ c \ e \ x \ g \ h \ i \ k \ l -d2Al\ a \ b \ c e \ x \ g \ h \ i \ k \ l -d2I\ a \ b \ c \ d \ e \ \ g \ h \ i \ k \ l -d2i\ a \ b \ c \ d \ e \\ g \ h \ i \ k \ l -d2a\ a \ b \ c \ d \ e \ g \ h \ i \ k \ l -d2A\ a \ b \ c \ d \ e g \ h \ i \ k \ l -d2In\ a \ b \ c \ d \ e \ x \ g \ \ i \ k \ l -d2in\ a \ b \ c \ d \ e \ x \ g \\ i \ k \ l -d2an\ a \ b \ c \ d \ e \ x \ g \ i \ k \ l -d2An\ a \ b \ c \ d \ e \ x \ g i \ k \ l -d2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ \ l -d2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \\ l -d2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ l -d2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i l -yIL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'd' -yiL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' d ' -yaL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d ' -yAL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d \ ' -yIl\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'e' -yil\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' e ' -yal\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e ' -yAl\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e \ ' -yI\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'x' -yi\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' x ' -ya\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x ' -yA\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x \ ' -yIn\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'g' -yin\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' g ' -yan\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g ' -yAn\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g \ ' -yIN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'h' -yiN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' h ' -yaN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h ' -yAN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h \ ' -y1IL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'd' -y1iL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' d ' -y1aL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d ' -y1AL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d \ ' -y1Il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'e' -y1il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' e ' -y1al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e ' -y1Al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ e \ ' -y1I\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'x' -y1i\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' x ' -y1a\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x ' -y1A\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x \ ' -y1In\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'g' -y1in\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' g ' -y1an\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g ' -y1An\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ g \ ' -y1IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'h' -y1iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' h ' -y1aN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h ' -y1AN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h \ ' -y2IL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'b' -y2iL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' b ' -y2aL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ b ' -y2AL\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ b \ ' -y2Il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'd' -y2il\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' d ' -y2al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d ' -y2Al\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ d \ ' -y2I\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'x' -y2i\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' x ' -y2a\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x ' -y2A\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ x \ ' -y2In\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'h' -y2in\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' h ' -y2an\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h ' -y2An\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ h \ ' -y2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l 'k' -y2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l ' k ' -y2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ k ' -y2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ k \ l '\ k \ ' -vIL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -viL\ a \ b \ c \___\ e \ x \ g \ h \ i \ k \ l -vaL\ a \ b \ c ____\ e \ x \ g \ h \ i \ k \ l -vAL\ a \ b \ c ______e \ x \ g \ h \ i \ k \ l -vIl\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -vil\ a \ b \ c \ d \___\ x \ g \ h \ i \ k \ l -val\ a \ b \ c \ d ____\ x \ g \ h \ i \ k \ l -vAl\ a \ b \ c \ d ______x \ g \ h \ i \ k \ l -vI\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -vi\ a \ b \ c \ d \ e \___\ g \ h \ i \ k \ l -va\ a \ b \ c \ d \ e ____\ g \ h \ i \ k \ l -vA\ a \ b \ c \ d \ e ______g \ h \ i \ k \ l -vIn\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -vin\ a \ b \ c \ d \ e \ x \___\ h \ i \ k \ l -van\ a \ b \ c \ d \ e \ x ____\ h \ i \ k \ l -vAn\ a \ b \ c \ d \ e \ x ______h \ i \ k \ l -vIN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -viN\ a \ b \ c \ d \ e \ x \ g \___\ i \ k \ l -vaN\ a \ b \ c \ d \ e \ x \ g ____\ i \ k \ l -vAN\ a \ b \ c \ d \ e \ x \ g ______i \ k \ l -v1IL\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -v1iL\ a \ b \ c \___\ e \ x \ g \ h \ i \ k \ l -v1aL\ a \ b \ c ____\ e \ x \ g \ h \ i \ k \ l -v1AL\ a \ b \ c ______e \ x \ g \ h \ i \ k \ l -v1Il\ a \ b \ c \ d \ _ \ x \ g \ h \ i \ k \ l -v1il\ a \ b \ c \ d \___\ x \ g \ h \ i \ k \ l -v1al\ a \ b \ c \ d ____\ x \ g \ h \ i \ k \ l -v1Al\ a \ b \ c \ d ______x \ g \ h \ i \ k \ l -v1I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -v1i\ a \ b \ c \ d \ e \___\ g \ h \ i \ k \ l -v1a\ a \ b \ c \ d \ e ____\ g \ h \ i \ k \ l -v1A\ a \ b \ c \ d \ e ______g \ h \ i \ k \ l -v1In\ a \ b \ c \ d \ e \ x \ _ \ h \ i \ k \ l -v1in\ a \ b \ c \ d \ e \ x \___\ h \ i \ k \ l -v1an\ a \ b \ c \ d \ e \ x ____\ h \ i \ k \ l -v1An\ a \ b \ c \ d \ e \ x ______h \ i \ k \ l -v1IN\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -v1iN\ a \ b \ c \ d \ e \ x \ g \___\ i \ k \ l -v1aN\ a \ b \ c \ d \ e \ x \ g ____\ i \ k \ l -v1AN\ a \ b \ c \ d \ e \ x \ g ______i \ k \ l -v2IL\ a \ _ \ c \ d \ e \ x \ g \ h \ i \ k \ l -v2iL\ a \___\ c \ d \ e \ x \ g \ h \ i \ k \ l -v2aL\ a ____\ c \ d \ e \ x \ g \ h \ i \ k \ l -v2AL\ a ______c \ d \ e \ x \ g \ h \ i \ k \ l -v2Il\ a \ b \ c \ _ \ e \ x \ g \ h \ i \ k \ l -v2il\ a \ b \ c \___\ e \ x \ g \ h \ i \ k \ l -v2al\ a \ b \ c ____\ e \ x \ g \ h \ i \ k \ l -v2Al\ a \ b \ c ______e \ x \ g \ h \ i \ k \ l -v2I\ a \ b \ c \ d \ e \ _ \ g \ h \ i \ k \ l -v2i\ a \ b \ c \ d \ e \___\ g \ h \ i \ k \ l -v2a\ a \ b \ c \ d \ e ____\ g \ h \ i \ k \ l -v2A\ a \ b \ c \ d \ e ______g \ h \ i \ k \ l -v2In\ a \ b \ c \ d \ e \ x \ g \ _ \ i \ k \ l -v2in\ a \ b \ c \ d \ e \ x \ g \___\ i \ k \ l -v2an\ a \ b \ c \ d \ e \ x \ g ____\ i \ k \ l -v2An\ a \ b \ c \ d \ e \ x \ g ______i \ k \ l -v2IN\ a \ b \ c \ d \ e \ x \ g \ h \ i \ _ \ l -v2iN\ a \ b \ c \ d \ e \ x \ g \ h \ i \___\ l -v2aN\ a \ b \ c \ d \ e \ x \ g \ h \ i ____\ l -v2AN\ a \ b \ c \ d \ e \ x \ g \ h \ i ______l -a & b & c & d & e & x & g & h & i & k & l -cIL& a & b & c & _ & e & x & g & h & i & k & l -ciL& a & b & c &_& e & x & g & h & i & k & l -caL& a & b & c _& e & x & g & h & i & k & l -cAL& a & b & c _e & x & g & h & i & k & l -cIl& a & b & c & d & _ & x & g & h & i & k & l -cil& a & b & c & d &_& x & g & h & i & k & l -cal& a & b & c & d _& x & g & h & i & k & l -cAl& a & b & c & d _x & g & h & i & k & l -cI& a & b & c & d & e & _ & g & h & i & k & l -ci& a & b & c & d & e &_& g & h & i & k & l -ca& a & b & c & d & e _& g & h & i & k & l -cA& a & b & c & d & e _g & h & i & k & l -cIn& a & b & c & d & e & x & _ & h & i & k & l -cin& a & b & c & d & e & x &_& h & i & k & l -can& a & b & c & d & e & x _& h & i & k & l -cAn& a & b & c & d & e & x _h & i & k & l -cIN& a & b & c & d & e & x & g & _ & i & k & l -ciN& a & b & c & d & e & x & g &_& i & k & l -caN& a & b & c & d & e & x & g _& i & k & l -cAN& a & b & c & d & e & x & g _i & k & l -c1IL& a & b & c & _ & e & x & g & h & i & k & l -c1iL& a & b & c &_& e & x & g & h & i & k & l -c1aL& a & b & c _& e & x & g & h & i & k & l -c1AL& a & b & c _e & x & g & h & i & k & l -c1Il& a & b & c & d & _ & x & g & h & i & k & l -c1il& a & b & c & d &_& x & g & h & i & k & l -c1al& a & b & c & d _& x & g & h & i & k & l -c1Al& a & b & c & d _x & g & h & i & k & l -c1I& a & b & c & d & e & _ & g & h & i & k & l -c1i& a & b & c & d & e &_& g & h & i & k & l -c1a& a & b & c & d & e _& g & h & i & k & l -c1A& a & b & c & d & e _g & h & i & k & l -c1In& a & b & c & d & e & x & _ & h & i & k & l -c1in& a & b & c & d & e & x &_& h & i & k & l -c1an& a & b & c & d & e & x _& h & i & k & l -c1An& a & b & c & d & e & x _h & i & k & l -c1IN& a & b & c & d & e & x & g & _ & i & k & l -c1iN& a & b & c & d & e & x & g &_& i & k & l -c1aN& a & b & c & d & e & x & g _& i & k & l -c1AN& a & b & c & d & e & x & g _i & k & l -c2IL& a & _ & c & d & e & x & g & h & i & k & l -c2iL& a &_& c & d & e & x & g & h & i & k & l -c2aL& a _& c & d & e & x & g & h & i & k & l -c2AL& a _c & d & e & x & g & h & i & k & l -c2Il& a & b & c & _ & e & x & g & h & i & k & l -c2il& a & b & c &_& e & x & g & h & i & k & l -c2al& a & b & c _& e & x & g & h & i & k & l -c2Al& a & b & c _e & x & g & h & i & k & l -c2I& a & b & c & d & e & _ & g & h & i & k & l -c2i& a & b & c & d & e &_& g & h & i & k & l -c2a& a & b & c & d & e _& g & h & i & k & l -c2A& a & b & c & d & e _g & h & i & k & l -c2In& a & b & c & d & e & x & g & _ & i & k & l -c2in& a & b & c & d & e & x & g &_& i & k & l -c2an& a & b & c & d & e & x & g _& i & k & l -c2An& a & b & c & d & e & x & g _i & k & l -c2IN& a & b & c & d & e & x & g & h & i & _ & l -c2iN& a & b & c & d & e & x & g & h & i &_& l -c2aN& a & b & c & d & e & x & g & h & i _& l -c2AN& a & b & c & d & e & x & g & h & i _l -dIL& a & b & c & & e & x & g & h & i & k & l -diL& a & b & c && e & x & g & h & i & k & l -daL& a & b & c & e & x & g & h & i & k & l -dAL& a & b & c e & x & g & h & i & k & l -dIl& a & b & c & d & & x & g & h & i & k & l -dil& a & b & c & d && x & g & h & i & k & l -dal& a & b & c & d & x & g & h & i & k & l -dAl& a & b & c & d x & g & h & i & k & l -dI& a & b & c & d & e & & g & h & i & k & l -di& a & b & c & d & e && g & h & i & k & l -da& a & b & c & d & e & g & h & i & k & l -dA& a & b & c & d & e g & h & i & k & l -dIn& a & b & c & d & e & x & & h & i & k & l -din& a & b & c & d & e & x && h & i & k & l -dan& a & b & c & d & e & x & h & i & k & l -dAn& a & b & c & d & e & x h & i & k & l -dIN& a & b & c & d & e & x & g & & i & k & l -diN& a & b & c & d & e & x & g && i & k & l -daN& a & b & c & d & e & x & g & i & k & l -dAN& a & b & c & d & e & x & g i & k & l -d1IL& a & b & c & & e & x & g & h & i & k & l -d1iL& a & b & c && e & x & g & h & i & k & l -d1aL& a & b & c & e & x & g & h & i & k & l -d1AL& a & b & c e & x & g & h & i & k & l -d1Il& a & b & c & d & & x & g & h & i & k & l -d1il& a & b & c & d && x & g & h & i & k & l -d1al& a & b & c & d & x & g & h & i & k & l -d1Al& a & b & c & d x & g & h & i & k & l -d1I& a & b & c & d & e & & g & h & i & k & l -d1i& a & b & c & d & e && g & h & i & k & l -d1a& a & b & c & d & e & g & h & i & k & l -d1A& a & b & c & d & e g & h & i & k & l -d1In& a & b & c & d & e & x & & h & i & k & l -d1in& a & b & c & d & e & x && h & i & k & l -d1an& a & b & c & d & e & x & h & i & k & l -d1An& a & b & c & d & e & x h & i & k & l -d1IN& a & b & c & d & e & x & g & & i & k & l -d1iN& a & b & c & d & e & x & g && i & k & l -d1aN& a & b & c & d & e & x & g & i & k & l -d1AN& a & b & c & d & e & x & g i & k & l -d2IL& a & & c & d & e & x & g & h & i & k & l -d2iL& a && c & d & e & x & g & h & i & k & l -d2aL& a & c & d & e & x & g & h & i & k & l -d2AL& a c & d & e & x & g & h & i & k & l -d2Il& a & b & c & & e & x & g & h & i & k & l -d2il& a & b & c && e & x & g & h & i & k & l -d2al& a & b & c & e & x & g & h & i & k & l -d2Al& a & b & c e & x & g & h & i & k & l -d2I& a & b & c & d & e & & g & h & i & k & l -d2i& a & b & c & d & e && g & h & i & k & l -d2a& a & b & c & d & e & g & h & i & k & l -d2A& a & b & c & d & e g & h & i & k & l -d2In& a & b & c & d & e & x & g & & i & k & l -d2in& a & b & c & d & e & x & g && i & k & l -d2an& a & b & c & d & e & x & g & i & k & l -d2An& a & b & c & d & e & x & g i & k & l -d2IN& a & b & c & d & e & x & g & h & i & & l -d2iN& a & b & c & d & e & x & g & h & i && l -d2aN& a & b & c & d & e & x & g & h & i & l -d2AN& a & b & c & d & e & x & g & h & i l -yIL& a & b & c & d & e & x & g & h & i & k & l 'd' -yiL& a & b & c & d & e & x & g & h & i & k & l ' d ' -yaL& a & b & c & d & e & x & g & h & i & k & l '& d ' -yAL& a & b & c & d & e & x & g & h & i & k & l '& d & ' -yIl& a & b & c & d & e & x & g & h & i & k & l 'e' -yil& a & b & c & d & e & x & g & h & i & k & l ' e ' -yal& a & b & c & d & e & x & g & h & i & k & l '& e ' -yAl& a & b & c & d & e & x & g & h & i & k & l '& e & ' -yI& a & b & c & d & e & x & g & h & i & k & l 'x' -yi& a & b & c & d & e & x & g & h & i & k & l ' x ' -ya& a & b & c & d & e & x & g & h & i & k & l '& x ' -yA& a & b & c & d & e & x & g & h & i & k & l '& x & ' -yIn& a & b & c & d & e & x & g & h & i & k & l 'g' -yin& a & b & c & d & e & x & g & h & i & k & l ' g ' -yan& a & b & c & d & e & x & g & h & i & k & l '& g ' -yAn& a & b & c & d & e & x & g & h & i & k & l '& g & ' -yIN& a & b & c & d & e & x & g & h & i & k & l 'h' -yiN& a & b & c & d & e & x & g & h & i & k & l ' h ' -yaN& a & b & c & d & e & x & g & h & i & k & l '& h ' -yAN& a & b & c & d & e & x & g & h & i & k & l '& h & ' -y1IL& a & b & c & d & e & x & g & h & i & k & l 'd' -y1iL& a & b & c & d & e & x & g & h & i & k & l ' d ' -y1aL& a & b & c & d & e & x & g & h & i & k & l '& d ' -y1AL& a & b & c & d & e & x & g & h & i & k & l '& d & ' -y1Il& a & b & c & d & e & x & g & h & i & k & l 'e' -y1il& a & b & c & d & e & x & g & h & i & k & l ' e ' -y1al& a & b & c & d & e & x & g & h & i & k & l '& e ' -y1Al& a & b & c & d & e & x & g & h & i & k & l '& e & ' -y1I& a & b & c & d & e & x & g & h & i & k & l 'x' -y1i& a & b & c & d & e & x & g & h & i & k & l ' x ' -y1a& a & b & c & d & e & x & g & h & i & k & l '& x ' -y1A& a & b & c & d & e & x & g & h & i & k & l '& x & ' -y1In& a & b & c & d & e & x & g & h & i & k & l 'g' -y1in& a & b & c & d & e & x & g & h & i & k & l ' g ' -y1an& a & b & c & d & e & x & g & h & i & k & l '& g ' -y1An& a & b & c & d & e & x & g & h & i & k & l '& g & ' -y1IN& a & b & c & d & e & x & g & h & i & k & l 'h' -y1iN& a & b & c & d & e & x & g & h & i & k & l ' h ' -y1aN& a & b & c & d & e & x & g & h & i & k & l '& h ' -y1AN& a & b & c & d & e & x & g & h & i & k & l '& h & ' -y2IL& a & b & c & d & e & x & g & h & i & k & l 'b' -y2iL& a & b & c & d & e & x & g & h & i & k & l ' b ' -y2aL& a & b & c & d & e & x & g & h & i & k & l '& b ' -y2AL& a & b & c & d & e & x & g & h & i & k & l '& b & ' -y2Il& a & b & c & d & e & x & g & h & i & k & l 'd' -y2il& a & b & c & d & e & x & g & h & i & k & l ' d ' -y2al& a & b & c & d & e & x & g & h & i & k & l '& d ' -y2Al& a & b & c & d & e & x & g & h & i & k & l '& d & ' -y2I& a & b & c & d & e & x & g & h & i & k & l 'x' -y2i& a & b & c & d & e & x & g & h & i & k & l ' x ' -y2a& a & b & c & d & e & x & g & h & i & k & l '& x ' -y2A& a & b & c & d & e & x & g & h & i & k & l '& x & ' -y2In& a & b & c & d & e & x & g & h & i & k & l 'h' -y2in& a & b & c & d & e & x & g & h & i & k & l ' h ' -y2an& a & b & c & d & e & x & g & h & i & k & l '& h ' -y2An& a & b & c & d & e & x & g & h & i & k & l '& h & ' -y2IN& a & b & c & d & e & x & g & h & i & k & l 'k' -y2iN& a & b & c & d & e & x & g & h & i & k & l ' k ' -y2aN& a & b & c & d & e & x & g & h & i & k & l '& k ' -y2AN& a & b & c & d & e & x & g & h & i & k & l '& k & ' -vIL& a & b & c & _ & e & x & g & h & i & k & l -viL& a & b & c &___& e & x & g & h & i & k & l -vaL& a & b & c ____& e & x & g & h & i & k & l -vAL& a & b & c ______e & x & g & h & i & k & l -vIl& a & b & c & d & _ & x & g & h & i & k & l -vil& a & b & c & d &___& x & g & h & i & k & l -val& a & b & c & d ____& x & g & h & i & k & l -vAl& a & b & c & d ______x & g & h & i & k & l -vI& a & b & c & d & e & _ & g & h & i & k & l -vi& a & b & c & d & e &___& g & h & i & k & l -va& a & b & c & d & e ____& g & h & i & k & l -vA& a & b & c & d & e ______g & h & i & k & l -vIn& a & b & c & d & e & x & _ & h & i & k & l -vin& a & b & c & d & e & x &___& h & i & k & l -van& a & b & c & d & e & x ____& h & i & k & l -vAn& a & b & c & d & e & x ______h & i & k & l -vIN& a & b & c & d & e & x & g & _ & i & k & l -viN& a & b & c & d & e & x & g &___& i & k & l -vaN& a & b & c & d & e & x & g ____& i & k & l -vAN& a & b & c & d & e & x & g ______i & k & l -v1IL& a & b & c & _ & e & x & g & h & i & k & l -v1iL& a & b & c &___& e & x & g & h & i & k & l -v1aL& a & b & c ____& e & x & g & h & i & k & l -v1AL& a & b & c ______e & x & g & h & i & k & l -v1Il& a & b & c & d & _ & x & g & h & i & k & l -v1il& a & b & c & d &___& x & g & h & i & k & l -v1al& a & b & c & d ____& x & g & h & i & k & l -v1Al& a & b & c & d ______x & g & h & i & k & l -v1I& a & b & c & d & e & _ & g & h & i & k & l -v1i& a & b & c & d & e &___& g & h & i & k & l -v1a& a & b & c & d & e ____& g & h & i & k & l -v1A& a & b & c & d & e ______g & h & i & k & l -v1In& a & b & c & d & e & x & _ & h & i & k & l -v1in& a & b & c & d & e & x &___& h & i & k & l -v1an& a & b & c & d & e & x ____& h & i & k & l -v1An& a & b & c & d & e & x ______h & i & k & l -v1IN& a & b & c & d & e & x & g & _ & i & k & l -v1iN& a & b & c & d & e & x & g &___& i & k & l -v1aN& a & b & c & d & e & x & g ____& i & k & l -v1AN& a & b & c & d & e & x & g ______i & k & l -v2IL& a & _ & c & d & e & x & g & h & i & k & l -v2iL& a &___& c & d & e & x & g & h & i & k & l -v2aL& a ____& c & d & e & x & g & h & i & k & l -v2AL& a ______c & d & e & x & g & h & i & k & l -v2Il& a & b & c & _ & e & x & g & h & i & k & l -v2il& a & b & c &___& e & x & g & h & i & k & l -v2al& a & b & c ____& e & x & g & h & i & k & l -v2Al& a & b & c ______e & x & g & h & i & k & l -v2I& a & b & c & d & e & _ & g & h & i & k & l -v2i& a & b & c & d & e &___& g & h & i & k & l -v2a& a & b & c & d & e ____& g & h & i & k & l -v2A& a & b & c & d & e ______g & h & i & k & l -v2In& a & b & c & d & e & x & g & _ & i & k & l -v2in& a & b & c & d & e & x & g &___& i & k & l -v2an& a & b & c & d & e & x & g ____& i & k & l -v2An& a & b & c & d & e & x & g ______i & k & l -v2IN& a & b & c & d & e & x & g & h & i & _ & l -v2iN& a & b & c & d & e & x & g & h & i &___& l -v2aN& a & b & c & d & e & x & g & h & i ____& l -v2AN& a & b & c & d & e & x & g & h & i ______l -a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l -cIL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -ciL$ a $ b $ c $_$ e $ x $ g $ h $ i $ k $ l -caL$ a $ b $ c _$ e $ x $ g $ h $ i $ k $ l -cAL$ a $ b $ c _e $ x $ g $ h $ i $ k $ l -cIl$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -cil$ a $ b $ c $ d $_$ x $ g $ h $ i $ k $ l -cal$ a $ b $ c $ d _$ x $ g $ h $ i $ k $ l -cAl$ a $ b $ c $ d _x $ g $ h $ i $ k $ l -cI$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -ci$ a $ b $ c $ d $ e $_$ g $ h $ i $ k $ l -ca$ a $ b $ c $ d $ e _$ g $ h $ i $ k $ l -cA$ a $ b $ c $ d $ e _g $ h $ i $ k $ l -cIn$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -cin$ a $ b $ c $ d $ e $ x $_$ h $ i $ k $ l -can$ a $ b $ c $ d $ e $ x _$ h $ i $ k $ l -cAn$ a $ b $ c $ d $ e $ x _h $ i $ k $ l -cIN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -ciN$ a $ b $ c $ d $ e $ x $ g $_$ i $ k $ l -caN$ a $ b $ c $ d $ e $ x $ g _$ i $ k $ l -cAN$ a $ b $ c $ d $ e $ x $ g _i $ k $ l -c1IL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -c1iL$ a $ b $ c $_$ e $ x $ g $ h $ i $ k $ l -c1aL$ a $ b $ c _$ e $ x $ g $ h $ i $ k $ l -c1AL$ a $ b $ c _e $ x $ g $ h $ i $ k $ l -c1Il$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -c1il$ a $ b $ c $ d $_$ x $ g $ h $ i $ k $ l -c1al$ a $ b $ c $ d _$ x $ g $ h $ i $ k $ l -c1Al$ a $ b $ c $ d _x $ g $ h $ i $ k $ l -c1I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -c1i$ a $ b $ c $ d $ e $_$ g $ h $ i $ k $ l -c1a$ a $ b $ c $ d $ e _$ g $ h $ i $ k $ l -c1A$ a $ b $ c $ d $ e _g $ h $ i $ k $ l -c1In$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -c1in$ a $ b $ c $ d $ e $ x $_$ h $ i $ k $ l -c1an$ a $ b $ c $ d $ e $ x _$ h $ i $ k $ l -c1An$ a $ b $ c $ d $ e $ x _h $ i $ k $ l -c1IN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -c1iN$ a $ b $ c $ d $ e $ x $ g $_$ i $ k $ l -c1aN$ a $ b $ c $ d $ e $ x $ g _$ i $ k $ l -c1AN$ a $ b $ c $ d $ e $ x $ g _i $ k $ l -c2IL$ a $ _ $ c $ d $ e $ x $ g $ h $ i $ k $ l -c2iL$ a $_$ c $ d $ e $ x $ g $ h $ i $ k $ l -c2aL$ a _$ c $ d $ e $ x $ g $ h $ i $ k $ l -c2AL$ a _c $ d $ e $ x $ g $ h $ i $ k $ l -c2Il$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -c2il$ a $ b $ c $_$ e $ x $ g $ h $ i $ k $ l -c2al$ a $ b $ c _$ e $ x $ g $ h $ i $ k $ l -c2Al$ a $ b $ c _e $ x $ g $ h $ i $ k $ l -c2I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -c2i$ a $ b $ c $ d $ e $_$ g $ h $ i $ k $ l -c2a$ a $ b $ c $ d $ e _$ g $ h $ i $ k $ l -c2A$ a $ b $ c $ d $ e _g $ h $ i $ k $ l -c2In$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -c2in$ a $ b $ c $ d $ e $ x $ g $_$ i $ k $ l -c2an$ a $ b $ c $ d $ e $ x $ g _$ i $ k $ l -c2An$ a $ b $ c $ d $ e $ x $ g _i $ k $ l -c2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ _ $ l -c2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $_$ l -c2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i _$ l -c2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i _l -dIL$ a $ b $ c $ $ e $ x $ g $ h $ i $ k $ l -diL$ a $ b $ c $$ e $ x $ g $ h $ i $ k $ l -daL$ a $ b $ c $ e $ x $ g $ h $ i $ k $ l -dAL$ a $ b $ c e $ x $ g $ h $ i $ k $ l -dIl$ a $ b $ c $ d $ $ x $ g $ h $ i $ k $ l -dil$ a $ b $ c $ d $$ x $ g $ h $ i $ k $ l -dal$ a $ b $ c $ d $ x $ g $ h $ i $ k $ l -dAl$ a $ b $ c $ d x $ g $ h $ i $ k $ l -dI$ a $ b $ c $ d $ e $ $ g $ h $ i $ k $ l -di$ a $ b $ c $ d $ e $$ g $ h $ i $ k $ l -da$ a $ b $ c $ d $ e $ g $ h $ i $ k $ l -dA$ a $ b $ c $ d $ e g $ h $ i $ k $ l -dIn$ a $ b $ c $ d $ e $ x $ $ h $ i $ k $ l -din$ a $ b $ c $ d $ e $ x $$ h $ i $ k $ l -dan$ a $ b $ c $ d $ e $ x $ h $ i $ k $ l -dAn$ a $ b $ c $ d $ e $ x h $ i $ k $ l -dIN$ a $ b $ c $ d $ e $ x $ g $ $ i $ k $ l -diN$ a $ b $ c $ d $ e $ x $ g $$ i $ k $ l -daN$ a $ b $ c $ d $ e $ x $ g $ i $ k $ l -dAN$ a $ b $ c $ d $ e $ x $ g i $ k $ l -d1IL$ a $ b $ c $ $ e $ x $ g $ h $ i $ k $ l -d1iL$ a $ b $ c $$ e $ x $ g $ h $ i $ k $ l -d1aL$ a $ b $ c $ e $ x $ g $ h $ i $ k $ l -d1AL$ a $ b $ c e $ x $ g $ h $ i $ k $ l -d1Il$ a $ b $ c $ d $ $ x $ g $ h $ i $ k $ l -d1il$ a $ b $ c $ d $$ x $ g $ h $ i $ k $ l -d1al$ a $ b $ c $ d $ x $ g $ h $ i $ k $ l -d1Al$ a $ b $ c $ d x $ g $ h $ i $ k $ l -d1I$ a $ b $ c $ d $ e $ $ g $ h $ i $ k $ l -d1i$ a $ b $ c $ d $ e $$ g $ h $ i $ k $ l -d1a$ a $ b $ c $ d $ e $ g $ h $ i $ k $ l -d1A$ a $ b $ c $ d $ e g $ h $ i $ k $ l -d1In$ a $ b $ c $ d $ e $ x $ $ h $ i $ k $ l -d1in$ a $ b $ c $ d $ e $ x $$ h $ i $ k $ l -d1an$ a $ b $ c $ d $ e $ x $ h $ i $ k $ l -d1An$ a $ b $ c $ d $ e $ x h $ i $ k $ l -d1IN$ a $ b $ c $ d $ e $ x $ g $ $ i $ k $ l -d1iN$ a $ b $ c $ d $ e $ x $ g $$ i $ k $ l -d1aN$ a $ b $ c $ d $ e $ x $ g $ i $ k $ l -d1AN$ a $ b $ c $ d $ e $ x $ g i $ k $ l -d2IL$ a $ $ c $ d $ e $ x $ g $ h $ i $ k $ l -d2iL$ a $$ c $ d $ e $ x $ g $ h $ i $ k $ l -d2aL$ a $ c $ d $ e $ x $ g $ h $ i $ k $ l -d2AL$ a c $ d $ e $ x $ g $ h $ i $ k $ l -d2Il$ a $ b $ c $ $ e $ x $ g $ h $ i $ k $ l -d2il$ a $ b $ c $$ e $ x $ g $ h $ i $ k $ l -d2al$ a $ b $ c $ e $ x $ g $ h $ i $ k $ l -d2Al$ a $ b $ c e $ x $ g $ h $ i $ k $ l -d2I$ a $ b $ c $ d $ e $ $ g $ h $ i $ k $ l -d2i$ a $ b $ c $ d $ e $$ g $ h $ i $ k $ l -d2a$ a $ b $ c $ d $ e $ g $ h $ i $ k $ l -d2A$ a $ b $ c $ d $ e g $ h $ i $ k $ l -d2In$ a $ b $ c $ d $ e $ x $ g $ $ i $ k $ l -d2in$ a $ b $ c $ d $ e $ x $ g $$ i $ k $ l -d2an$ a $ b $ c $ d $ e $ x $ g $ i $ k $ l -d2An$ a $ b $ c $ d $ e $ x $ g i $ k $ l -d2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ $ l -d2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $$ l -d2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ l -d2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i l -yIL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'd' -yiL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' d ' -yaL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d ' -yAL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d $ ' -yIl$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'e' -yil$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' e ' -yal$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e ' -yAl$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e $ ' -yI$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'x' -yi$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' x ' -ya$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x ' -yA$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x $ ' -yIn$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'g' -yin$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' g ' -yan$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g ' -yAn$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g $ ' -yIN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'h' -yiN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' h ' -yaN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h ' -yAN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h $ ' -y1IL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'd' -y1iL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' d ' -y1aL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d ' -y1AL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d $ ' -y1Il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'e' -y1il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' e ' -y1al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e ' -y1Al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ e $ ' -y1I$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'x' -y1i$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' x ' -y1a$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x ' -y1A$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x $ ' -y1In$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'g' -y1in$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' g ' -y1an$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g ' -y1An$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ g $ ' -y1IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'h' -y1iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' h ' -y1aN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h ' -y1AN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h $ ' -y2IL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'b' -y2iL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' b ' -y2aL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ b ' -y2AL$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ b $ ' -y2Il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'd' -y2il$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' d ' -y2al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d ' -y2Al$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ d $ ' -y2I$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'x' -y2i$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' x ' -y2a$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x ' -y2A$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ x $ ' -y2In$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'h' -y2in$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' h ' -y2an$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h ' -y2An$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ h $ ' -y2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l 'k' -y2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l ' k ' -y2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ k ' -y2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ k $ l '$ k $ ' -vIL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -viL$ a $ b $ c $___$ e $ x $ g $ h $ i $ k $ l -vaL$ a $ b $ c ____$ e $ x $ g $ h $ i $ k $ l -vAL$ a $ b $ c ______e $ x $ g $ h $ i $ k $ l -vIl$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -vil$ a $ b $ c $ d $___$ x $ g $ h $ i $ k $ l -val$ a $ b $ c $ d ____$ x $ g $ h $ i $ k $ l -vAl$ a $ b $ c $ d ______x $ g $ h $ i $ k $ l -vI$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -vi$ a $ b $ c $ d $ e $___$ g $ h $ i $ k $ l -va$ a $ b $ c $ d $ e ____$ g $ h $ i $ k $ l -vA$ a $ b $ c $ d $ e ______g $ h $ i $ k $ l -vIn$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -vin$ a $ b $ c $ d $ e $ x $___$ h $ i $ k $ l -van$ a $ b $ c $ d $ e $ x ____$ h $ i $ k $ l -vAn$ a $ b $ c $ d $ e $ x ______h $ i $ k $ l -vIN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -viN$ a $ b $ c $ d $ e $ x $ g $___$ i $ k $ l -vaN$ a $ b $ c $ d $ e $ x $ g ____$ i $ k $ l -vAN$ a $ b $ c $ d $ e $ x $ g ______i $ k $ l -v1IL$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -v1iL$ a $ b $ c $___$ e $ x $ g $ h $ i $ k $ l -v1aL$ a $ b $ c ____$ e $ x $ g $ h $ i $ k $ l -v1AL$ a $ b $ c ______e $ x $ g $ h $ i $ k $ l -v1Il$ a $ b $ c $ d $ _ $ x $ g $ h $ i $ k $ l -v1il$ a $ b $ c $ d $___$ x $ g $ h $ i $ k $ l -v1al$ a $ b $ c $ d ____$ x $ g $ h $ i $ k $ l -v1Al$ a $ b $ c $ d ______x $ g $ h $ i $ k $ l -v1I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -v1i$ a $ b $ c $ d $ e $___$ g $ h $ i $ k $ l -v1a$ a $ b $ c $ d $ e ____$ g $ h $ i $ k $ l -v1A$ a $ b $ c $ d $ e ______g $ h $ i $ k $ l -v1In$ a $ b $ c $ d $ e $ x $ _ $ h $ i $ k $ l -v1in$ a $ b $ c $ d $ e $ x $___$ h $ i $ k $ l -v1an$ a $ b $ c $ d $ e $ x ____$ h $ i $ k $ l -v1An$ a $ b $ c $ d $ e $ x ______h $ i $ k $ l -v1IN$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -v1iN$ a $ b $ c $ d $ e $ x $ g $___$ i $ k $ l -v1aN$ a $ b $ c $ d $ e $ x $ g ____$ i $ k $ l -v1AN$ a $ b $ c $ d $ e $ x $ g ______i $ k $ l -v2IL$ a $ _ $ c $ d $ e $ x $ g $ h $ i $ k $ l -v2iL$ a $___$ c $ d $ e $ x $ g $ h $ i $ k $ l -v2aL$ a ____$ c $ d $ e $ x $ g $ h $ i $ k $ l -v2AL$ a ______c $ d $ e $ x $ g $ h $ i $ k $ l -v2Il$ a $ b $ c $ _ $ e $ x $ g $ h $ i $ k $ l -v2il$ a $ b $ c $___$ e $ x $ g $ h $ i $ k $ l -v2al$ a $ b $ c ____$ e $ x $ g $ h $ i $ k $ l -v2Al$ a $ b $ c ______e $ x $ g $ h $ i $ k $ l -v2I$ a $ b $ c $ d $ e $ _ $ g $ h $ i $ k $ l -v2i$ a $ b $ c $ d $ e $___$ g $ h $ i $ k $ l -v2a$ a $ b $ c $ d $ e ____$ g $ h $ i $ k $ l -v2A$ a $ b $ c $ d $ e ______g $ h $ i $ k $ l -v2In$ a $ b $ c $ d $ e $ x $ g $ _ $ i $ k $ l -v2in$ a $ b $ c $ d $ e $ x $ g $___$ i $ k $ l -v2an$ a $ b $ c $ d $ e $ x $ g ____$ i $ k $ l -v2An$ a $ b $ c $ d $ e $ x $ g ______i $ k $ l -v2IN$ a $ b $ c $ d $ e $ x $ g $ h $ i $ _ $ l -v2iN$ a $ b $ c $ d $ e $ x $ g $ h $ i $___$ l -v2aN$ a $ b $ c $ d $ e $ x $ g $ h $ i ____$ l -v2AN$ a $ b $ c $ d $ e $ x $ g $ h $ i ______l - -a ( b , c ( d ) , d ( x , e ) , f ) g -cIla a ( b , _ , d ( x , e ) , f ) g -cila a ( b ,_, d ( x , e ) , f ) g -cala a ( b _, d ( x , e ) , f ) g -cAla a ( b _d ( x , e ) , f ) g -cIa a ( b , c ( d ) , d ( _ , e ) , f ) g -cia a ( b , c ( d ) , d (_, e ) , f ) g -caa a ( b , c ( d ) , d ( _e ) , f ) g -cAa a ( b , c ( d ) , d _e ) , f ) g -cIna a ( b , c ( d ) , d ( x , _ ) , f ) g -cina a ( b , c ( d ) , d ( x ,_) , f ) g -cana a ( b , c ( d ) , d ( x_ ) , f ) g -cAna a ( b , c ( d ) , d ( x _, f ) g -c1Ila a ( b , _ , d ( x , e ) , f ) g -c1ila a ( b ,_, d ( x , e ) , f ) g -c1ala a ( b _, d ( x , e ) , f ) g -c1Ala a ( b _d ( x , e ) , f ) g -c1Ia a ( b , c ( d ) , d ( _ , e ) , f ) g -c1ia a ( b , c ( d ) , d (_, e ) , f ) g -c1aa a ( b , c ( d ) , d ( _e ) , f ) g -c1Aa a ( b , c ( d ) , d _e ) , f ) g -c1Ina a ( b , c ( d ) , d ( x , _ ) , f ) g -c1ina a ( b , c ( d ) , d ( x ,_) , f ) g -c1ana a ( b , c ( d ) , d ( x_ ) , f ) g -c1Ana a ( b , c ( d ) , d ( x _, f ) g -c2Ila a ( b , c ( _ ) , d ( x , e ) , f ) g -c2ila a ( b , c (_) , d ( x , e ) , f ) g -c2ala a ( b , c (_) , d ( x , e ) , f ) g -c2Ala a ( b , c _, d ( x , e ) , f ) g -c2Ia a ( b , c ( d ) , _ , f ) g -c2ia a ( b , c ( d ) ,_, f ) g -c2aa a ( b , c ( d ) _, f ) g -c2Aa a ( b , c ( d ) _f ) g -c2Ina a ( b , c ( d ) , d ( x , e ) , _ ) g -c2ina a ( b , c ( d ) , d ( x , e ) ,_) g -c2ana a ( b , c ( d ) , d ( x , e )_ ) g -c2Ana a ( b , c ( d ) , d ( x , e ) _g -dIla a ( b , , d ( x , e ) , f ) g -dila a ( b ,, d ( x , e ) , f ) g -dala a ( b , d ( x , e ) , f ) g -dAla a ( b d ( x , e ) , f ) g -dIa a ( b , c ( d ) , d ( , e ) , f ) g -dia a ( b , c ( d ) , d (, e ) , f ) g -daa a ( b , c ( d ) , d ( e ) , f ) g -dAa a ( b , c ( d ) , d e ) , f ) g -dIna a ( b , c ( d ) , d ( x , ) , f ) g -dina a ( b , c ( d ) , d ( x ,) , f ) g -dana a ( b , c ( d ) , d ( x ) , f ) g -dAna a ( b , c ( d ) , d ( x , f ) g -d1Ila a ( b , , d ( x , e ) , f ) g -d1ila a ( b ,, d ( x , e ) , f ) g -d1ala a ( b , d ( x , e ) , f ) g -d1Ala a ( b d ( x , e ) , f ) g -d1Ia a ( b , c ( d ) , d ( , e ) , f ) g -d1ia a ( b , c ( d ) , d (, e ) , f ) g -d1aa a ( b , c ( d ) , d ( e ) , f ) g -d1Aa a ( b , c ( d ) , d e ) , f ) g -d1Ina a ( b , c ( d ) , d ( x , ) , f ) g -d1ina a ( b , c ( d ) , d ( x ,) , f ) g -d1ana a ( b , c ( d ) , d ( x ) , f ) g -d1Ana a ( b , c ( d ) , d ( x , f ) g -d2Ila a ( b , c ( ) , d ( x , e ) , f ) g -d2ila a ( b , c () , d ( x , e ) , f ) g -d2ala a ( b , c () , d ( x , e ) , f ) g -d2Ala a ( b , c , d ( x , e ) , f ) g -d2Ia a ( b , c ( d ) , , f ) g -d2ia a ( b , c ( d ) ,, f ) g -d2aa a ( b , c ( d ) , f ) g -d2Aa a ( b , c ( d ) f ) g -d2Ina a ( b , c ( d ) , d ( x , e ) , ) g -d2ina a ( b , c ( d ) , d ( x , e ) ,) g -d2ana a ( b , c ( d ) , d ( x , e ) ) g -d2Ana a ( b , c ( d ) , d ( x , e ) g -yIla a ( b , c ( d ) , d ( x , e ) , f ) g 'c ( d )' -yila a ( b , c ( d ) , d ( x , e ) , f ) g ' c ( d ) ' -yala a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) ' -yAla a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) , ' -yIa a ( b , c ( d ) , d ( x , e ) , f ) g 'x' -yia a ( b , c ( d ) , d ( x , e ) , f ) g ' x ' -yaa a ( b , c ( d ) , d ( x , e ) , f ) g 'x , ' -yAa a ( b , c ( d ) , d ( x , e ) , f ) g '( x , ' -yIna a ( b , c ( d ) , d ( x , e ) , f ) g 'e' -yina a ( b , c ( d ) , d ( x , e ) , f ) g ' e ' -yana a ( b , c ( d ) , d ( x , e ) , f ) g ' , e' -yAna a ( b , c ( d ) , d ( x , e ) , f ) g ', e ) ' -y1Ila a ( b , c ( d ) , d ( x , e ) , f ) g 'c ( d )' -y1ila a ( b , c ( d ) , d ( x , e ) , f ) g ' c ( d ) ' -y1ala a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) ' -y1Ala a ( b , c ( d ) , d ( x , e ) , f ) g ', c ( d ) , ' -y1Ia a ( b , c ( d ) , d ( x , e ) , f ) g 'x' -y1ia a ( b , c ( d ) , d ( x , e ) , f ) g ' x ' -y1aa a ( b , c ( d ) , d ( x , e ) , f ) g 'x , ' -y1Aa a ( b , c ( d ) , d ( x , e ) , f ) g '( x , ' -y1Ina a ( b , c ( d ) , d ( x , e ) , f ) g 'e' -y1ina a ( b , c ( d ) , d ( x , e ) , f ) g ' e ' -y1ana a ( b , c ( d ) , d ( x , e ) , f ) g ' , e' -y1Ana a ( b , c ( d ) , d ( x , e ) , f ) g ', e ) ' -y2Ila a ( b , c ( d ) , d ( x , e ) , f ) g 'd' -y2ila a ( b , c ( d ) , d ( x , e ) , f ) g ' d ' -y2ala a ( b , c ( d ) , d ( x , e ) , f ) g ' d ' -y2Ala a ( b , c ( d ) , d ( x , e ) , f ) g '( d ) ' -y2Ia a ( b , c ( d ) , d ( x , e ) , f ) g 'd ( x , e )' -y2ia a ( b , c ( d ) , d ( x , e ) , f ) g ' d ( x , e ) ' -y2aa a ( b , c ( d ) , d ( x , e ) , f ) g ', d ( x , e ) ' -y2Aa a ( b , c ( d ) , d ( x , e ) , f ) g ', d ( x , e ) , ' -y2Ina a ( b , c ( d ) , d ( x , e ) , f ) g 'f' -y2ina a ( b , c ( d ) , d ( x , e ) , f ) g ' f ' -y2ana a ( b , c ( d ) , d ( x , e ) , f ) g ' , f' -y2Ana a ( b , c ( d ) , d ( x , e ) , f ) g ', f ) ' -vIla a ( b , _______ , d ( x , e ) , f ) g -vila a ( b ,_________, d ( x , e ) , f ) g -vala a ( b __________, d ( x , e ) , f ) g -vAla a ( b ____________d ( x , e ) , f ) g -vIa a ( b , c ( d ) , d ( _ , e ) , f ) g -via a ( b , c ( d ) , d (___, e ) , f ) g -vaa a ( b , c ( d ) , d ( ____e ) , f ) g -vAa a ( b , c ( d ) , d ______e ) , f ) g -vIna a ( b , c ( d ) , d ( x , _ ) , f ) g -vina a ( b , c ( d ) , d ( x ,___) , f ) g -vana a ( b , c ( d ) , d ( x____ ) , f ) g -vAna a ( b , c ( d ) , d ( x ______, f ) g -v1Ila a ( b , _______ , d ( x , e ) , f ) g -v1ila a ( b ,_________, d ( x , e ) , f ) g -v1ala a ( b __________, d ( x , e ) , f ) g -v1Ala a ( b ____________d ( x , e ) , f ) g -v1Ia a ( b , c ( d ) , d ( _ , e ) , f ) g -v1ia a ( b , c ( d ) , d (___, e ) , f ) g -v1aa a ( b , c ( d ) , d ( ____e ) , f ) g -v1Aa a ( b , c ( d ) , d ______e ) , f ) g -v1Ina a ( b , c ( d ) , d ( x , _ ) , f ) g -v1ina a ( b , c ( d ) , d ( x ,___) , f ) g -v1ana a ( b , c ( d ) , d ( x____ ) , f ) g -v1Ana a ( b , c ( d ) , d ( x ______, f ) g -v2Ila a ( b , c ( _ ) , d ( x , e ) , f ) g -v2ila a ( b , c (___) , d ( x , e ) , f ) g -v2ala a ( b , c (___) , d ( x , e ) , f ) g -v2Ala a ( b , c ______, d ( x , e ) , f ) g -v2Ia a ( b , c ( d ) , ___________ , f ) g -v2ia a ( b , c ( d ) ,_____________, f ) g -v2aa a ( b , c ( d ) ______________, f ) g -v2Aa a ( b , c ( d ) ________________f ) g -v2Ina a ( b , c ( d ) , d ( x , e ) , _ ) g -v2ina a ( b , c ( d ) , d ( x , e ) ,___) g -v2ana a ( b , c ( d ) , d ( x , e )____ ) g -v2Ana a ( b , c ( d ) , d ( x , e ) ______g diff --git a/vim/default/bundle/targets.vim/test/test2.in b/vim/default/bundle/targets.vim/test/test2.in deleted file mode 100644 index e3d74d3986..0000000000 --- a/vim/default/bundle/targets.vim/test/test2.in +++ /dev/null @@ -1,25 +0,0 @@ -// comment 1 -function f() { - return 4; - } - -// comment 2 -function f() { - return 4; - } - -// comment 3 -int a = 5; -int b = a > 0 - ? 1 - : 2; - -// comment 4 -string x = `line 1 -line 2 -line 3`; - -// comment 5 -function f() { - return 4; -} diff --git a/vim/default/bundle/targets.vim/test/test2.ok b/vim/default/bundle/targets.vim/test/test2.ok deleted file mode 100644 index 1652a4bb74..0000000000 --- a/vim/default/bundle/targets.vim/test/test2.ok +++ /dev/null @@ -1,20 +0,0 @@ -// comment 1 -function f() { - foo - } - -// comment 2 -function f() { - } - -// comment 3 -int a = 5; -foo; - -// comment 4 -string x = `foo`; - -// comment 5 -function f() { - foo -} diff --git a/vim/default/bundle/targets.vim/test/test2.out b/vim/default/bundle/targets.vim/test/test2.out deleted file mode 100644 index 1652a4bb74..0000000000 --- a/vim/default/bundle/targets.vim/test/test2.out +++ /dev/null @@ -1,20 +0,0 @@ -// comment 1 -function f() { - foo - } - -// comment 2 -function f() { - } - -// comment 3 -int a = 5; -foo; - -// comment 4 -string x = `foo`; - -// comment 5 -function f() { - foo -} diff --git a/vim/default/bundle/targets.vim/test/test3.in b/vim/default/bundle/targets.vim/test/test3.in deleted file mode 100644 index 8cc923153c..0000000000 --- a/vim/default/bundle/targets.vim/test/test3.in +++ /dev/null @@ -1,42 +0,0 @@ -A -a ( b ) c - -B ( a ) b -a ( b ) C - -D ( a -b ) c - -a ( b -c ) E - -a ( b -F ( ) c -d ) e - -a ( b -c ( ) G -d ) e - -a ( b ) H ( c ) d - -a ( b ) c -I " this must be the last pair test - -J -a 'b' c - -K 'a' b -a 'b' L - -a ' b -M ' c -d ' e - -a ' b -c ' N -d ' e - -a ' b ' c -O " this must be the last quote test - diff --git a/vim/default/bundle/targets.vim/test/test3.ok b/vim/default/bundle/targets.vim/test/test3.ok deleted file mode 100644 index 506660eab6..0000000000 --- a/vim/default/bundle/targets.vim/test/test3.ok +++ /dev/null @@ -1,38 +0,0 @@ -A -a (A) c - -B (B) b -a (C) C - -D (D) c - -a (E) E - -a ( b -F (F) c -d ) e - -a ( b -c (G) G -d ) e - -a ( b ) H (H) d - -a (I) c -I " this must be the last pair test - -J -a 'J' c - -K 'K' b -a 'L' L - -a 'M' c -d ' e - -a ' b -c 'N' e - -a 'O' c -O " this must be the last quote test - diff --git a/vim/default/bundle/targets.vim/test/test3.out b/vim/default/bundle/targets.vim/test/test3.out deleted file mode 100644 index 506660eab6..0000000000 --- a/vim/default/bundle/targets.vim/test/test3.out +++ /dev/null @@ -1,38 +0,0 @@ -A -a (A) c - -B (B) b -a (C) C - -D (D) c - -a (E) E - -a ( b -F (F) c -d ) e - -a ( b -c (G) G -d ) e - -a ( b ) H (H) d - -a (I) c -I " this must be the last pair test - -J -a 'J' c - -K 'K' b -a 'L' L - -a 'M' c -d ' e - -a ' b -c 'N' e - -a 'O' c -O " this must be the last quote test - diff --git a/vim/default/bundle/targets.vim/test/test4.in b/vim/default/bundle/targets.vim/test/test4.in deleted file mode 100644 index 64faf96455..0000000000 --- a/vim/default/bundle/targets.vim/test/test4.in +++ /dev/null @@ -1,6 +0,0 @@ -a ( b ( x ) c ) d -a { b { x } c } d -a [ b [ x ] c ] d -a < b < x > c > d -a b x c d - diff --git a/vim/default/bundle/targets.vim/test/test4.ok b/vim/default/bundle/targets.vim/test/test4.ok deleted file mode 100644 index e53ae7c416..0000000000 --- a/vim/default/bundle/targets.vim/test/test4.ok +++ /dev/null @@ -1,28 +0,0 @@ -a ( b ( x ) c ) d -a (___________) d -a (___________) d -a (___________) d -a _____________ d -a _____________ d -a _____________ d -a { b { x } c } d -a {___________} d -a {___________} d -a {___________} d -a _____________ d -a _____________ d -a _____________ d -a [ b [ x ] c ] d -a [___________] d -a [___________] d -a _____________ d -a _____________ d -a < b < x > c > d -a <___________> d -a <___________> d -a _____________ d -a _____________ d -a b x c d -a ________________ d -a _______________________ d - diff --git a/vim/default/bundle/targets.vim/test/test4.out b/vim/default/bundle/targets.vim/test/test4.out deleted file mode 100644 index e53ae7c416..0000000000 --- a/vim/default/bundle/targets.vim/test/test4.out +++ /dev/null @@ -1,28 +0,0 @@ -a ( b ( x ) c ) d -a (___________) d -a (___________) d -a (___________) d -a _____________ d -a _____________ d -a _____________ d -a { b { x } c } d -a {___________} d -a {___________} d -a {___________} d -a _____________ d -a _____________ d -a _____________ d -a [ b [ x ] c ] d -a [___________] d -a [___________] d -a _____________ d -a _____________ d -a < b < x > c > d -a <___________> d -a <___________> d -a _____________ d -a _____________ d -a b x c d -a ________________ d -a _______________________ d - diff --git a/vim/default/bundle/targets.vim/test/test5.in b/vim/default/bundle/targets.vim/test/test5.in deleted file mode 100644 index ef41b474d1..0000000000 --- a/vim/default/bundle/targets.vim/test/test5.in +++ /dev/null @@ -1 +0,0 @@ -axb diff --git a/vim/default/bundle/targets.vim/test/test5.ok b/vim/default/bundle/targets.vim/test/test5.ok deleted file mode 100644 index d87cffe432..0000000000 --- a/vim/default/bundle/targets.vim/test/test5.ok +++ /dev/null @@ -1 +0,0 @@ -___ diff --git a/vim/default/bundle/targets.vim/test/test5.out b/vim/default/bundle/targets.vim/test/test5.out deleted file mode 100644 index d87cffe432..0000000000 --- a/vim/default/bundle/targets.vim/test/test5.out +++ /dev/null @@ -1 +0,0 @@ -___ diff --git a/vim/default/bundle/targets.vim/test/test6.in b/vim/default/bundle/targets.vim/test/test6.in deleted file mode 100644 index 21ea6f22b8..0000000000 --- a/vim/default/bundle/targets.vim/test/test6.in +++ /dev/null @@ -1,3 +0,0 @@ -a "" b -a () b -a ,, b diff --git a/vim/default/bundle/targets.vim/test/test6.ok b/vim/default/bundle/targets.vim/test/test6.ok deleted file mode 100644 index 3cbe121f86..0000000000 --- a/vim/default/bundle/targets.vim/test/test6.ok +++ /dev/null @@ -1,3 +0,0 @@ -a "foo" b -a (foo) b -a ,foo, b diff --git a/vim/default/bundle/targets.vim/test/test6.out b/vim/default/bundle/targets.vim/test/test6.out deleted file mode 100644 index 3cbe121f86..0000000000 --- a/vim/default/bundle/targets.vim/test/test6.out +++ /dev/null @@ -1,3 +0,0 @@ -a "foo" b -a (foo) b -a ,foo, b diff --git a/vim/default/bundle/vim-commentary b/vim/default/bundle/vim-commentary new file mode 160000 index 0000000000..89f43af186 --- /dev/null +++ b/vim/default/bundle/vim-commentary @@ -0,0 +1 @@ +Subproject commit 89f43af18692d22ed999c3097e449f12fdd8b299 diff --git a/vim/default/bundle/vim-commentary/.gitignore b/vim/default/bundle/vim-commentary/.gitignore deleted file mode 100644 index 0a56e3fc5d..0000000000 --- a/vim/default/bundle/vim-commentary/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/doc/tags diff --git a/vim/default/bundle/vim-commentary/CONTRIBUTING.markdown b/vim/default/bundle/vim-commentary/CONTRIBUTING.markdown deleted file mode 100644 index b3f00951c0..0000000000 --- a/vim/default/bundle/vim-commentary/CONTRIBUTING.markdown +++ /dev/null @@ -1 +0,0 @@ -See the [contribution guidelines for pathogen.vim](https://github.com/tpope/vim-pathogen/blob/master/CONTRIBUTING.markdown). diff --git a/vim/default/bundle/vim-commentary/README.markdown b/vim/default/bundle/vim-commentary/README.markdown deleted file mode 100644 index 5387ba6ebd..0000000000 --- a/vim/default/bundle/vim-commentary/README.markdown +++ /dev/null @@ -1,51 +0,0 @@ -# commentary.vim - -Comment stuff out. Use `gcc` to comment out a line (takes a count), -`gc` to comment out the target of a motion (for example, `gcap` to -comment out a paragraph), `gc` in visual mode to comment out the selection, -and `gc` in operator pending mode to target a comment. You can also use -it as a command, either with a range like `:7,17Commentary`, or as part of a -`:global` invocation like with `:g/TODO/Commentary`. That's it. - -I wrote this because 5 years after Vim added support for mapping an -operator, I still couldn't find a commenting plugin that leveraged that -feature (I overlooked -[tcomment.vim](https://github.com/tomtom/tcomment_vim)). Striving for -minimalism, it weighs in at under 100 lines of code. - -Oh, and it uncomments, too. The above maps actually toggle, and `gcgc` -uncomments a set of adjacent commented lines. - -## Installation - -If you don't have a preferred installation method, I recommend -installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and -then simply copy and paste: - - cd ~/.vim/bundle - git clone git://github.com/tpope/vim-commentary.git - -Once help tags have been generated, you can view the manual with -`:help commentary`. - -## FAQ - -> My favorite file type isn't supported! - -Relax! You just have to adjust `'commentstring'`: - - autocmd FileType apache setlocal commentstring=#\ %s - -## Self-Promotion - -Like commentary.vim? Follow the repository on -[GitHub](https://github.com/tpope/vim-commentary) and vote for it on -[vim.org](http://www.vim.org/scripts/script.php?script_id=3695). And if -you're feeling especially charitable, follow [tpope](http://tpo.pe/) on -[Twitter](http://twitter.com/tpope) and -[GitHub](https://github.com/tpope). - -## License - -Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. -See `:help license`. diff --git a/vim/default/bundle/vim-commentary/doc/commentary.txt b/vim/default/bundle/vim-commentary/doc/commentary.txt deleted file mode 100644 index b048569493..0000000000 --- a/vim/default/bundle/vim-commentary/doc/commentary.txt +++ /dev/null @@ -1,32 +0,0 @@ -*commentary.txt* Comment stuff out - -Author: Tim Pope -License: Same terms as Vim itself (see |license|) - -Comment stuff out. Then uncomment it later. Relies on 'commentstring' to be -correctly set, or uses b:commentary_format if it is set. - - *gc* -gc{motion} Comment or uncomment lines that {motion} moves over. - - *gcc* -gcc Comment or uncomment [count] lines. - - *v_gc* -{Visual}gc Comment or uncomment the highlighted lines. - - *o_gc* -gc Text object for a comment (operator pending mode - only.) - - *gcgc* *gcu* -gcgc Uncomment the current and adjacent commented lines. -gcu - - *:Commentary* -:[range]Commentary Comment or uncomment [range] lines - -The |User| CommentaryPost autocommand fires after a successful operation and -can be used for advanced customization. - - vim:tw=78:et:ft=help:norl: diff --git a/vim/default/bundle/vim-commentary/plugin/commentary.vim b/vim/default/bundle/vim-commentary/plugin/commentary.vim deleted file mode 100644 index 3aedd8d5b3..0000000000 --- a/vim/default/bundle/vim-commentary/plugin/commentary.vim +++ /dev/null @@ -1,103 +0,0 @@ -" commentary.vim - Comment stuff out -" Maintainer: Tim Pope -" Version: 1.3 -" GetLatestVimScripts: 3695 1 :AutoInstall: commentary.vim - -if exists("g:loaded_commentary") || &cp || v:version < 700 - finish -endif -let g:loaded_commentary = 1 - -function! s:surroundings() abort - return split(get(b:, 'commentary_format', substitute(substitute( - \ &commentstring, '\S\zs%s',' %s','') ,'%s\ze\S', '%s ', '')), '%s', 1) -endfunction - -function! s:strip_white_space(l,r,line) abort - let [l, r] = [a:l, a:r] - if stridx(a:line,l) == -1 && stridx(a:line,l[0:-2]) == 0 && a:line[strlen(a:line)-strlen(r[1:]):-1] == r[1:] - return [l[0:-2], r[1:]] - endif - return [l, r] -endfunction - -function! s:go(type,...) abort - if a:0 - let [lnum1, lnum2] = [a:type, a:1] - else - let [lnum1, lnum2] = [line("'["), line("']")] - endif - - let [l, r] = s:surroundings() - let uncomment = 2 - for lnum in range(lnum1,lnum2) - let line = matchstr(getline(lnum),'\S.*\s\@ 2 && l.r !~# '\\' - let line = substitute(line, - \'\M'.r[0:-2].'\zs\d\*\ze'.r[-1:-1].'\|'.l[0].'\zs\d\*\ze'.l[1:-1], - \'\=substitute(submatch(0)+1-uncomment,"^0$\\|^-\\d*$","","")','g') - endif - if uncomment - let line = substitute(line,'\S.*\s\@ Commentary :call go(line("'<"),line("'>")) -nnoremap Commentary :set opfunc=gog@ -nnoremap CommentaryLine :set opfunc=goexe 'norm! 'v:count1.'g@_' -onoremap Commentary :call textobject(0) -nnoremap ChangeCommentary c:call textobject(1) -nmap CommentaryUndo CommentaryCommentary -command! -range -bar Commentary call s:go(,) - -if !hasmapto('Commentary') || maparg('gc','n') ==# '' - xmap gc Commentary - nmap gc Commentary - omap gc Commentary - nmap gcc CommentaryLine - nmap cgc ChangeCommentary - nmap gcu CommentaryCommentary -endif - -" vim:set et sw=2: diff --git a/vim/default/bundle/vim-unimpaired b/vim/default/bundle/vim-unimpaired new file mode 160000 index 0000000000..3a7759075c --- /dev/null +++ b/vim/default/bundle/vim-unimpaired @@ -0,0 +1 @@ +Subproject commit 3a7759075cca5b0dc29ce81f2747489b6c8e36a7 diff --git a/vim/default/bundle/vim-unimpaired/.gitignore b/vim/default/bundle/vim-unimpaired/.gitignore deleted file mode 100644 index 0a56e3fc5d..0000000000 --- a/vim/default/bundle/vim-unimpaired/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/doc/tags diff --git a/vim/default/bundle/vim-unimpaired/README.markdown b/vim/default/bundle/vim-unimpaired/README.markdown deleted file mode 100644 index a03ae7427f..0000000000 --- a/vim/default/bundle/vim-unimpaired/README.markdown +++ /dev/null @@ -1,82 +0,0 @@ -# unimpaired.vim - -Much of unimpaired.vim was extracted from my vimrc when I noticed a -pattern: complementary pairs of mappings. They mostly fall into four -categories. - -There are mappings which are simply short normal mode aliases for -commonly used ex commands. `]q` is :cnext. `[q` is :cprevious. `]a` is -:next. `[b` is :bprevious. See the documentation for the full set of -20 mappings and mnemonics. All of them take a count. - -There are linewise mappings. `[` and `]` add newlines -before and after the cursor line. `[e` and `]e` exchange the current -line with the one above or below it. - -There are mappings for toggling options. `[os`, `]os`, and `cos` perform -`:set spell`, `:set nospell`, and `:set invspell`, respectively. There's also -`l` (`list`), `n` (`number`), `w` (`wrap`), `x` (`cursorline cursorcolumn`), -and several others, plus mappings to help alleviate the `set paste` dance. -Consult the documentation. - -There are mappings for encoding and decoding. `[x` and `]x` encode and -decode XML (and HTML). `[u` and `]u` encode and decode URLs. `[y` and -`]y` do C String style escaping. - -And in the miscellaneous category, there's `[f` and `]f` to go to the -next/previous file in the directory, and `[n` and `]n` to jump between -SCM conflict markers. - -The `.` command works with all operator mappings, and will work with the -linewise mappings as well if you install -[repeat.vim](https://github.com/tpope/vim-repeat). - -## Installation - -If you don't have a preferred installation method, I recommend -installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and -then simply copy and paste: - - cd ~/.vim/bundle - git clone git://github.com/tpope/vim-unimpaired.git - -Once help tags have been generated, you can view the manual with -`:help unimpaired`. - -## FAQ - -> My non-US keyboard makes it hard to type `[` and `]`. Can I configure -> different prefix characters? - -Not en masse, but you can just map to `[` and `]` directly: - - nmap < [ - nmap > ] - omap < [ - omap > ] - xmap < [ - xmap > ] - -Note we're not using the `noremap` family because we *do* want to recursively -invoke unimpaired.vim's maps. - -There are also `` maps if you want a more granular approach. - -## Contributing - -See the contribution guidelines for -[pathogen.vim](https://github.com/tpope/vim-pathogen#readme). - -## Self-Promotion - -Like unimpaired.vim? Follow the repository on -[GitHub](https://github.com/tpope/vim-unimpaired) and vote for it on -[vim.org](http://www.vim.org/scripts/script.php?script_id=1590). And if -you're feeling especially charitable, follow [tpope](http://tpo.pe/) on -[Twitter](http://twitter.com/tpope) and -[GitHub](https://github.com/tpope). - -## License - -Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. -See `:help license`. diff --git a/vim/default/bundle/vim-unimpaired/doc/unimpaired.txt b/vim/default/bundle/vim-unimpaired/doc/unimpaired.txt deleted file mode 100644 index 3d97242591..0000000000 --- a/vim/default/bundle/vim-unimpaired/doc/unimpaired.txt +++ /dev/null @@ -1,152 +0,0 @@ -*unimpaired.txt* Pairs of handy bracket mappings - -Author: Tim Pope -License: Same terms as Vim itself (see |license|) - -This plugin is only available if 'compatible' is not set. - -INTRODUCTION *unimpaired* - -This plugin provides several pairs of bracket maps. - -NEXT AND PREVIOUS *unimpaired-next* - -The following maps all correspond to normal mode commands. If a count is -given, it becomes an argument to the command. A mnemonic for the "a" commands -is "args" and for the "q" commands is "quickfix". - -*[a* |:previous| -*]a* |:next| -*[A* |:first| -*]A* |:last| -*[b* |:bprevious| -*]b* |:bnext| -*[B* |:bfirst| -*]B* |:blast| -*[l* |:lprevious| -*]l* |:lnext| -*[L* |:lfirst| -*]L* |:llast| -*[* |:lpfile| -*]* |:lnfile| -*[q* |:cprevious| -*]q* |:cnext| -*[Q* |:cfirst| -*]Q* |:clast| -*[* |:cpfile| (Note that only works in a terminal if you disable -*]* |:cnfile| flow control: stty -ixon) -*[t* |:tprevious| -*]t* |:tnext| -*[T* |:tfirst| -*]T* |:tlast| - - *[f* -[f Go to the file preceding the current one - alphabetically in the current file's directory. - - *]f* -]f Go to the file succeeding the current one - alphabetically in the current file's directory. - - *[n* -[n Go to the previous SCM conflict marker or diff/patch - hunk. Try d[n inside a conflict. - - *]n* -]n Go to the next SCM conflict marker or diff/patch hunk. - Try d]n inside a conflict. - -LINE OPERATIONS *unimpaired-lines* - - *[* -[ Add [count] blank lines above the cursor. - - *]* -] Add [count] blank lines below the cursor. - - *[e* *v_[e* -[e Exchange the current line with [count] lines above it. - - *]e* *v_]e* -]e Exchange the current line with [count] lines below it. - -OPTION TOGGLING *unimpaired-toggling* - -On Off Toggle Option -*[ob* *]ob* *cob* 'background' (dark is off, light is on) -*[oc* *]oc* *coc* 'cursorline' -*[od* *]od* *cod* 'diff' (actually |:diffthis| / |:diffoff|) -*[oh* *]oh* *coh* 'hlsearch' -*[oi* *]oi* *coi* 'ignorecase' -*[ol* *]ol* *col* 'list' -*[on* *]on* *con* 'number' -*[or* *]or* *cor* 'relativenumber' -*[os* *]os* *cos* 'spell' -*[ou* *]ou* *cou* 'cursorcolumn' -*[ov* *]ov* *cov* 'virtualedit' -*[ow* *]ow* *cow* 'wrap' -*[ox* *]ox* *cox* 'cursorline' 'cursorcolumn' (x as in crosshairs) - -PASTING *unimpaired-pasting* - -These are experimental: - -*>p* Paste after linewise, increasing indent. -*>P* Paste before linewise, increasing indent. -* => <foo bar="baz"> -{Visual}[x - - *]x* *]xx* *v_]x* -]x{motion} XML decode. HTML entities are handled as well. -]xx -{Visual}]x - - *[u* *[uu* *v_[u* -[u{motion} URL encode. -[uu foo bar => foo%20bar -{Visual}[u - - *]u* *]uu* *v_]u* -]u{motion} URL decode. -]uu -{Visual}]u - - *[y* *[yy* *v_[y* -[y{motion} C String encode. Backslash escape control -[yy characters, quotation marks, and backslashes. -{Visual}[y - - *]y* *]yy* *v_]y* -]y{motion} C String decode. -]yy -{Visual}]y - -TODO *unimpaired-todo* - -Avoid munging null characters when encoding and decoding. - - vim:tw=78:et:ft=help:norl: diff --git a/vim/default/bundle/vim-unimpaired/plugin/unimpaired.vim b/vim/default/bundle/vim-unimpaired/plugin/unimpaired.vim deleted file mode 100644 index 708712a2c4..0000000000 --- a/vim/default/bundle/vim-unimpaired/plugin/unimpaired.vim +++ /dev/null @@ -1,465 +0,0 @@ -" unimpaired.vim - Pairs of handy bracket mappings -" Maintainer: Tim Pope -" Version: 1.2 -" GetLatestVimScripts: 1590 1 :AutoInstall: unimpaired.vim - -if exists("g:loaded_unimpaired") || &cp || v:version < 700 - finish -endif -let g:loaded_unimpaired = 1 - -" Next and previous {{{1 - -function! s:MapNextFamily(map,cmd) - let map = 'unimpaired'.toupper(a:map) - let cmd = '".(v:count ? v:count : "")."'.a:cmd - let end = '"'.(a:cmd == 'l' || a:cmd == 'c' ? 'zv' : '') - execute 'nnoremap '.map.'Previous :exe "'.cmd.'previous'.end - execute 'nnoremap '.map.'Next :exe "'.cmd.'next'.end - execute 'nnoremap '.map.'First :exe "'.cmd.'first'.end - execute 'nnoremap '.map.'Last :exe "'.cmd.'last'.end - execute 'nmap ['. a:map .' '.map.'Previous' - execute 'nmap ]'. a:map .' '.map.'Next' - execute 'nmap ['.toupper(a:map).' '.map.'First' - execute 'nmap ]'.toupper(a:map).' '.map.'Last' - if exists(':'.a:cmd.'nfile') - execute 'nnoremap '.map.'PFile :exe "'.cmd.'pfile'.end - execute 'nnoremap '.map.'NFile :exe "'.cmd.'nfile'.end - execute 'nmap [ '.map.'PFile' - execute 'nmap ] '.map.'NFile' - endif -endfunction - -call s:MapNextFamily('a','') -call s:MapNextFamily('b','b') -call s:MapNextFamily('l','l') -call s:MapNextFamily('q','c') -call s:MapNextFamily('t','t') - -function! s:entries(path) - let path = substitute(a:path,'[\\/]$','','') - let files = split(glob(path."/.*"),"\n") - let files += split(glob(path."/*"),"\n") - call map(files,'substitute(v:val,"[\\/]$","","")') - call filter(files,'v:val !~# "[\\\\/]\\.\\.\\=$"') - - let filter_suffixes = substitute(escape(&suffixes, '~.*$^'), ',', '$\\|', 'g') .'$' - call filter(files, 'v:val !~# filter_suffixes') - - return files -endfunction - -function! s:FileByOffset(num) - let file = expand('%:p') - let num = a:num - while num - let files = s:entries(fnamemodify(file,':h')) - if a:num < 0 - call reverse(sort(filter(files,'v:val <# file'))) - else - call sort(filter(files,'v:val ># file')) - endif - let temp = get(files,0,'') - if temp == '' - let file = fnamemodify(file,':h') - else - let file = temp - while isdirectory(file) - let files = s:entries(file) - if files == [] - " TODO: walk back up the tree and continue - break - endif - let file = files[num > 0 ? 0 : -1] - endwhile - let num += num > 0 ? -1 : 1 - endif - endwhile - return file -endfunction - -function! s:fnameescape(file) abort - if exists('*fnameescape') - return fnameescape(a:file) - else - return escape(a:file," \t\n*?[{`$\\%#'\"|!<") - endif -endfunction - -nnoremap unimpairedDirectoryNext :edit =fnamemodify(fnameescape(FileByOffset(v:count1)), ':.') -nnoremap unimpairedDirectoryPrevious :edit =fnamemodify(fnameescape(FileByOffset(-v:count1)), ':.') -nmap ]f unimpairedDirectoryNext -nmap [f unimpairedDirectoryPrevious - -nmap unimpairedONext unimpairedDirectoryNext:echohl WarningMSGecho "]o is deprecated. Use ]f"echohl NONE -nmap unimpairedOPrevious unimpairedDirectoryPrevious:echohl WarningMSGecho "[o is deprecated. Use [f"echohl NONE -nmap ]o unimpairedONext -nmap [o unimpairedOPrevious - -" }}}1 -" Diff {{{1 - -nmap [n unimpairedContextPrevious -nmap ]n unimpairedContextNext -omap [n unimpairedContextPrevious -omap ]n unimpairedContextNext - -nnoremap unimpairedContextPrevious :call Context(1) -nnoremap unimpairedContextNext :call Context(0) -onoremap unimpairedContextPrevious :call ContextMotion(1) -onoremap unimpairedContextNext :call ContextMotion(0) - -function! s:Context(reverse) - call search('^\(@@ .* @@\|[<=>|]\{7}[<=>|]\@!\)', a:reverse ? 'bW' : 'W') -endfunction - -function! s:ContextMotion(reverse) - if a:reverse - - - endif - call search('^@@ .* @@\|^diff \|^[<=>|]\{7}[<=>|]\@!', 'bWc') - if getline('.') =~# '^diff ' - let end = search('^diff ', 'Wn') - 1 - if end < 0 - let end = line('$') - endif - elseif getline('.') =~# '^@@ ' - let end = search('^@@ .* @@\|^diff ', 'Wn') - 1 - if end < 0 - let end = line('$') - endif - elseif getline('.') =~# '^=\{7\}' - + - let end = search('^>\{7}>\@!', 'Wnc') - elseif getline('.') =~# '^[<=>|]\{7\}' - let end = search('^[<=>|]\{7}[<=>|]\@!', 'Wn') - 1 - else - return - endif - if end > line('.') - execute 'normal! V'.(end - line('.')).'j' - elseif end == line('.') - normal! V - endif -endfunction - -" }}}1 -" Line operations {{{1 - -function! s:BlankUp(count) abort - put!=repeat(nr2char(10), a:count) - ']+1 - silent! call repeat#set("\unimpairedBlankUp", a:count) -endfunction - -function! s:BlankDown(count) abort - put =repeat(nr2char(10), a:count) - '[-1 - silent! call repeat#set("\unimpairedBlankDown", a:count) -endfunction - -nnoremap unimpairedBlankUp :call BlankUp(v:count1) -nnoremap unimpairedBlankDown :call BlankDown(v:count1) - -nmap [ unimpairedBlankUp -nmap ] unimpairedBlankDown - -function! s:Move(cmd, count, map) abort - normal! m` - silent! exe 'move'.a:cmd.a:count - norm! `` - silent! call repeat#set("\unimpairedMove".a:map, a:count) -endfunction - -function! s:MoveSelectionUp(count) abort - normal! m` - silent! exe "'<,'>move'<--".a:count - norm! `` - silent! call repeat#set("\unimpairedMoveSelectionUp", a:count) -endfunction - -function! s:MoveSelectionDown(count) abort - normal! m` - exe "'<,'>move'>+".a:count - norm! `` - silent! call repeat#set("\unimpairedMoveSelectionDown", a:count) -endfunction - -nnoremap unimpairedMoveUp :call Move('--',v:count1,'Up') -nnoremap unimpairedMoveDown :call Move('+',v:count1,'Down') -noremap unimpairedMoveSelectionUp :call MoveSelectionUp(v:count1) -noremap unimpairedMoveSelectionDown :call MoveSelectionDown(v:count1) - -nmap [e unimpairedMoveUp -nmap ]e unimpairedMoveDown -xmap [e unimpairedMoveSelectionUp -xmap ]e unimpairedMoveSelectionDown - -" }}}1 -" Option toggling {{{1 - -function! s:statusbump() abort - let &l:readonly = &l:readonly - return '' -endfunction - -function! s:toggle(op) abort - call s:statusbump() - return eval('&'.a:op) ? 'no'.a:op : a:op -endfunction - -function! s:option_map(letter, option, mode) abort - exe 'nnoremap [o'.a:letter ':'.a:mode.' '.a:option.'=statusbump()' - exe 'nnoremap ]o'.a:letter ':'.a:mode.' no'.a:option.'=statusbump()' - exe 'nnoremap co'.a:letter ':'.a:mode.' =toggle("'.a:option.'")' -endfunction - -nnoremap [ob :set background=light -nnoremap ]ob :set background=dark -nnoremap cob :set background==&background == 'dark' ? 'light' : 'dark' -call s:option_map('c', 'cursorline', 'setlocal') -call s:option_map('u', 'cursorcolumn', 'setlocal') -nnoremap [od :diffthis -nnoremap ]od :diffoff -nnoremap cod :=&diff ? 'diffoff' : 'diffthis' -call s:option_map('h', 'hlsearch', 'set') -call s:option_map('i', 'ignorecase', 'set') -call s:option_map('l', 'list', 'setlocal') -call s:option_map('n', 'number', 'setlocal') -call s:option_map('r', 'relativenumber', 'setlocal') -call s:option_map('s', 'spell', 'setlocal') -call s:option_map('w', 'wrap', 'setlocal') -nnoremap [ox :set cursorline cursorcolumn -nnoremap ]ox :set nocursorline nocursorcolumn -nnoremap cox :set =&cursorline && &cursorcolumn ? 'nocursorline nocursorcolumn' : 'cursorline cursorcolumn' -nnoremap [ov :set virtualedit+=all -nnoremap ]ov :set virtualedit-=all -nnoremap cov :set =(&virtualedit =~# "all") ? 'virtualedit-=all' : 'virtualedit+=all' - -function! s:setup_paste() abort - let s:paste = &paste - let s:mouse = &mouse - set paste - set mouse= - augroup unimpaired_paste - autocmd! - autocmd InsertLeave * - \ if exists('s:paste') | - \ let &paste = s:paste | - \ let &mouse = s:mouse | - \ unlet s:paste | - \ unlet s:mouse | - \ endif | - \ autocmd! unimpaired_paste - augroup END -endfunction - -nnoremap unimpairedPaste :call setup_paste() - -nnoremap yo :call setup_paste()o -nnoremap yO :call setup_paste()O - -" }}}1 -" Put {{{1 - -function! s:putline(how, map) abort - let [body, type] = [getreg(v:register), getregtype(v:register)] - call setreg(v:register, body, 'l') - exe 'normal! "'.v:register.a:how - call setreg(v:register, body, type) - if type !=# 'V' - silent! call repeat#set("\unimpairedPut".a:map) - endif -endfunction - -nnoremap unimpairedPutAbove :call putline('[p', 'Above') -nnoremap unimpairedPutBelow :call putline(']p', 'Below') - -nmap [p unimpairedPutAbove -nmap ]p unimpairedPutBelow -nnoremap >P :call putline('[p', 'Above')>'] -nnoremap >p :call putline(']p', 'Below')>'] -nnoremap

putline('[p', 'Above')<'] -nnoremap

putline(']p', 'Below')<'] -nnoremap =P :call putline('[p', 'Above')='] -nnoremap =p :call putline(']p', 'Below')='] - -" }}}1 -" Encoding and decoding {{{1 - -function! s:string_encode(str) - let map = {"\n": 'n', "\r": 'r', "\t": 't', "\b": 'b', "\f": '\f', '"': '"', '\': '\'} - return substitute(a:str,"[\001-\033\\\\\"]",'\="\\".get(map,submatch(0),printf("%03o",char2nr(submatch(0))))','g') -endfunction - -function! s:string_decode(str) - let map = {'n': "\n", 'r': "\r", 't': "\t", 'b': "\b", 'f': "\f", 'e': "\e", 'a': "\001", 'v': "\013", "\n": ''} - let str = a:str - if str =~ '^\s*".\{-\}\\\@','\>','g') - let str = substitute(str,'"','\"','g') - return str -endfunction - -function! s:xml_entity_decode(str) - let str = substitute(a:str,'\c&#\%(0*38\|x0*26\);','&','g') - let str = substitute(str,'\c&#\(\d\+\);','\=nr2char(submatch(1))','g') - let str = substitute(str,'\c&#\(x\x\+\);','\=nr2char("0".submatch(1))','g') - let str = substitute(str,'\c'',"'",'g') - let str = substitute(str,'\c"','"','g') - let str = substitute(str,'\c>','>','g') - let str = substitute(str,'\c<','<','g') - let str = substitute(str,'\C&\(\%(amp;\)\@!\w*\);','\=nr2char(get(g:unimpaired_html_entities,submatch(1),63))','g') - return substitute(str,'\c&','\&','g') -endfunction - -function! s:xml_decode(str) - let str = substitute(a:str,'<\%([[:alnum:]-]\+=\%("[^"]*"\|''[^'']*''\)\|.\)\{-\}>','','g') - return s:xml_entity_decode(str) -endfunction - -function! s:Transform(algorithm,type) - let sel_save = &selection - let cb_save = &clipboard - set selection=inclusive clipboard-=unnamed clipboard-=unnamedplus - let reg_save = @@ - if a:type =~ '^\d\+$' - silent exe 'norm! ^v'.a:type.'$hy' - elseif a:type =~ '^.$' - silent exe "normal! `<" . a:type . "`>y" - elseif a:type == 'line' - silent exe "normal! '[V']y" - elseif a:type == 'block' - silent exe "normal! `[\`]y" - else - silent exe "normal! `[v`]y" - endif - if a:algorithm =~# '^\u\|#' - let @@ = {a:algorithm}(@@) - else - let @@ = s:{a:algorithm}(@@) - endif - norm! gvp - let @@ = reg_save - let &selection = sel_save - let &clipboard = cb_save - if a:type =~ '^\d\+$' - silent! call repeat#set("\unimpaired_line_".a:algorithm,a:type) - endif -endfunction - -function! s:TransformOpfunc(type) - return s:Transform(s:encode_algorithm, a:type) -endfunction - -function! s:TransformSetup(algorithm) - let s:encode_algorithm = a:algorithm - let &opfunc = matchstr(expand(''), '\d\+_').'TransformOpfunc' -endfunction - -function! UnimpairedMapTransform(algorithm, key) - exe 'nnoremap unimpaired_' .a:algorithm.' :call TransformSetup("'.a:algorithm.'")g@' - exe 'xnoremap unimpaired_' .a:algorithm.' :call Transform("'.a:algorithm.'",visualmode())' - exe 'nnoremap unimpaired_line_'.a:algorithm.' :call Transform("'.a:algorithm.'",v:count1)' - exe 'nmap '.a:key.' unimpaired_'.a:algorithm - exe 'xmap '.a:key.' unimpaired_'.a:algorithm - exe 'nmap '.a:key.a:key[strlen(a:key)-1].' unimpaired_line_'.a:algorithm -endfunction - -call UnimpairedMapTransform('string_encode','[y') -call UnimpairedMapTransform('string_decode',']y') -call UnimpairedMapTransform('url_encode','[u') -call UnimpairedMapTransform('url_decode',']u') -call UnimpairedMapTransform('xml_encode','[x') -call UnimpairedMapTransform('xml_decode',']x') - -" }}}1 - -" vim:set sw=2 sts=2: From 7b5de7370dd35328a2e0bc6a54d62ddaf29b40e1 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 17 Nov 2017 16:52:53 -0800 Subject: [PATCH 15/63] Optimistic typing updates (#946) One consequence of the architecture we have - Electron talking to Neovim via `msgpack-rpc` - is that input has a non-trivial round-trip latency, regardless of the configuration. For an editor, ideally you'd want an avg responsiveness of <10ms from keypress to rendering for a desirable experience (ex, [Typing With Pleasure](https://pavelfatin.com/typing-with-pleasure)). Avg of 15ms is pretty good. At least based on the chrome profiler, we aren't there yet - and we spend a significant amount of time idling until we get a response from Neovim, in which case a bunch of stuff happens - lots of redux actions in response to mouse-move, canvas re-rendering, etc. This change implements 'optimistic updates' - similiar to the IntelliJ IDEA zero-latency (it also has parallels to [Client-side network prediction](https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking) models used in multiplayer games, just a really simple version!). For insert mode, we can predict fairly reliable on the cursor position + character, so we should render that _immediately_. Not only does this mean that we achieve better typing latency, but it also amortizes the workload in a more efficient way (since the cursor already moved, and lots of components get re-rendered in response to that, the canvas rendering can occur more quickly too). --- browser/src/Editor/KeyboardInput.tsx | 8 ++ browser/src/Editor/NeovimEditor.tsx | 20 ++- browser/src/Editor/NeovimInput.tsx | 6 +- browser/src/Editor/NeovimSurface.tsx | 8 +- .../Configuration/DefaultConfiguration.ts | 4 + .../Configuration/IConfigurationValues.ts | 5 +- .../src/Services/TypingPredictionManager.ts | 95 ++++++++++++++ browser/src/UI/components/Cursor.tsx | 66 ++++++++-- .../src/UI/components/TypingPredictions.tsx | 120 ++++++++++++++++++ browser/src/Utility.ts | 6 + browser/src/neovim/NeovimInstance.ts | 2 +- 11 files changed, 321 insertions(+), 19 deletions(-) create mode 100644 browser/src/Services/TypingPredictionManager.ts create mode 100644 browser/src/UI/components/TypingPredictions.tsx diff --git a/browser/src/Editor/KeyboardInput.tsx b/browser/src/Editor/KeyboardInput.tsx index a953c492c4..111a5f314f 100644 --- a/browser/src/Editor/KeyboardInput.tsx +++ b/browser/src/Editor/KeyboardInput.tsx @@ -12,6 +12,7 @@ import { connect } from "react-redux" import { keyEventToVimKey } from "./../Input/Keyboard" import { focusManager } from "./../Services/FocusManager" +import { TypingPredictionManager } from "./../Services/TypingPredictionManager" import { IState } from "./../UI/State" import { measureFont } from "./../Font" @@ -22,6 +23,7 @@ interface IKeyboardInputViewProps { left: number height: number onKeyDown?: (key: string) => void + typingPrediction: TypingPredictionManager foregroundColor: string fontFamily: string fontSize: string @@ -44,6 +46,7 @@ interface IKeyboardInputViewState { export interface IKeyboardInputProps { onKeyDown?: (key: string) => void + typingPrediction: TypingPredictionManager } /** @@ -157,11 +160,16 @@ class KeyboardInputView extends React.PureComponent) { UI.Actions.setImeActive(true) + + this.props.typingPrediction.clearAllPredictions() + this.setState({ isComposing: true, }) diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index cd6d2ef1c2..c8509a6031 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -27,6 +27,7 @@ import { registerBuiltInCommands } from "./../Services/Commands" import { configuration, IConfigurationValues } from "./../Services/Configuration" import { Errors } from "./../Services/Errors" import { addInsertModeLanguageFunctionality, addNormalModeLanguageFunctionality } from "./../Services/Language" +import { TypingPredictionManager } from "./../Services/TypingPredictionManager" import { WindowTitle } from "./../Services/WindowTitle" import { workspace } from "./../Services/Workspace" @@ -41,7 +42,7 @@ import { NeovimSurface } from "./NeovimSurface" import { tasks } from "./../Services/Tasks" -import { normalizePath } from "./../Utility" +import { normalizePath, sleep } from "./../Utility" import * as VimConfigurationSynchronizer from "./../Services/VimConfigurationSynchronizer" @@ -73,6 +74,8 @@ export class NeovimEditor implements IEditor { private _lastBufferId: string = null + private _typingPredictionManager: TypingPredictionManager = new TypingPredictionManager() + public get mode(): string { return this._currentMode } @@ -182,6 +185,7 @@ export class NeovimEditor implements IEditor { this._neovimInstance.onRedrawComplete.subscribe(() => { UI.Actions.setColors(this._screen.foregroundColor, this._screen.backgroundColor) UI.Actions.setCursorPosition(this._screen) + this._typingPredictionManager.setCursorPosition(this._screen.cursorRow, this._screen.cursorColumn) }) this._neovimInstance.on("tabline-update", (currentTabId: number, tabs: any[]) => { @@ -317,6 +321,7 @@ export class NeovimEditor implements IEditor { } return { + if (configuration.getValue("debug.fakeLag.neovimInput")) { + await sleep(configuration.getValue("debug.fakeLag.neovimInput")) + } + await this._neovimInstance.input(key) } } diff --git a/browser/src/Editor/NeovimInput.tsx b/browser/src/Editor/NeovimInput.tsx index fa76e176da..417cd3935d 100644 --- a/browser/src/Editor/NeovimInput.tsx +++ b/browser/src/Editor/NeovimInput.tsx @@ -11,12 +11,16 @@ import { NeovimInstance } from "./../neovim" import { NeovimScreen } from "./../Screen" // import * as UI from "./../UI/index" +import { TypingPredictionManager } from "./../Services/TypingPredictionManager" + import { KeyboardInput } from "./KeyboardInput" export interface INeovimInputProps { neovimInstance: NeovimInstance screen: NeovimScreen onKeyDown?: (key: string) => void + + typingPrediction: TypingPredictionManager } export class NeovimInput extends React.PureComponent { @@ -36,7 +40,7 @@ export class NeovimInput extends React.PureComponent { public render(): JSX.Element { return

this._mouseElement = elem} className="stack enable-mouse"> - +
} } diff --git a/browser/src/Editor/NeovimSurface.tsx b/browser/src/Editor/NeovimSurface.tsx index a44a221618..e948b5e95e 100644 --- a/browser/src/Editor/NeovimSurface.tsx +++ b/browser/src/Editor/NeovimSurface.tsx @@ -16,11 +16,14 @@ import { CursorLine } from "./../UI/components/CursorLine" import { InstallHelp } from "./../UI/components/InstallHelp" import { TabsContainer } from "./../UI/components/Tabs" import { ToolTips } from "./../UI/components/ToolTip" +import { TypingPrediction } from "./../UI/components/TypingPredictions" import { BufferScrollBarContainer } from "./../UI/containers/BufferScrollBarContainer" import { DefinitionContainer } from "./../UI/containers/DefinitionContainer" import { ErrorsContainer } from "./../UI/containers/ErrorsContainer" +import { TypingPredictionManager } from "./../Services/TypingPredictionManager" + import { NeovimInput } from "./NeovimInput" import { NeovimRenderer } from "./NeovimRenderer" @@ -28,6 +31,7 @@ export interface INeovimSurfaceProps { neovimInstance: NeovimInstance renderer: INeovimRenderer screen: NeovimScreen + typingPrediction: TypingPredictionManager onKeyDown?: (key: string) => void onBufferClose?: (bufferId: number) => void @@ -53,7 +57,8 @@ export class NeovimSurface extends React.PureComponent screen={this.props.screen} />
- + + @@ -63,6 +68,7 @@ export class NeovimSurface extends React.PureComponent
diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index 53d11c2d36..ca5eee4f37 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -27,8 +27,10 @@ const BaseConfiguration: IConfigurationValues = { "debug.neovimPath": null, "debug.persistOnNeovimExit": false, "debug.detailedSessionLogging": false, + "debug.showTypingPrediction": false, "debug.fakeLag.languageServer": null, + "debug.fakeLag.neovimInput": null, "experimental.autoClosingPairs.enabled": false, "experimental.autoClosingPairs.default": [ @@ -37,6 +39,8 @@ const BaseConfiguration: IConfigurationValues = { { "open": "(", "close": ")" }, ], + "experimental.editor.typingPrediction": false, + "experimental.neovim.transport": "stdio", // TODO: Enable pipe transport for Windows // "experimental.neovim.transport": Platform.isWindows() ? "pipe" : "stdio", diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index b17699a257..ec47ba635c 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -22,9 +22,11 @@ export interface IConfigurationValues { "debug.persistOnNeovimExit": boolean "debug.detailedSessionLogging": boolean + "debug.showTypingPrediction": boolean // Simulate slow language server, for debugging - "debug.fakeLag.languageServer": number + "debug.fakeLag.languageServer": number | null + "debug.fakeLag.neovimInput": number | null // Experimental feature flags "experimental.autoClosingPairs.enabled": boolean @@ -33,6 +35,7 @@ export interface IConfigurationValues { // The transport to use for Neovim // Valid values are "stdio" and "pipe" "experimental.neovim.transport": string + "experimental.editor.typingPrediction": boolean // Production settings diff --git a/browser/src/Services/TypingPredictionManager.ts b/browser/src/Services/TypingPredictionManager.ts new file mode 100644 index 0000000000..809c77d10d --- /dev/null +++ b/browser/src/Services/TypingPredictionManager.ts @@ -0,0 +1,95 @@ +/** + * TypingPredictionManager + * + * Handles typing-prediction state management + */ + +import { Event, IEvent } from "./../Event" + +export type TypingPredictionId = number + +export interface IPredictedCharacter { + character: string + id: number +} + +export class TypingPredictionManager { + + private _predictionsChanged: Event = new Event() + private _predictions: IPredictedCharacter[] = [] + private _completedPredictions: TypingPredictionId[] = [] + private _enabled: boolean = false + + private _line: number = null + private _column: number = null + + public get onPredictionsChanged(): IEvent { + return this._predictionsChanged + } + + public enable(): void { + this._enabled = true + } + + public disable(): void { + this._enabled = false + } + + public setCursorPosition(line: number, column: number): void { + let shouldClearAll = false + + // If we changed lines, our predictions are no longer valid + if (this._line !== line) { + shouldClearAll = true + } + + // In the case where auto-indent pushes us back, + // we don't have a good sense of current predictions, + // so just clear them all out + if (column < this._column) { + shouldClearAll = true + } + + this._line = line + this._column = column + + if (shouldClearAll) { + this.clearAllPredictions() + } else { + this._predictions = this._predictions.filter((pd) => { + return pd.id > this._column + }) + + this._notifyPredictionsChanged() + } + } + + public addPrediction(character: string): TypingPredictionId | null { + + if (!this._enabled) { + return null + } + + const id = this._column + this._predictions.length + 1 + + this._predictions = [ + ...this._predictions, + { id, character }, + ] + + this._notifyPredictionsChanged() + + return id + } + + public clearAllPredictions(): void { + this._predictions = [] + this._completedPredictions = [] + + this._notifyPredictionsChanged() + } + + private _notifyPredictionsChanged(): void { + this._predictionsChanged.dispatch(this._predictions) + } +} diff --git a/browser/src/UI/components/Cursor.tsx b/browser/src/UI/components/Cursor.tsx index 67e42f25b8..1a61f7616a 100644 --- a/browser/src/UI/components/Cursor.tsx +++ b/browser/src/UI/components/Cursor.tsx @@ -5,7 +5,9 @@ import * as State from "./../State" import { Motion, spring } from "react-motion" -export interface ICursorProps { +import { TypingPredictionManager } from "./../../Services/TypingPredictionManager" + +export interface ICursorRendererProps { animated: boolean x: number y: number @@ -18,12 +20,35 @@ export interface ICursorProps { character: string fontFamily: string fontSize: string + fontPixelWidth: number visible: boolean + + typingPrediction: TypingPredictionManager } require("./Cursor.less") // tslint:disable-line no-var-requires -class CursorRenderer extends React.PureComponent { +export interface ICursorRendererState { + predictedCharacters: number +} + +class CursorRenderer extends React.PureComponent { + + constructor(props: ICursorRendererProps) { + super(props) + + this.state = { + predictedCharacters: 0, + } + } + + public componentDidMount(): void { + this.props.typingPrediction.onPredictionsChanged.subscribe((predictions) => { + this.setState({ + predictedCharacters: predictions.length, + }) + }) + } public render(): JSX.Element { @@ -38,7 +63,7 @@ class CursorRenderer extends React.PureComponent { const containerStyle: React.CSSProperties = { visibility: this.props.visible ? "visible" : "hidden", position: "absolute", - left: this.props.x.toString() + "px", + left: (this.props.x + this.state.predictedCharacters * this.props.fontPixelWidth).toString() + "px", top: this.props.y.toString() + "px", width: width.toString() + "px", height, @@ -67,26 +92,38 @@ class CursorRenderer extends React.PureComponent { color: this.props.textColor, } - return - {(val) => { - const cursorStyle = this.props.animated ? { - ...cursorBlockStyle, - transform: "scale(" + val.scale + ")", - } : cursorBlockStyle + if (!this.props.animated) { + return this._renderCursor(containerStyle, cursorBlockStyle, cursorCharacterStyle, characterToShow) + } else { + return + {(val) => { + const cursorStyle = { + ...cursorBlockStyle, + transform: "scale(" + val.scale + ")", + } + return this._renderCursor(containerStyle, cursorStyle, cursorCharacterStyle, characterToShow) + }} + + } + } + private _renderCursor(containerStyle: React.CSSProperties, cursorBlockStyle: React.CSSProperties, cursorCharacterStyle: React.CSSProperties, characterToShow: string): JSX.Element { return
-
+
{characterToShow}
- }} - } } -const mapStateToProps = (state: State.IState): ICursorProps => { +export interface ICursorProps { + typingPrediction: TypingPredictionManager +} + +const mapStateToProps = (state: State.IState, props: ICursorProps): ICursorRendererProps => { return { + ...props, animated: State.readConf(state.configuration, "ui.animations.enabled"), - x: state.cursorPixelX, + x: state.cursorPixelX, // + state.typingPredictions.length * state.cursorPixelWidth, y: state.cursorPixelY, scale: state.mode === "operator" ? 0.8 : state.cursorScale, width: state.cursorPixelWidth, @@ -95,6 +132,7 @@ const mapStateToProps = (state: State.IState): ICursorProps => { color: state.foregroundColor, textColor: state.backgroundColor, character: state.cursorCharacter, + fontPixelWidth: state.fontPixelWidth, fontFamily: State.readConf(state.configuration, "editor.fontFamily"), fontSize: State.readConf(state.configuration, "editor.fontSize"), visible: !state.imeActive, diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx new file mode 100644 index 0000000000..56712fc76c --- /dev/null +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -0,0 +1,120 @@ +/** + * TypingPredictions + * + * Component to render characters entered by the user, prior to round-tripping through Neovim + * The purpose of this is to provide a very low-latency typing experience + */ + +import { IDisposable } from "./../../IDisposable" + +import * as React from "react" +import { connect } from "react-redux" + +import * as State from "./../State" + +import { IPredictedCharacter, TypingPredictionManager } from "./../../Services/TypingPredictionManager" + +export interface ITypingPredictionProps { + typingPrediction: TypingPredictionManager +} + +export interface ITypingPredictionViewProps { + startX: number + y: number + width: number + height: number + color: string + textColor: string + fontFamily: string + fontSize: string + visible: boolean + typingPrediction: TypingPredictionManager + highlightPredictions: boolean +} + +export interface ITypingPredictionViewState { + predictions: IPredictedCharacter[] +} + +class TypingPredictionView extends React.PureComponent { + + private _containerElement: HTMLElement + private _lastWidth: number + private _subscription: IDisposable + + private _predictedElements: { [id: number]: HTMLElement } = {} + + public componentDidMount(): void { + this._subscription = this.props.typingPrediction.onPredictionsChanged.subscribe((updatedPredictions: IPredictedCharacter[]) => { + + if (!this._containerElement) { + return + } + + this._containerElement.innerHTML = "" + + // Add new predictions + updatedPredictions.forEach((up, idx) => { + const elem = document.createElement("div") + elem.className = "predicted-text" + elem.style.position = "absolute" + elem.style.top = this.props.y.toString() + "px" + elem.style.left = (this.props.startX + idx * this.props.width).toString() + "px" + elem.style.width = (this.props.width.toString()) + "px" + elem.style.height = (this.props.height.toString()) + "px" + elem.style.lineHeight = this.props.height.toString() + "px" + + if (this.props.highlightPredictions) { + elem.style.color = "white" + elem.style.backgroundColor = "rgba(255, 0, 0, 0.5)" + } + + elem.textContent = up.character + + this._containerElement.appendChild(elem) + + this._predictedElements[up.id] = this._containerElement + + }) + + // Force re-layout + this._lastWidth = this._containerElement.offsetWidth + }) + } + + public componentWillUnmount(): void { + if (this._subscription) { + this._subscription.dispose() + this._subscription = null + } + } + + public render(): JSX.Element { + const containerStyle: React.CSSProperties = { + willChange: "transform", + color: this.props.color, + fontFamily: this.props.fontFamily, + fontSize: this.props.fontSize, + } + + return
this._containerElement = elem}>
+ } +} + +const mapStateToProps = (state: State.IState, props: ITypingPredictionProps): ITypingPredictionViewProps => { + return { + ...props, + highlightPredictions: state.configuration["debug.showTypingPrediction"], + startX: state.cursorPixelX, + y: state.cursorPixelY, + width: state.cursorPixelWidth, + height: state.fontPixelHeight, + color: state.foregroundColor, + textColor: state.backgroundColor, + fontFamily: State.readConf(state.configuration, "editor.fontFamily"), + fontSize: State.readConf(state.configuration, "editor.fontSize"), + visible: true, + } +} + +export const TypingPrediction = connect(mapStateToProps)(TypingPredictionView) diff --git a/browser/src/Utility.ts b/browser/src/Utility.ts index dbe6968df9..14f6f2a1f2 100644 --- a/browser/src/Utility.ts +++ b/browser/src/Utility.ts @@ -116,6 +116,12 @@ export const isInRange = (line: number, column: number, range: types.Range): boo && line <= range.end.line && column <= range.end.character) } +export const sleep = async (timeInMilliseconds: number): Promise => { + return new Promise((res) => { + window.setTimeout(() => res(), timeInMilliseconds) + }) +} + /** * Helper function to ignore incoming values while a promise is waiting to complete * This is lossy, in that any input that comes in will be dropped while the promise diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index b4c53340c1..2ceb11156d 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -93,7 +93,7 @@ export interface INeovimInstance { /** * Supply input (keyboard/mouse) to Neovim */ - input(inputString: string): void + input(inputString: string): Promise /** * Call a VimL function From 105c707d156438deb85e95724a0df3365845f72b Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 17 Nov 2017 18:35:42 -0800 Subject: [PATCH 16/63] Build: Bring back node_modules caching in TravisCI (#971) * Bring back node-modules caching, in hopes that we won't need to download the binaries as frequently * Bump version of oni-neovim-binaries to use cached binary * Add verbose logging, to see if binaries actually downloaded, or if they were brought in via caching * Remove verbose flag --- .travis.yml | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 868df71b7d..978c9e82cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,8 @@ branches: cache: yarn: true + directories: + - node_modules matrix: include: diff --git a/package.json b/package.json index f411ecf76c..0a97f7c396 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "minimist": "1.2.0", "msgpack-lite": "0.1.26", "ocaml-language-server": "1.0.12", - "oni-neovim-binaries": "^0.0.7", + "oni-neovim-binaries": "0.0.8", "oni-ripgrep": "0.0.3", "typescript": "2.5.3", "vscode-jsonrpc": "3.5.0", From 31248fcc3cefabe8ecc692b84d3e1f7f9b289d16 Mon Sep 17 00:00:00 2001 From: Justin Moen Date: Mon, 20 Nov 2017 09:44:04 -0600 Subject: [PATCH 17/63] Fix broken README.md link (#984) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2ff6a6692..83fc30345f 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ There many ways to contribute to Oni: - [Submit bugs](https://github.com/onivim/oni/issues) or propose new features. - Review and and upate our [documentation](https://github.com/onivim/oni/wiki) - Try out the latest [released build](https://github.com/onivim/oni/releases) -- Contribute a bug fix or code change - start by checking our [Debugging Page](https://github.com/onivim/oni/wiki/Debugging) +- Contribute a bug fix or code change - start by checking our [Development Page](https://github.com/onivim/oni/wiki/Development) ## Acknowledgements From af12e7e847b02f6b0f702cfb055f016b2ef9ec9f Mon Sep 17 00:00:00 2001 From: Sergey Golovin Date: Mon, 20 Nov 2017 19:15:47 +0300 Subject: [PATCH 18/63] Fix a typo in README (#985) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 83fc30345f..5afd7e390e 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Oni is cross-platform and supports Windows, OS X, and Linux. - Download the [Oni installer](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-ia32-win.exe) for Windows - Once it is downloaded, run the installer. This will only take a minute. -- By default, Oni is installed under `C:\Program Files (x86)\Oni` for a 64-bit machine. +- By default, Oni is installed under `C:\Program Files (x86)\Oni` for a 64-bit machine. You can also find install via a [zip archive](https://github.com/onivim/oni/releases/download/v0.2.17/Oni-0.2.17-ia32-win.zip) @@ -129,7 +129,7 @@ There many ways to contribute to Oni: - Support Oni financially by making a donation via [Bountysource](https://salt.bountysource.com/teams/oni) - [Submit bugs](https://github.com/onivim/oni/issues) or propose new features. -- Review and and upate our [documentation](https://github.com/onivim/oni/wiki) +- Review and upate our [documentation](https://github.com/onivim/oni/wiki) - Try out the latest [released build](https://github.com/onivim/oni/releases) - Contribute a bug fix or code change - start by checking our [Development Page](https://github.com/onivim/oni/wiki/Development) From 18a7bff99f9cc9e0164e40b6274d3ff134d10b26 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 20 Nov 2017 10:49:32 -0800 Subject: [PATCH 19/63] Fix #989 - Upgrade to use Neovim 0.2.2 (#991) * Grab latest oni-neovim-binaries package * Update yarn.lock --- package.json | 4 ++-- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 0a97f7c396..15b11906e7 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "minimist": "1.2.0", "msgpack-lite": "0.1.26", "ocaml-language-server": "1.0.12", - "oni-neovim-binaries": "0.0.8", + "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "typescript": "2.5.3", "vscode-jsonrpc": "3.5.0", @@ -168,7 +168,7 @@ "minimatch": "3.0.4", "mkdirp": "0.5.1", "mocha": "3.1.2", - "oni-release-downloader": "^0.0.7", + "oni-release-downloader": "0.0.8", "opencollective": "1.0.3", "optimize-js-plugin": "0.0.4", "react": "16.0.0", diff --git a/yarn.lock b/yarn.lock index 0d143d7ce6..02afc0a513 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2293,7 +2293,7 @@ extract-zip@1.6.0: mkdirp "0.5.0" yauzl "2.4.1" -extract-zip@^1.0.3, extract-zip@^1.6.0: +extract-zip@^1.0.3, extract-zip@^1.6.0, extract-zip@^1.6.6: version "1.6.6" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" dependencies: @@ -4031,19 +4031,19 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -oni-neovim-binaries@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/oni-neovim-binaries/-/oni-neovim-binaries-0.0.7.tgz#a6a23a4dbdf4300c86961e1e270beb051d6e5596" - dependencies: - oni-release-downloader "^0.0.5" - -oni-release-downloader@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/oni-release-downloader/-/oni-release-downloader-0.0.5.tgz#fb91ad3b5649f388c475baf4397bfda7ccf92500" +oni-neovim-binaries@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/oni-neovim-binaries/-/oni-neovim-binaries-0.1.0.tgz#3852b654b2db8aa53e72c053163ade50eb80ee5b" -oni-release-downloader@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/oni-release-downloader/-/oni-release-downloader-0.0.7.tgz#3852036c539489e1d89fbe5cbb2af7f1339c25bc" +oni-release-downloader@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/oni-release-downloader/-/oni-release-downloader-0.0.8.tgz#7796cfd0c6df9a7ebcd7573389bdb387351c843a" + dependencies: + extract-zip "^1.6.6" + fs-extra "^4.0.2" + github-releases "^0.4.1" + mkdirp "^0.5.1" + rimraf "^2.6.2" oni-ripgrep@0.0.3: version "0.0.3" @@ -5117,7 +5117,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.1: +rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: From a7d9888a557bd867014b3aeed6623c76786f7c42 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 20 Nov 2017 15:41:07 -0800 Subject: [PATCH 20/63] Use 'oni-types' module and remove unused code (#994) * Remove unused PromiseHelper * Avoid allocating objects unnecessarily in getCell * Refactor to use 'oni-types' * Move oni-types to dependency --- browser/src/Editor/NeovimEditor.tsx | 4 +- browser/src/Editor/NeovimPopupMenu.tsx | 2 +- browser/src/Event.ts | 67 ------------------- browser/src/IDisposable.ts | 7 -- browser/src/Input/Keyboard/KeyboardLayout.ts | 3 +- browser/src/PromiseHelper.ts | 19 ------ browser/src/Screen.ts | 12 ++-- .../Services/Configuration/Configuration.ts | 2 +- .../src/Services/ContextMenu/ContextMenu.tsx | 2 +- browser/src/Services/EditorManager.ts | 3 +- .../src/Services/Language/LanguageClient.ts | 3 +- .../Language/LanguageClientProcess.ts | 3 +- .../src/Services/Language/LanguageManager.ts | 3 +- browser/src/Services/Menu/Menu.ts | 2 +- .../src/Services/QuickOpen/FinderProcess.ts | 4 +- .../src/Services/TypingPredictionManager.ts | 2 +- browser/src/Services/WindowManager.ts | 2 +- browser/src/Services/Workspace.ts | 3 +- .../src/UI/components/TypingPredictions.tsx | 2 +- browser/src/neovim/NeovimAutoCommands.ts | 2 +- browser/src/neovim/NeovimInstance.ts | 3 +- package.json | 1 + yarn.lock | 4 ++ 23 files changed, 35 insertions(+), 120 deletions(-) delete mode 100644 browser/src/Event.ts delete mode 100644 browser/src/IDisposable.ts delete mode 100644 browser/src/PromiseHelper.ts diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index c8509a6031..7d7c10fb18 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -14,12 +14,12 @@ import { Observable } from "rxjs/Observable" import { clipboard, ipcRenderer, remote } from "electron" +import { Event, IEvent } from "oni-types" + import { INeovimStartOptions, NeovimInstance, NeovimWindowManager } from "./../neovim" import { CanvasRenderer, INeovimRenderer } from "./../Renderer" import { NeovimScreen } from "./../Screen" -import { Event, IEvent } from "./../Event" - import { pluginManager } from "./../Plugins/PluginManager" import { commandManager } from "./../Services/CommandManager" diff --git a/browser/src/Editor/NeovimPopupMenu.tsx b/browser/src/Editor/NeovimPopupMenu.tsx index b2545a340a..5b903c5daf 100644 --- a/browser/src/Editor/NeovimPopupMenu.tsx +++ b/browser/src/Editor/NeovimPopupMenu.tsx @@ -6,7 +6,7 @@ import * as React from "react" -import { IEvent } from "./../Event" +import { IEvent } from "oni-types" import { INeovimCompletionInfo, INeovimCompletionItem } from "./../neovim" import * as UI from "./../UI" diff --git a/browser/src/Event.ts b/browser/src/Event.ts deleted file mode 100644 index 3393fd6844..0000000000 --- a/browser/src/Event.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Event.ts - */ - -import { EventEmitter } from "events" - -import { Observable } from "rxjs/Observable" -import { Subject } from "rxjs/Subject" - -import "rxjs/add/operator/auditTime" -import "rxjs/add/operator/combineLatest" -import "rxjs/add/operator/debounceTime" -import "rxjs/add/operator/distinctUntilChanged" -import "rxjs/add/operator/do" -import "rxjs/add/operator/filter" -import "rxjs/add/operator/map" -import "rxjs/add/operator/merge" -import "rxjs/add/operator/mergeMap" -import "rxjs/add/operator/switchMap" -import "rxjs/add/operator/takeLast" -import "rxjs/add/operator/withLatestFrom" - -import { IDisposable } from "./IDisposable" - -export type EventCallback = (value: T) => void - -export interface IEvent { - subscribe(callback: EventCallback): IDisposable - asObservable(): Observable -} - -export class Event implements IEvent { - - private _name: string - private _eventObject: EventEmitter = new EventEmitter() - private _subject: Subject = null - - constructor(name?: string) { - this._name = name || "default_event" - } - - public subscribe(callback: EventCallback): IDisposable { - this._eventObject.addListener(this._name, callback) - - const dispose = () => { - this._eventObject.removeListener(this._name, callback) - } - - return { dispose } - } - - public dispatch(val?: T): void { - if (this._subject) { - this._subject.next(val) - } - - this._eventObject.emit(this._name, val) - } - - public asObservable(): Observable { - if (!this._subject) { - this._subject = new Subject() - } - - return this._subject - } -} diff --git a/browser/src/IDisposable.ts b/browser/src/IDisposable.ts deleted file mode 100644 index b258bc2509..0000000000 --- a/browser/src/IDisposable.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * IDisposable.ts - */ - -export interface IDisposable { - dispose(): void -} diff --git a/browser/src/Input/Keyboard/KeyboardLayout.ts b/browser/src/Input/Keyboard/KeyboardLayout.ts index cabd44ee36..d627106ee9 100644 --- a/browser/src/Input/Keyboard/KeyboardLayout.ts +++ b/browser/src/Input/Keyboard/KeyboardLayout.ts @@ -1,4 +1,5 @@ -import { Event, IEvent } from "./../../Event" +import { Event, IEvent } from "oni-types" + import * as Log from "./../../Log" import * as Platform from "./../../Platform" diff --git a/browser/src/PromiseHelper.ts b/browser/src/PromiseHelper.ts deleted file mode 100644 index 7bcd0c5be4..0000000000 --- a/browser/src/PromiseHelper.ts +++ /dev/null @@ -1,19 +0,0 @@ - -import * as Performance from "./Performance" - -/** - * Thin wrapper around browser performance API - */ -export function wrapPromiseAndNotifyError(operationName: string, promise: Promise): void { - Performance.mark(operationName + ".start") - - promise.then(() => { - Performance.mark(operationName + ".end") - }, (err: Error) => { - Performance.mark(operationName + ".end") - - // TODO: We'll need to handle this differently eventually - // Potentially with a more fully-baked notification / error system (#98) - alert(`Error: ${err}`) - }) -} diff --git a/browser/src/Screen.ts b/browser/src/Screen.ts index 2debaed9d9..a4b56596ff 100644 --- a/browser/src/Screen.ts +++ b/browser/src/Screen.ts @@ -66,6 +66,11 @@ export interface IScrollRegion { right: number } +const DefaultCell: ICell = { + character: "", + characterWidth: 1, +} + export class NeovimScreen implements IScreen { private _backgroundColor: string = "#000000" private _currentHighlight: IHighlight = {} @@ -140,17 +145,12 @@ export class NeovimScreen implements IScreen { } public getCell(x: number, y: number): ICell { - const defaultCell = { - character: "", - characterWidth: 1, - } - const cell = this._grid.getCell(x, y) if (cell) { return cell } else { - return defaultCell + return DefaultCell } } diff --git a/browser/src/Services/Configuration/Configuration.ts b/browser/src/Services/Configuration/Configuration.ts index 6502314bfd..923ffa595e 100644 --- a/browser/src/Services/Configuration/Configuration.ts +++ b/browser/src/Services/Configuration/Configuration.ts @@ -4,7 +4,7 @@ import * as isError from "lodash/isError" import * as mkdirp from "mkdirp" import * as path from "path" -import { Event, IEvent } from "./../../Event" +import { Event, IEvent } from "oni-types" import { applyDefaultKeyBindings } from "./../../Input/KeyBindings" import * as Log from "./../../Log" import * as Performance from "./../../Performance" diff --git a/browser/src/Services/ContextMenu/ContextMenu.tsx b/browser/src/Services/ContextMenu/ContextMenu.tsx index 1b13bb3b02..9327fbf4d3 100644 --- a/browser/src/Services/ContextMenu/ContextMenu.tsx +++ b/browser/src/Services/ContextMenu/ContextMenu.tsx @@ -10,7 +10,7 @@ import thunk from "redux-thunk" import * as types from "vscode-languageserver-types" -import { Event, IEvent } from "./../../Event" +import { Event, IEvent } from "oni-types" import * as ActionCreators from "./../Menu/MenuActionCreators" import { createReducer } from "./../Menu/MenuReducer" diff --git a/browser/src/Services/EditorManager.ts b/browser/src/Services/EditorManager.ts index 49f53bba13..78ffa876a7 100644 --- a/browser/src/Services/EditorManager.ts +++ b/browser/src/Services/EditorManager.ts @@ -8,8 +8,7 @@ * to the active editor, and managing transitions between editors. */ -import { Event, IEvent } from "./../Event" -import { IDisposable } from "./../IDisposable" +import { Event, IDisposable, IEvent } from "oni-types" import * as Log from "./../Log" export class EditorManager implements Oni.EditorManager { diff --git a/browser/src/Services/Language/LanguageClient.ts b/browser/src/Services/Language/LanguageClient.ts index aac4ba24ec..120d718663 100644 --- a/browser/src/Services/Language/LanguageClient.ts +++ b/browser/src/Services/Language/LanguageClient.ts @@ -1,6 +1,7 @@ import * as rpc from "vscode-jsonrpc" -import { Event } from "./../../Event" +import { Event } from "oni-types" + import * as Log from "./../../Log" import { ILanguageClientProcess } from "./LanguageClientProcess" diff --git a/browser/src/Services/Language/LanguageClientProcess.ts b/browser/src/Services/Language/LanguageClientProcess.ts index e85a4e2f8c..236c92aadd 100644 --- a/browser/src/Services/Language/LanguageClientProcess.ts +++ b/browser/src/Services/Language/LanguageClientProcess.ts @@ -14,7 +14,8 @@ import * as path from "path" import { ChildProcess } from "child_process" import * as rpc from "vscode-jsonrpc" -import { Event, IEvent} from "./../../Event" +import { Event, IEvent} from "oni-types" + import * as Log from "./../../Log" import { normalizePath } from "./../../Utility" diff --git a/browser/src/Services/Language/LanguageManager.ts b/browser/src/Services/Language/LanguageManager.ts index 72ff38e2e6..ff68b7f339 100644 --- a/browser/src/Services/Language/LanguageManager.ts +++ b/browser/src/Services/Language/LanguageManager.ts @@ -9,8 +9,7 @@ import * as os from "os" -import { Event } from "./../../Event" -import { IDisposable } from "./../../IDisposable" +import { Event, IDisposable } from "oni-types" import * as Log from "./../../Log" import { configuration } from "./../Configuration" diff --git a/browser/src/Services/Menu/Menu.ts b/browser/src/Services/Menu/Menu.ts index 844799dc50..4e68aba09a 100644 --- a/browser/src/Services/Menu/Menu.ts +++ b/browser/src/Services/Menu/Menu.ts @@ -7,7 +7,7 @@ import { applyMiddleware, bindActionCreators, createStore } from "redux" import thunk from "redux-thunk" -import { Event, IEvent } from "./../../Event" +import { Event, IEvent } from "oni-types" import * as ActionCreators from "./MenuActionCreators" import { filterMenuOptions } from "./MenuFilter" diff --git a/browser/src/Services/QuickOpen/FinderProcess.ts b/browser/src/Services/QuickOpen/FinderProcess.ts index 4c080f2614..bc2ea0d09d 100644 --- a/browser/src/Services/QuickOpen/FinderProcess.ts +++ b/browser/src/Services/QuickOpen/FinderProcess.ts @@ -4,10 +4,10 @@ * Manages communication with the external finder process */ -import { Event, IEvent } from "./../../Event" - import { ChildProcess, spawn } from "child_process" +import { Event, IEvent } from "oni-types" + export class FinderProcess { private _process: ChildProcess diff --git a/browser/src/Services/TypingPredictionManager.ts b/browser/src/Services/TypingPredictionManager.ts index 809c77d10d..c3137e6cf0 100644 --- a/browser/src/Services/TypingPredictionManager.ts +++ b/browser/src/Services/TypingPredictionManager.ts @@ -4,7 +4,7 @@ * Handles typing-prediction state management */ -import { Event, IEvent } from "./../Event" +import { Event, IEvent } from "oni-types" export type TypingPredictionId = number diff --git a/browser/src/Services/WindowManager.ts b/browser/src/Services/WindowManager.ts index ffbc8d1315..b47968f241 100644 --- a/browser/src/Services/WindowManager.ts +++ b/browser/src/Services/WindowManager.ts @@ -8,7 +8,7 @@ * to the active editor, and managing transitions between editors. */ -import { Event, IEvent } from "./../Event" +import { Event, IEvent } from "oni-types" import { applySplit, closeSplit, createSplitLeaf, createSplitRoot, ISplitInfo, ISplitLeaf, SplitDirection } from "./WindowSplit" diff --git a/browser/src/Services/Workspace.ts b/browser/src/Services/Workspace.ts index d6299fa65f..a33e6b176f 100644 --- a/browser/src/Services/Workspace.ts +++ b/browser/src/Services/Workspace.ts @@ -12,7 +12,8 @@ import "rxjs/add/operator/toPromise" import { Observable } from "rxjs/Observable" import * as types from "vscode-languageserver-types" -import { Event, IEvent } from "./../Event" +import { Event, IEvent } from "oni-types" + import * as Log from "./../Log" import * as Helpers from "./../Plugins/Api/LanguageClient/LanguageClientHelpers" diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx index 56712fc76c..35fce9fef4 100644 --- a/browser/src/UI/components/TypingPredictions.tsx +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -5,7 +5,7 @@ * The purpose of this is to provide a very low-latency typing experience */ -import { IDisposable } from "./../../IDisposable" +import { IDisposable } from "oni-types" import * as React from "react" import { connect } from "react-redux" diff --git a/browser/src/neovim/NeovimAutoCommands.ts b/browser/src/neovim/NeovimAutoCommands.ts index 8654b23b56..033abb624b 100644 --- a/browser/src/neovim/NeovimAutoCommands.ts +++ b/browser/src/neovim/NeovimAutoCommands.ts @@ -5,7 +5,7 @@ * - To add a new autocommand, make sure it is registered in `init.vim` in the `OniEventListeners` augroup */ -import { Event, IEvent } from "./../Event" +import { Event, IEvent } from "oni-types" import { NeovimInstance } from "./NeovimInstance" diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 2ceb11156d..b5467b07df 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -3,7 +3,8 @@ import * as path from "path" import * as mkdirp from "mkdirp" -import { Event, IEvent } from "./../Event" +import { Event, IEvent } from "oni-types" + import * as Log from "./../Log" import * as Actions from "./../actions" diff --git a/package.json b/package.json index 15b11906e7..d0812a1d7e 100644 --- a/package.json +++ b/package.json @@ -121,6 +121,7 @@ "ocaml-language-server": "1.0.12", "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", + "oni-types": "0.0.4", "typescript": "2.5.3", "vscode-jsonrpc": "3.5.0", "vscode-languageserver": "3.5.0", diff --git a/yarn.lock b/yarn.lock index 02afc0a513..3ccb85a62a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4049,6 +4049,10 @@ oni-ripgrep@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/oni-ripgrep/-/oni-ripgrep-0.0.3.tgz#fce3ae21f41b587e09827cb3c6e4dce91928c6a7" +oni-types@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/oni-types/-/oni-types-0.0.4.tgz#97bc435565d5f4c3bdc50bd1700fd24dd5b6704b" + opencollective@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" From 6501a2b50d690ffe31e66aca71a5972c79e3e4eb Mon Sep 17 00:00:00 2001 From: Akin Date: Mon, 20 Nov 2017 23:48:33 +0000 Subject: [PATCH 21/63] Feature/resize buffer bar scroll (#993) * Reduce size of BufferScrollBar * Add todo comment in tabs component * Reduce scrollbar size and show on hover * Remove dynamically set overflow in tabs component as this overrides less hover effect * Reduce scrollbar height to 3px * add overflow-overlay to tabs class on hover * * remove height from global webkit-scrollbar * add scoped css for tab bar scrollbar --- browser/src/UI/components/Tabs.less | 8 ++++++++ browser/src/UI/components/Tabs.tsx | 6 +----- browser/src/UI/components/common.less | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/browser/src/UI/components/Tabs.less b/browser/src/UI/components/Tabs.less index 0c807735cc..72d988408c 100644 --- a/browser/src/UI/components/Tabs.less +++ b/browser/src/UI/components/Tabs.less @@ -29,6 +29,14 @@ width: 100%; color: #c8c8c8; background-color: rgba(0, 0, 0, 0.2); + + &:hover { + overflow-x: overlay; + } +} + +.tabs::-webkit-scrollbar { + height: 3px; } .tab { diff --git a/browser/src/UI/components/Tabs.tsx b/browser/src/UI/components/Tabs.tsx index dfc325e5a6..89f7c44fff 100644 --- a/browser/src/UI/components/Tabs.tsx +++ b/browser/src/UI/components/Tabs.tsx @@ -60,11 +60,7 @@ export class Tabs extends React.PureComponent { flexWrap: "wrap", } - const scrollStyle: React.CSSProperties = { - overflowX: "auto", - } - - const overflowStyle = this.props.shouldWrap ? wrapStyle : scrollStyle + const overflowStyle = this.props.shouldWrap ? wrapStyle : {} const tabBorderStyle: React.CSSProperties = { ...overflowStyle, diff --git a/browser/src/UI/components/common.less b/browser/src/UI/components/common.less index f1bec0260f..fa3ddb8c90 100644 --- a/browser/src/UI/components/common.less +++ b/browser/src/UI/components/common.less @@ -88,7 +88,7 @@ &.fixed { flex: 0 0 auto; } - + &.center { justify-content: center; align-items: center; From a1217c8a49fc90a5f8b64984b663231f28deba95 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 20 Nov 2017 17:25:01 -0800 Subject: [PATCH 22/63] Add filter for insert mode, so that we pass through to Neovim (#995) --- browser/src/Input/KeyBindings.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/browser/src/Input/KeyBindings.ts b/browser/src/Input/KeyBindings.ts index c63ddab5dc..d0515f2f58 100644 --- a/browser/src/Input/KeyBindings.ts +++ b/browser/src/Input/KeyBindings.ts @@ -14,6 +14,7 @@ export const applyDefaultKeyBindings = (oni: Oni.Plugin.Api, config: Configurati const isVisualMode = () => editors.activeEditor.mode === "visual" const isNormalMode = () => editors.activeEditor.mode === "normal" + const isNotInsertMode = () => editors.activeEditor.mode !== "insert" const isInsertOrCommandMode = () => editors.activeEditor.mode === "insert" || editors.activeEditor.mode === "cmdline_normal" const isMenuOpen = () => menu.isMenuOpen() @@ -67,7 +68,7 @@ export const applyDefaultKeyBindings = (oni: Oni.Plugin.Api, config: Configurati input.bind(["", ""], "contextMenu.select") input.bind(["", ""], "contextMenu.next") input.bind(["", ""], "contextMenu.previous") - input.bind([""], "contextMenu.close") + input.bind([""], "contextMenu.close", isNotInsertMode /* In insert mode, the mode change will close the popupmenu anyway */) // Menu input.bind(["", ""], "menu.next") From bb8ddee9df342d343133013cf5cd0db4f72756f7 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Tue, 21 Nov 2017 12:12:44 -0800 Subject: [PATCH 23/63] Refactoring: Use 'oni-api' module (#996) * Remove Oni.d.ts * First round of moving to use 'oni-api * Next round of leveraging oni-api * Additional round of oni-api * Define EventContext internally * Fix EventContext references in NeovimWindowManager * Continue to leverage oni-api, remove unused references to Oni.EventContext * Fix up last references * Update to use oni-api module * Update TypeScript server to use 'oni-api * Remove redundant typing, as react is included with react-dom and it was causing conflicts * Remove Oni.d.ts reference --- browser/src/Editor/BufferManager.ts | 10 +- browser/src/Editor/BufferUpdates.ts | 2 + browser/src/Editor/Editor.ts | 3 + browser/src/Editor/NeovimEditor.tsx | 5 +- browser/src/Input/KeyBindings.ts | 2 + browser/src/Plugins/AnonymousPlugin.ts | 6 +- browser/src/Plugins/Api/Diagnostics.ts | 2 + .../LanguageClient/LanguageClientHelpers.ts | 48 +-- browser/src/Plugins/Api/Oni.ts | 39 ++- browser/src/Plugins/PluginManager.ts | 3 + browser/src/Services/AutoClosingPairs.ts | 2 + browser/src/Services/Automation.ts | 4 +- browser/src/Services/CommandManager.ts | 2 + browser/src/Services/Commands.ts | 2 + .../Services/Configuration/Configuration.ts | 1 + .../Configuration/IConfigurationValues.ts | 2 + .../src/Services/ContextMenu/ContextMenu.tsx | 1 + .../ContextMenu/ContextMenuComponent.tsx | 2 + browser/src/Services/EditorManager.ts | 2 + browser/src/Services/InputManager.ts | 2 + .../Language/Completion/Completion.ts | 2 + .../Language/Completion/CompletionMenu.ts | 2 + .../Language/LanguageClientStatusBar.tsx | 2 + .../Language/LanguageEditorIntegration.ts | 1 + .../src/Services/Language/LanguageManager.ts | 2 + .../src/Services/Language/SignatureHelp.ts | 2 + browser/src/Services/Language/Symbols.ts | 2 + browser/src/Services/Menu/Menu.ts | 1 + browser/src/Services/Menu/MenuComponent.tsx | 2 + browser/src/Services/Menu/MenuFilter.ts | 2 + browser/src/Services/QuickOpen/QuickOpen.ts | 2 + browser/src/Services/StatusBar.ts | 2 + browser/src/Services/Tasks.ts | 6 +- browser/src/Services/WindowManager.ts | 1 + browser/src/Services/Workspace.ts | 1 + browser/src/UI/ActionCreators.ts | 2 + browser/src/UI/Actions.ts | 2 + browser/src/UI/State.ts | 2 + .../src/UI/components/CursorPositioner.tsx | 2 + browser/src/UI/components/WindowSplitHost.tsx | 2 + browser/src/UI/components/WindowSplits.tsx | 2 + browser/src/index.tsx | 2 - browser/src/neovim/EventContext.ts | 30 ++ browser/src/neovim/NeovimAutoCommands.ts | 43 +-- browser/src/neovim/NeovimInstance.ts | 19 +- browser/src/neovim/NeovimWindowManager.ts | 13 +- browser/src/neovim/index.ts | 1 + browser/tsconfig.json | 3 - browser/tsconfig.src.json | 3 - definitions/Oni.d.ts | 300 ------------------ package.json | 4 +- test/tsconfig.json | 3 - .../oni-plugin-typescript/src/CodeActions.ts | 3 +- .../oni-plugin-typescript/src/Completion.ts | 3 +- .../oni-plugin-typescript/src/Definition.ts | 3 +- .../src/FindAllReferences.ts | 3 +- .../oni-plugin-typescript/src/Formatting.ts | 3 +- .../src/LightweightLanguageClient.ts | 6 +- .../oni-plugin-typescript/src/QuickInfo.ts | 3 +- vim/core/oni-plugin-typescript/src/Rename.ts | 3 +- .../src/SignatureHelp.ts | 3 +- vim/core/oni-plugin-typescript/src/Symbols.ts | 3 +- vim/core/oni-plugin-typescript/src/Types.ts | 1 - vim/core/oni-plugin-typescript/src/index.ts | 3 +- vim/core/oni-plugin-typescript/tsconfig.json | 3 - .../oni-plugin-typescript/tsconfig.test.json | 3 - yarn.lock | 73 +++-- 67 files changed, 246 insertions(+), 473 deletions(-) create mode 100644 browser/src/neovim/EventContext.ts delete mode 100644 definitions/Oni.d.ts diff --git a/browser/src/Editor/BufferManager.ts b/browser/src/Editor/BufferManager.ts index 4b83ff01fb..c118f799b2 100644 --- a/browser/src/Editor/BufferManager.ts +++ b/browser/src/Editor/BufferManager.ts @@ -13,7 +13,9 @@ import "rxjs/add/observable/defer" import "rxjs/add/observable/from" import "rxjs/add/operator/concatMap" -import { NeovimInstance } from "./../neovim" +import * as Oni from "oni-api" + +import { EventContext, NeovimInstance } from "./../neovim" import { languageManager, sortTextEdits } from "./../Services/Language" import * as Constants from "./../Constants" @@ -61,7 +63,7 @@ export class Buffer implements Oni.Buffer { } constructor(private _neovimInstance: NeovimInstance, - evt: Oni.EventContext) { + evt: EventContext) { this.updateFromEvent(evt) } @@ -186,7 +188,7 @@ export class Buffer implements Oni.Buffer { return getToken(result[0], column) } - public updateFromEvent(evt: Oni.EventContext): void { + public updateFromEvent(evt: EventContext): void { this._id = evt.bufferNumber.toString() this._filePath = evt.bufferFullPath this._language = evt.filetype @@ -220,7 +222,7 @@ export class BufferManager { constructor(private _neovimInstance: NeovimInstance) { } - public updateBufferFromEvent(evt: Oni.EventContext): Buffer { + public updateBufferFromEvent(evt: EventContext): Buffer { const id = evt.bufferNumber.toString() const currentBuffer = this.getBufferById(id) diff --git a/browser/src/Editor/BufferUpdates.ts b/browser/src/Editor/BufferUpdates.ts index 3f7d65cdcb..07cb78e20a 100644 --- a/browser/src/Editor/BufferUpdates.ts +++ b/browser/src/Editor/BufferUpdates.ts @@ -8,6 +8,8 @@ import * as os from "os" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import * as Log from "./../Log" import { Observable } from "rxjs/Observable" diff --git a/browser/src/Editor/Editor.ts b/browser/src/Editor/Editor.ts index 262323aff2..8ea983f2f5 100644 --- a/browser/src/Editor/Editor.ts +++ b/browser/src/Editor/Editor.ts @@ -3,6 +3,9 @@ * an editor handles rendering and input * for a specific window. */ + +import * as Oni from "oni-api" + export interface IEditor extends Oni.Editor { // Methods init(filesToOpen: string[]): void diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 7d7c10fb18..9b067fc73b 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -14,9 +14,10 @@ import { Observable } from "rxjs/Observable" import { clipboard, ipcRenderer, remote } from "electron" +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" -import { INeovimStartOptions, NeovimInstance, NeovimWindowManager } from "./../neovim" +import { EventContext, INeovimStartOptions, NeovimInstance, NeovimWindowManager } from "./../neovim" import { CanvasRenderer, INeovimRenderer } from "./../Renderer" import { NeovimScreen } from "./../Screen" @@ -345,7 +346,7 @@ export class NeovimEditor implements IEditor { this._currentMode = newMode } - private _onVimEvent(eventName: string, evt: Oni.EventContext): void { + private _onVimEvent(eventName: string, evt: EventContext): void { UI.Actions.setWindowCursor(evt.windowNumber, evt.line - 1, evt.column - 1) tasks.onEvent(evt) diff --git a/browser/src/Input/KeyBindings.ts b/browser/src/Input/KeyBindings.ts index d0515f2f58..c99a052ba5 100644 --- a/browser/src/Input/KeyBindings.ts +++ b/browser/src/Input/KeyBindings.ts @@ -4,6 +4,8 @@ * Default, out-of-the-box keybindings for Oni */ +import * as Oni from "oni-api" + import * as Platform from "./../Platform" import { Configuration } from "./../Services/Configuration" diff --git a/browser/src/Plugins/AnonymousPlugin.ts b/browser/src/Plugins/AnonymousPlugin.ts index d6097849d1..df7fa85d0a 100644 --- a/browser/src/Plugins/AnonymousPlugin.ts +++ b/browser/src/Plugins/AnonymousPlugin.ts @@ -5,12 +5,14 @@ * Useful for testing the plugin API */ +import * as OniApi from "oni-api" + import { Oni } from "./Api/Oni" export class AnonymousPlugin { - private _oni: Oni.Plugin.Api + private _oni: OniApi.Plugin.Api - public get oni(): Oni.Plugin.Api { + public get oni(): OniApi.Plugin.Api { return this._oni } diff --git a/browser/src/Plugins/Api/Diagnostics.ts b/browser/src/Plugins/Api/Diagnostics.ts index 227059baf7..1e1d42f568 100644 --- a/browser/src/Plugins/Api/Diagnostics.ts +++ b/browser/src/Plugins/Api/Diagnostics.ts @@ -6,6 +6,8 @@ import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import * as UI from "./../../UI" /** diff --git a/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts b/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts index 3877d2c195..f4e26a1aaa 100644 --- a/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts +++ b/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts @@ -7,6 +7,8 @@ import * as os from "os" import * as flatMap from "lodash/flatMap" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import * as Utility from "./../../../Utility" export namespace TextDocumentSyncKind { @@ -48,25 +50,6 @@ export const getTextFromContents = (contents: types.MarkedString | types.MarkedS } } -export const bufferUpdateToTextDocumentItem = (args: Oni.BufferUpdateContext): types.TextDocumentItem => { - const lines = args.bufferLines - const { bufferFullPath, filetype, version } = args.eventContext - const text = lines.join(os.EOL) - - return { - uri: wrapPathInFileUri(bufferFullPath), - languageId: filetype, - version, - text, - } -} - -export const eventContextToTextDocumentIdentifierParams = (args: Oni.BufferUpdateContext) => ({ - textDocument: { - uri: wrapPathInFileUri(args.eventContext.bufferFullPath), - }, -}) - export const pathToTextDocumentIdentifierParms = (path: string) => ({ textDocument: { uri: wrapPathInFileUri(path), @@ -93,16 +76,6 @@ export const eventContextToCodeActionParams = (filePath: string, range: types.Ra } } -export const eventContextToTextDocumentPositionParams = (args: Oni.EventContext) => ({ - textDocument: { - uri: wrapPathInFileUri(args.bufferFullPath), - }, - position: { - line: args.line - 1, - character: args.column - 1, - }, -}) - export const bufferToTextDocumentPositionParams = (buffer: Oni.Buffer) => ({ textDocument: { uri: wrapPathInFileUri(buffer.filePath), @@ -127,23 +100,6 @@ export const createDidChangeTextDocumentParams = (bufferFullPath: string, lines: } } -export const incrementalBufferUpdateToDidChangeTextDocumentParams = (args: Oni.IncrementalBufferUpdateContext, previousLine: string) => { - const changedLine = args.bufferLine - const lineNumber = args.lineNumber - const previousLineLength = previousLine.length - - return { - textDocument: { - uri: wrapPathInFileUri(args.eventContext.bufferFullPath), - version: args.eventContext.version, - }, - contentChanges: [{ - range: types.Range.create(lineNumber - 1, 0, lineNumber - 1, previousLineLength), - text: changedLine, - }], - } -} - const getTextFromMarkedString = (markedString: types.MarkedString): string[] => { if (typeof markedString === "string") { return splitByNewlines(markedString) diff --git a/browser/src/Plugins/Api/Oni.ts b/browser/src/Plugins/Api/Oni.ts index a317bf84a1..05f21bf8be 100644 --- a/browser/src/Plugins/Api/Oni.ts +++ b/browser/src/Plugins/Api/Oni.ts @@ -1,6 +1,15 @@ +/** + * OniApi.ts + * + * Implementation of OniApi's API surface + * TODO: Gradually move over to `oni-api` + */ + import * as ChildProcess from "child_process" import { EventEmitter } from "events" +import * as OniApi from "oni-api" + import { Diagnostics } from "./Diagnostics" import * as Process from "./Process" @@ -37,24 +46,24 @@ const helpers = { } /** - * API instance for interacting with Oni (and vim) + * API instance for interacting with OniApi (and vim) */ -export class Oni extends EventEmitter implements Oni.Plugin.Api { +export class Oni extends EventEmitter implements OniApi.Plugin.Api { private _dependencies: Dependencies - private _diagnostics: Oni.Plugin.Diagnostics.Api + private _diagnostics: OniApi.Plugin.Diagnostics.Api private _ui: Ui private _services: Services - public get automation(): Oni.Automation.Api { + public get automation(): OniApi.Automation.Api { return automation } - public get commands(): Oni.Commands { + public get commands(): OniApi.Commands { return commandManager } - public get log(): Oni.Log { + public get log(): OniApi.Log { return Log } @@ -62,7 +71,7 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { return recorder } - public get configuration(): Oni.Configuration { + public get configuration(): OniApi.Configuration { return configuration } @@ -70,7 +79,7 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { return contextMenuManager } - public get diagnostics(): Oni.Plugin.Diagnostics.Api { + public get diagnostics(): OniApi.Plugin.Diagnostics.Api { return this._diagnostics } @@ -78,11 +87,11 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { return this._dependencies } - public get editors(): Oni.EditorManager { + public get editors(): OniApi.EditorManager { return editorManager } - public get input(): Oni.InputManager { + public get input(): OniApi.InputManager { return inputManager } @@ -94,11 +103,11 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { return menuManager } - public get process(): Oni.Process { + public get process(): OniApi.Process { return Process } - public get statusBar(): Oni.StatusBar { + public get statusBar(): OniApi.StatusBar { return statusBar } @@ -114,7 +123,7 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { return windowManager } - public get workspace(): Oni.Workspace { + public get workspace(): OniApi.Workspace { return workspace } @@ -132,7 +141,7 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { } public execNodeScript(scriptPath: string, args: string[] = [], options: ChildProcess.ExecOptions = {}, callback: (err: any, stdout: string, stderr: string) => void): ChildProcess.ChildProcess { - Log.warn("WARNING: `Oni.execNodeScript` is deprecated. Please use `Oni.process.execNodeScript` instead") + Log.warn("WARNING: `OniApi.execNodeScript` is deprecated. Please use `OniApi.process.execNodeScript` instead") return Process.execNodeScript(scriptPath, args, options, callback) } @@ -142,7 +151,7 @@ export class Oni extends EventEmitter implements Oni.Plugin.Api { */ public spawnNodeScript(scriptPath: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): ChildProcess.ChildProcess { - Log.warn("WARNING: `Oni.spawnNodeScript` is deprecated. Please use `Oni.process.spawnNodeScript` instead") + Log.warn("WARNING: `OniApi.spawnNodeScript` is deprecated. Please use `OniApi.process.spawnNodeScript` instead") return Process.spawnNodeScript(scriptPath, args, options) } diff --git a/browser/src/Plugins/PluginManager.ts b/browser/src/Plugins/PluginManager.ts index 634dd988cf..947db7ea33 100644 --- a/browser/src/Plugins/PluginManager.ts +++ b/browser/src/Plugins/PluginManager.ts @@ -1,6 +1,9 @@ import { EventEmitter } from "events" import * as fs from "fs" import * as path from "path" + +import * as Oni from "oni-api" + import { configuration } from "./../Services/Configuration" import { AnonymousPlugin } from "./AnonymousPlugin" diff --git a/browser/src/Services/AutoClosingPairs.ts b/browser/src/Services/AutoClosingPairs.ts index f9f71d7846..dc9914e129 100644 --- a/browser/src/Services/AutoClosingPairs.ts +++ b/browser/src/Services/AutoClosingPairs.ts @@ -4,6 +4,8 @@ * Service to enable auto-closing pair key bindings */ +import * as Oni from "oni-api" + import { Configuration } from "./Configuration" import { EditorManager } from "./EditorManager" import { InputManager } from "./InputManager" diff --git a/browser/src/Services/Automation.ts b/browser/src/Services/Automation.ts index ac1d577f70..905504500b 100644 --- a/browser/src/Services/Automation.ts +++ b/browser/src/Services/Automation.ts @@ -4,6 +4,8 @@ * Helper methods for running automated tests */ +import * as OniApi from "oni-api" + import * as Utility from "./../Utility" import { editorManager } from "./EditorManager" @@ -16,7 +18,7 @@ export interface ITestResult { import { Oni } from "./../Plugins/Api/Oni" -export class Automation implements Oni.Automation.Api { +export class Automation implements OniApi.Automation.Api { public sendKeys(keys: string): void { diff --git a/browser/src/Services/CommandManager.ts b/browser/src/Services/CommandManager.ts index b8f64c8d12..38c874d331 100644 --- a/browser/src/Services/CommandManager.ts +++ b/browser/src/Services/CommandManager.ts @@ -6,6 +6,8 @@ import * as values from "lodash/values" +import * as Oni from "oni-api" + import * as Log from "./../Log" import { INeovimInstance } from "./../neovim" import { ITask, ITaskProvider } from "./Tasks" diff --git a/browser/src/Services/Commands.ts b/browser/src/Services/Commands.ts index 566f9658f0..c2971ff4d8 100644 --- a/browser/src/Services/Commands.ts +++ b/browser/src/Services/Commands.ts @@ -10,6 +10,8 @@ import * as path from "path" import { clipboard, remote } from "electron" +import * as Oni from "oni-api" + import { INeovimInstance } from "./../neovim" import { configuration } from "./../Services/Configuration" diff --git a/browser/src/Services/Configuration/Configuration.ts b/browser/src/Services/Configuration/Configuration.ts index 923ffa595e..42ccd83caf 100644 --- a/browser/src/Services/Configuration/Configuration.ts +++ b/browser/src/Services/Configuration/Configuration.ts @@ -4,6 +4,7 @@ import * as isError from "lodash/isError" import * as mkdirp from "mkdirp" import * as path from "path" +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" import { applyDefaultKeyBindings } from "./../../Input/KeyBindings" import * as Log from "./../../Log" diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index ec47ba635c..b7d14da153 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -6,6 +6,8 @@ * because dependent packages or plugins may have their own set of configuration */ +import * as Oni from "oni-api" + export interface IConfigurationValues { "activate": (oni: Oni.Plugin.Api) => void diff --git a/browser/src/Services/ContextMenu/ContextMenu.tsx b/browser/src/Services/ContextMenu/ContextMenu.tsx index 9327fbf4d3..d320d4bead 100644 --- a/browser/src/Services/ContextMenu/ContextMenu.tsx +++ b/browser/src/Services/ContextMenu/ContextMenu.tsx @@ -10,6 +10,7 @@ import thunk from "redux-thunk" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" import * as ActionCreators from "./../Menu/MenuActionCreators" diff --git a/browser/src/Services/ContextMenu/ContextMenuComponent.tsx b/browser/src/Services/ContextMenu/ContextMenuComponent.tsx index e71f7ddc61..6cc44ccd46 100644 --- a/browser/src/Services/ContextMenu/ContextMenuComponent.tsx +++ b/browser/src/Services/ContextMenu/ContextMenuComponent.tsx @@ -8,6 +8,8 @@ import * as types from "vscode-languageserver-types" import { connect, Provider } from "react-redux" +import * as Oni from "oni-api" + import { IMenus } from "./../Menu/MenuState" import * as Colors from "./../../UI/Colors" diff --git a/browser/src/Services/EditorManager.ts b/browser/src/Services/EditorManager.ts index 78ffa876a7..bab32025db 100644 --- a/browser/src/Services/EditorManager.ts +++ b/browser/src/Services/EditorManager.ts @@ -8,7 +8,9 @@ * to the active editor, and managing transitions between editors. */ +import * as Oni from "oni-api" import { Event, IDisposable, IEvent } from "oni-types" + import * as Log from "./../Log" export class EditorManager implements Oni.EditorManager { diff --git a/browser/src/Services/InputManager.ts b/browser/src/Services/InputManager.ts index 8692c97880..3d512d88e9 100644 --- a/browser/src/Services/InputManager.ts +++ b/browser/src/Services/InputManager.ts @@ -1,4 +1,6 @@ +import * as Oni from "oni-api" + import { commandManager } from "./CommandManager" export type ActionFunction = () => boolean diff --git a/browser/src/Services/Language/Completion/Completion.ts b/browser/src/Services/Language/Completion/Completion.ts index 83ed7728ae..2812d01f48 100644 --- a/browser/src/Services/Language/Completion/Completion.ts +++ b/browser/src/Services/Language/Completion/Completion.ts @@ -9,6 +9,8 @@ import { Observable } from "rxjs/Observable" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import * as Log from "./../../../Log" import * as Helpers from "./../../../Plugins/Api/LanguageClient/LanguageClientHelpers" import { configuration } from "./../../Configuration" diff --git a/browser/src/Services/Language/Completion/CompletionMenu.ts b/browser/src/Services/Language/Completion/CompletionMenu.ts index be7a26653a..9670ea9047 100644 --- a/browser/src/Services/Language/Completion/CompletionMenu.ts +++ b/browser/src/Services/Language/Completion/CompletionMenu.ts @@ -8,6 +8,8 @@ import { Observable } from "rxjs/Observable" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { contextMenuManager } from "./../../ContextMenu" import { editorManager } from "./../../EditorManager" diff --git a/browser/src/Services/Language/LanguageClientStatusBar.tsx b/browser/src/Services/Language/LanguageClientStatusBar.tsx index cb7e76c074..27ef947885 100644 --- a/browser/src/Services/Language/LanguageClientStatusBar.tsx +++ b/browser/src/Services/Language/LanguageClientStatusBar.tsx @@ -7,6 +7,8 @@ import * as electron from "electron" import * as React from "react" +import * as Oni from "oni-api" + import { Icon } from "./../../UI/Icon" import { statusBar } from "./../StatusBar" diff --git a/browser/src/Services/Language/LanguageEditorIntegration.ts b/browser/src/Services/Language/LanguageEditorIntegration.ts index b63e61588e..b012463a12 100644 --- a/browser/src/Services/Language/LanguageEditorIntegration.ts +++ b/browser/src/Services/Language/LanguageEditorIntegration.ts @@ -11,6 +11,7 @@ import "rxjs/add/observable/never" import { Observable } from "rxjs/Observable" // import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" import { editorManager } from "./../EditorManager" import * as Completion from "./Completion" diff --git a/browser/src/Services/Language/LanguageManager.ts b/browser/src/Services/Language/LanguageManager.ts index ff68b7f339..e883992159 100644 --- a/browser/src/Services/Language/LanguageManager.ts +++ b/browser/src/Services/Language/LanguageManager.ts @@ -9,7 +9,9 @@ import * as os from "os" +import * as Oni from "oni-api" import { Event, IDisposable } from "oni-types" + import * as Log from "./../../Log" import { configuration } from "./../Configuration" diff --git a/browser/src/Services/Language/SignatureHelp.ts b/browser/src/Services/Language/SignatureHelp.ts index 60ba08c26d..aab92b5c62 100644 --- a/browser/src/Services/Language/SignatureHelp.ts +++ b/browser/src/Services/Language/SignatureHelp.ts @@ -6,6 +6,8 @@ import { Observable } from "rxjs/Observable" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import * as Log from "./../../Log" import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" import * as UI from "./../../UI" diff --git a/browser/src/Services/Language/Symbols.ts b/browser/src/Services/Language/Symbols.ts index 330f9dd5a4..f7c143fde3 100644 --- a/browser/src/Services/Language/Symbols.ts +++ b/browser/src/Services/Language/Symbols.ts @@ -6,6 +6,8 @@ // import * as os from "os" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + // import { configuration } from "./../Configuration" // import * as UI from "./../../UI" diff --git a/browser/src/Services/Menu/Menu.ts b/browser/src/Services/Menu/Menu.ts index 4e68aba09a..9f8dce1a2c 100644 --- a/browser/src/Services/Menu/Menu.ts +++ b/browser/src/Services/Menu/Menu.ts @@ -7,6 +7,7 @@ import { applyMiddleware, bindActionCreators, createStore } from "redux" import thunk from "redux-thunk" +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" import * as ActionCreators from "./MenuActionCreators" diff --git a/browser/src/Services/Menu/MenuComponent.tsx b/browser/src/Services/Menu/MenuComponent.tsx index 7f265303f4..30b5eae13d 100644 --- a/browser/src/Services/Menu/MenuComponent.tsx +++ b/browser/src/Services/Menu/MenuComponent.tsx @@ -3,6 +3,8 @@ import { connect, Provider } from "react-redux" import * as take from "lodash/take" +import * as Oni from "oni-api" + import { HighlightTextByIndex } from "./../../UI/components/HighlightText" import { Visible } from "./../../UI/components/Visible" import { Icon, IconSize } from "./../../UI/Icon" diff --git a/browser/src/Services/Menu/MenuFilter.ts b/browser/src/Services/Menu/MenuFilter.ts index d938c0ab8d..33cae5f98b 100644 --- a/browser/src/Services/Menu/MenuFilter.ts +++ b/browser/src/Services/Menu/MenuFilter.ts @@ -7,6 +7,8 @@ import * as Fuse from "fuse.js" import * as sortBy from "lodash/sortBy" +import * as Oni from "oni-api" + import { configuration } from "./../../Services/Configuration" import { IMenuOptionWithHighlights } from "./Menu" diff --git a/browser/src/Services/QuickOpen/QuickOpen.ts b/browser/src/Services/QuickOpen/QuickOpen.ts index f00e24d553..3a7a599e28 100644 --- a/browser/src/Services/QuickOpen/QuickOpen.ts +++ b/browser/src/Services/QuickOpen/QuickOpen.ts @@ -8,6 +8,8 @@ import { lstatSync } from "fs" import * as path from "path" +import * as Oni from "oni-api" + import { INeovimInstance } from "./../../neovim" import { commandManager } from "./../CommandManager" diff --git a/browser/src/Services/StatusBar.ts b/browser/src/Services/StatusBar.ts index 3958c9e392..08ea2f92be 100644 --- a/browser/src/Services/StatusBar.ts +++ b/browser/src/Services/StatusBar.ts @@ -10,6 +10,8 @@ import { Subscription } from "rxjs/Subscription" import "rxjs/add/operator/auditTime" import "rxjs/add/operator/debounceTime" +import * as Oni from "oni-api" + import * as UI from "./../UI" export enum StatusBarAlignment { diff --git a/browser/src/Services/Tasks.ts b/browser/src/Services/Tasks.ts index f3d258feb0..3dbee0d817 100644 --- a/browser/src/Services/Tasks.ts +++ b/browser/src/Services/Tasks.ts @@ -14,6 +14,10 @@ import {EventEmitter} from "events" import * as find from "lodash/find" import * as flatten from "lodash/flatten" +import * as Oni from "oni-api" + +import { EventContext } from "./../neovim" + import { Menu, menuManager } from "./../Services/Menu" export interface ITask { @@ -44,7 +48,7 @@ export class Tasks extends EventEmitter { this._providers.push(taskProvider) } - public onEvent(event: Oni.EventContext): void { + public onEvent(event: EventContext): void { this._currentBufferPath = event.bufferFullPath } diff --git a/browser/src/Services/WindowManager.ts b/browser/src/Services/WindowManager.ts index b47968f241..bbe59310d0 100644 --- a/browser/src/Services/WindowManager.ts +++ b/browser/src/Services/WindowManager.ts @@ -8,6 +8,7 @@ * to the active editor, and managing transitions between editors. */ +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" import { applySplit, closeSplit, createSplitLeaf, createSplitRoot, ISplitInfo, ISplitLeaf, SplitDirection } from "./WindowSplit" diff --git a/browser/src/Services/Workspace.ts b/browser/src/Services/Workspace.ts index a33e6b176f..14a6843be3 100644 --- a/browser/src/Services/Workspace.ts +++ b/browser/src/Services/Workspace.ts @@ -12,6 +12,7 @@ import "rxjs/add/operator/toPromise" import { Observable } from "rxjs/Observable" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" import * as Log from "./../Log" diff --git a/browser/src/UI/ActionCreators.ts b/browser/src/UI/ActionCreators.ts index 874210a83c..34823f7059 100644 --- a/browser/src/UI/ActionCreators.ts +++ b/browser/src/UI/ActionCreators.ts @@ -13,6 +13,8 @@ import * as isEqual from "lodash/isEqual" import "rxjs/add/operator/distinctUntilChanged" import { Subject } from "rxjs/Subject" +import * as Oni from "oni-api" + import { Rectangle } from "./Types" import * as Actions from "./Actions" diff --git a/browser/src/UI/Actions.ts b/browser/src/UI/Actions.ts index 83fe8e3643..e160109cc6 100644 --- a/browser/src/UI/Actions.ts +++ b/browser/src/UI/Actions.ts @@ -7,6 +7,8 @@ * http://redux.js.org/docs/basics/Actions.html */ +import * as Oni from "oni-api" + import * as Coordinates from "./Coordinates" import { IMessageDialog, ITab, StatusBarAlignment } from "./State" import { Rectangle } from "./Types" diff --git a/browser/src/UI/State.ts b/browser/src/UI/State.ts index 1b3a9d5ed9..48ff633edb 100644 --- a/browser/src/UI/State.ts +++ b/browser/src/UI/State.ts @@ -6,6 +6,8 @@ import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { configuration , IConfigurationValues } from "./../Services/Configuration" import * as Coordinates from "./Coordinates" diff --git a/browser/src/UI/components/CursorPositioner.tsx b/browser/src/UI/components/CursorPositioner.tsx index a5acd53a67..a7189c94a2 100644 --- a/browser/src/UI/components/CursorPositioner.tsx +++ b/browser/src/UI/components/CursorPositioner.tsx @@ -8,6 +8,8 @@ import * as React from "react" import { connect } from "react-redux" +import * as Oni from "oni-api" + import { IState } from "./../State" import { Arrow, ArrowDirection } from "./Arrow" diff --git a/browser/src/UI/components/WindowSplitHost.tsx b/browser/src/UI/components/WindowSplitHost.tsx index 6f6adf4787..b7e3c89ffe 100644 --- a/browser/src/UI/components/WindowSplitHost.tsx +++ b/browser/src/UI/components/WindowSplitHost.tsx @@ -6,6 +6,8 @@ import * as React from "react" +import * as Oni from "oni-api" + export interface IWindowSplitHostProps { split: Oni.IWindowSplit } diff --git a/browser/src/UI/components/WindowSplits.tsx b/browser/src/UI/components/WindowSplits.tsx index cfee971b3b..40621a40d6 100644 --- a/browser/src/UI/components/WindowSplits.tsx +++ b/browser/src/UI/components/WindowSplits.tsx @@ -6,6 +6,8 @@ import * as React from "react" +import * as Oni from "oni-api" + import { WindowSplitHost } from "./WindowSplitHost" import { WindowManager } from "./../../Services/WindowManager" diff --git a/browser/src/index.tsx b/browser/src/index.tsx index f1f4bdb8b6..ae60b40b19 100644 --- a/browser/src/index.tsx +++ b/browser/src/index.tsx @@ -4,8 +4,6 @@ * Entry point for the BrowserWindow process */ -/// - import { ipcRenderer, remote } from "electron" import * as minimist from "minimist" import * as Log from "./Log" diff --git a/browser/src/neovim/EventContext.ts b/browser/src/neovim/EventContext.ts new file mode 100644 index 0000000000..4f90bfff36 --- /dev/null +++ b/browser/src/neovim/EventContext.ts @@ -0,0 +1,30 @@ +/** + * EventContext + * + * This is a definition of the object that Neovim passes up + * as part of autocommands. + */ + +export interface EventContext { + bufferFullPath: string + bufferTotalLines: number + bufferNumber: number + modified: boolean + hidden: boolean + listed: boolean + version: number + line: number + /** + * Column within the buffer + */ + column: number + byte: number + filetype: string + windowNumber: number + wincol: number + winline: number + windowTopLine: number + windowBottomLine: number + windowWidth: number + windowHeight: number +} diff --git a/browser/src/neovim/NeovimAutoCommands.ts b/browser/src/neovim/NeovimAutoCommands.ts index 033abb624b..ebe5583a62 100644 --- a/browser/src/neovim/NeovimAutoCommands.ts +++ b/browser/src/neovim/NeovimAutoCommands.ts @@ -7,51 +7,52 @@ import { Event, IEvent } from "oni-types" +import { EventContext } from "./EventContext" import { NeovimInstance } from "./NeovimInstance" export interface INeovimAutoCommands { // Autocommands - onBufEnter: IEvent - onBufWinEnter: IEvent - onWinEnter: IEvent - onCursorMoved: IEvent - onCursorMovedI: IEvent - onVimResized: IEvent + onBufEnter: IEvent + onBufWinEnter: IEvent + onWinEnter: IEvent + onCursorMoved: IEvent + onCursorMovedI: IEvent + onVimResized: IEvent executeAutoCommand(autoCommand: string): Promise } export class NeovimAutoCommands { // Autocommand events - private _nameToEvent: { [key: string]: Event } - private _onBufEnterEvent = new Event() - private _onBufWinEnterEvent = new Event() - private _onWinEnterEvent = new Event() - private _onCursorMovedEvent = new Event() - private _onCursorMovedIEvent = new Event() - private _onVimResizedEvent = new Event() - - public get onBufEnter(): IEvent { + private _nameToEvent: { [key: string]: Event } + private _onBufEnterEvent = new Event() + private _onBufWinEnterEvent = new Event() + private _onWinEnterEvent = new Event() + private _onCursorMovedEvent = new Event() + private _onCursorMovedIEvent = new Event() + private _onVimResizedEvent = new Event() + + public get onBufEnter(): IEvent { return this._onBufEnterEvent } - public get onBufWinEnter(): IEvent { + public get onBufWinEnter(): IEvent { return this._onBufWinEnterEvent } - public get onWinEnter(): IEvent { + public get onWinEnter(): IEvent { return this._onWinEnterEvent } - public get onCursorMoved(): IEvent { + public get onCursorMoved(): IEvent { return this._onCursorMovedEvent } - public get onCursorMovedI(): IEvent { + public get onCursorMovedI(): IEvent { return this._onCursorMovedIEvent } - public get onVimResized(): IEvent { + public get onVimResized(): IEvent { return this._onVimResizedEvent } @@ -66,7 +67,7 @@ export class NeovimAutoCommands { } } - public notifyAutocommand(autoCommandName: string, context: Oni.EventContext): void { + public notifyAutocommand(autoCommandName: string, context: EventContext): void { const evt = this._nameToEvent[autoCommandName] diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index b5467b07df..6353539db2 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -3,9 +3,11 @@ import * as path from "path" import * as mkdirp from "mkdirp" +import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" import * as Log from "./../Log" +import { EventContext } from "./EventContext" import * as Actions from "./../actions" import { measureFont } from "./../Font" @@ -33,12 +35,12 @@ export interface INeovimApiVersion { } export interface IFullBufferUpdateEvent { - context: Oni.EventContext + context: EventContext bufferLines: string[] } export interface IIncrementalBufferUpdateEvent { - context: Oni.EventContext + context: EventContext lineNumber: number lineContents: string } @@ -79,7 +81,7 @@ export interface INeovimInstance { onRedrawComplete: IEvent - onScroll: IEvent + onScroll: IEvent // When an OniCommand is requested, ie :OniCommand("quickOpen.show") onOniCommand: IEvent @@ -161,7 +163,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { private _onRedrawComplete = new Event() private _onFullBufferUpdateEvent = new Event() private _onIncrementalBufferUpdateEvent = new Event() - private _onScroll = new Event() + private _onScroll = new Event() private _onModeChanged = new Event() private _onHidePopupMenu = new Event() private _onShowPopupMenu = new Event() @@ -206,7 +208,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this._onRedrawComplete } - public get onScroll(): IEvent { + public get onScroll(): IEvent { return this._onScroll } @@ -248,7 +250,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this._neovim.request(request, args) } - public async getContext(): Promise { + public async getContext(): Promise { return this.callFunction("OniGetContext", []) } @@ -278,7 +280,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { // TODO: Update pluginManager to subscribe from event here, instead of dupliating this if (pluginMethod === "buffer_update") { - const eventContext: Oni.EventContext = args[0][0] + const eventContext: EventContext = args[0][0] const startRange: number = args[0][1] const endRange: number = args[0][2] @@ -603,8 +605,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { }) } - private async _onFullBufferUpdate(context: Oni.EventContext, startRange: number, endRange: number): Promise { - + private async _onFullBufferUpdate(context: EventContext, startRange: number, endRange: number): Promise { if (endRange > MAX_LINES_FOR_BUFFER_UPDATE) { return } diff --git a/browser/src/neovim/NeovimWindowManager.ts b/browser/src/neovim/NeovimWindowManager.ts index a4ea907eb9..f500a04151 100644 --- a/browser/src/neovim/NeovimWindowManager.ts +++ b/browser/src/neovim/NeovimWindowManager.ts @@ -14,6 +14,7 @@ import * as isEqual from "lodash/isEqual" import * as types from "vscode-languageserver-types" +import { EventContext } from "./EventContext" import { NeovimInstance } from "./index" import * as Log from "./../Log" @@ -22,15 +23,15 @@ import * as Utility from "./../Utility" export class NeovimWindowManager { - private _scrollObservable: Subject + private _scrollObservable: Subject constructor( private _neovimInstance: NeovimInstance, ) { - this._scrollObservable = new Subject() + this._scrollObservable = new Subject() - const updateScroll = (evt: Oni.EventContext) => this._scrollObservable.next(evt) + const updateScroll = (evt: EventContext) => this._scrollObservable.next(evt) this._neovimInstance.autoCommands.onBufEnter.subscribe(updateScroll) this._neovimInstance.autoCommands.onBufWinEnter.subscribe(updateScroll) @@ -42,7 +43,7 @@ export class NeovimWindowManager { const shouldMeasure$: Observable = this._scrollObservable .auditTime(25) - .map((evt: Oni.EventContext) => ({ + .map((evt: EventContext) => ({ version: evt.version, bufferTotalLines: evt.bufferTotalLines, windowNumber: evt.windowNumber, @@ -55,7 +56,7 @@ export class NeovimWindowManager { shouldMeasure$ .withLatestFrom(this._scrollObservable) - .subscribe((args: [any, Oni.EventContext]) => { + .subscribe((args: [any, EventContext]) => { const [, evt] = args this._remeasureWindow(evt, false) @@ -80,7 +81,7 @@ export class NeovimWindowManager { // - How each buffer line maps to the screen space // // We can derive these from information coming from the event handlers, along with screen width - private async _remeasureWindow(context: Oni.EventContext, force: boolean = false): Promise { + private async _remeasureWindow(context: EventContext, force: boolean = false): Promise { const currentWin: any = await this._neovimInstance.request("nvim_get_current_win", []) const atomicCalls = [ diff --git a/browser/src/neovim/index.ts b/browser/src/neovim/index.ts index 8885d8ab36..30586f25f1 100644 --- a/browser/src/neovim/index.ts +++ b/browser/src/neovim/index.ts @@ -1,3 +1,4 @@ +export * from "./EventContext" export * from "./MsgPack" export * from "./Session" export * from "./NeovimProcessSpawner" diff --git a/browser/tsconfig.json b/browser/tsconfig.json index 5edcf153d5..d6f906421e 100644 --- a/browser/tsconfig.json +++ b/browser/tsconfig.json @@ -28,9 +28,6 @@ "target": "es2015", "sourceMap": true }, - "files": [ - "./../definitions/Oni.d.ts" - ], "include": [ "src/**/*.ts", "test/**/*.ts" diff --git a/browser/tsconfig.src.json b/browser/tsconfig.src.json index 1116834948..40f9b8a0f6 100644 --- a/browser/tsconfig.src.json +++ b/browser/tsconfig.src.json @@ -28,9 +28,6 @@ "target": "es2015", "sourceMap": true }, - "files": [ - "./../definitions/Oni.d.ts" - ], "include": [ "src/**/*.ts" ], diff --git a/definitions/Oni.d.ts b/definitions/Oni.d.ts deleted file mode 100644 index 35dc16b9bb..0000000000 --- a/definitions/Oni.d.ts +++ /dev/null @@ -1,300 +0,0 @@ -import * as ChildProcess from "child_process" -import { EventEmitter } from "events" - -import * as types from "vscode-languageserver-types" - -declare namespace Oni { - - export type DisposeFunction = () => void - - export interface IDisposable { - dispose(): void - } - - export interface IEvent { - subscribe(callback: EventCallback): IDisposable - } - - export interface EventCallback { - (val: T): void - } - - export interface IToken { - tokenName: string - range: types.Range - } - - export interface Event { - subscribe(callback: EventCallback) - } - - export interface Configuration { - onConfigurationChanged: Event - getValue(configValue: string, defaultValue?: T): T - setValues(configurationValues: { [configValue: string]: any }): void - } - - export interface Workspace { - onDirectoryChanged: Event - } - - export interface IWindowManager { - split(direction: number, split: IWindowSplit) - showDock(direction: number, split: IWindowSplit) - moveLeft(): void - moveRight(): void - moveDown(): void - moveUp(): void - close(editor: Oni.Editor) - } - - export interface IWindowSplit { - render(): JSX.Element - } - - export interface EditorManager { - allEditors: Editor - activeEditor: Editor - } - - export interface InputManager { - bind(keyChord: string | string[], actionFunction: any, filterFunction?: () => boolean) - unbind(keyChord: string | string[]) - unbindAll() - } - - export interface NeovimEditorCapability { - - // Call a VimL function and return the result - callFunction(functionName: string, args: any[]): Promise - - // Send a direct set of key inputs to Neovim - input(keys: string): Promise - - // Evaluate an expression, and return the result - eval(expression: string): Promise - - // Execute a command - command(command: string): Promise - } - - export interface Editor { - mode: string - onModeChanged: IEvent - - activeBuffer: Buffer - - openFile(file: string): Promise - - onBufferEnter: IEvent - onBufferLeave: IEvent - onBufferChanged: IEvent - onBufferSaved: IEvent - - // Optional capabilities for the editor to implement - neovim?: NeovimEditorCapability - } - - export interface EditorBufferChangedEventArgs { - buffer: Oni.Buffer - contentChanges: types.TextDocumentContentChangeEvent[] - } - - export interface Buffer { - id: string - language: string - filePath: string - cursor: Cursor - version: number - modified: boolean - - lineCount: number - - applyTextEdits(edit: types.TextEdit | types.TextEdit[]): Promise - getLines(start?: number, end?: number): Promise - getTokenAt(line: number, column: number): Promise - getSelectionRange(): Promise - - setLines(start: number, end: number, lines: string[]): Promise - setCursorPosition(line: number, column: number): Promise - } - - // Zero-based position of the cursor - // Note that in Vim, this is a 1-based position - export interface Cursor { - line: number - column: number - } - - // TODO: Remove this, replace with buffer - export interface EditorBufferEventArgs { - language: string - filePath: string - } - - export type ICommandCallback = (args?: any) => any - export type ICommandEnabledCallback = () => boolean - - export interface ICommand { - command: string - name: string - detail: string - enabled?: ICommandEnabledCallback - messageSuccess?: string - messageFail?: string - execute: ICommandCallback - } - - export interface Commands { - registerCommand(command: ICommand): void - } - - export interface Log { - verbose(msg: string): void - info(msg: string): void - - disableVerboseLogging(): void - enableVerboseLogging(): void - } - - export interface StatusBar { - getItem(globalId?: string): StatusBarItem - createItem(alignment: number, priority: number, globalId?: string): StatusBarItem - } - - export interface Process { - execNodeScript(scriptPath: string, args?: string[], options?: ChildProcess.ExecOptions, callback?: (err: any, stdout: string, stderr: string) => void): ChildProcess.ChildProcess - spawnNodeScript(scriptPath: string, args?: string[], options?: ChildProcess.SpawnOptions): ChildProcess.ChildProcess - spawnProcess(startCommand: string, args?: string[], options?: ChildProcess.SpawnOptions): ChildProcess.ChildProcess - } - - export interface StatusBarItem { - show(): void - hide(): void - setContents(element: JSX.Element): void - dispose(): void - } - - /** - * Describes the change of an entire buffer - */ - export interface BufferUpdateContext { - bufferLines: string[] - eventContext: EventContext - } - - /** - * Incremental buffer update describes the change for a particular line of a document - */ - export interface IncrementalBufferUpdateContext { - lineNumber: number - bufferLine: string - eventContext: EventContext - } - - export interface EventContext { - bufferFullPath: string - bufferTotalLines: number - bufferNumber: number - - modified: boolean - hidden: boolean - listed: boolean - version: number - line: number - - /** - * Column within the buffer - */ - column: number - byte: number - filetype: string - - windowNumber: number - wincol: number - winline: number - windowTopLine: number - windowBottomLine: number - windowWidth: number, - windowHeight: number, - } - - export namespace Vim { - export type Mode = "normal" | "visual" | "insert" - } - - export namespace Automation { - // Api surface area for automated testing - export interface Api { - sendKeys(input: string): void - waitFor(condition: () => boolean, timeout: number): Promise - - runTest(testPath: string): Promise - } - } - - export namespace Coordinates { - export interface PixelSpacePoint { - pixelX: number - pixelY: number - } - } - - export namespace ToolTip { - export enum OpenDirection { - Up = 1, - Down= 2, - } - export interface ToolTipOptions { - position?: Coordinates.PixelSpacePoint - openDirection: OpenDirection - padding?: string - onDismiss?: () => void - } - } - - export namespace Menu { - export interface MenuOption { - /** - * Optional font-awesome icon - */ - icon?: string - - label: string - detail?: string - - /** - * A pinned option is always shown first in the menu, - * before unpinned items - */ - pinned?: boolean - } - } - - export namespace Plugin { - export namespace Diagnostics { - export interface Api { - setErrors(key: string, fileName: string, errors: types.Diagnostic[]) - } - } - - export interface Api extends EventEmitter { - automation: Automation.Api - configuration: Configuration - contextMenu: any /* TODO */ - diagnostics: Diagnostics.Api - editors: EditorManager - input: InputManager - language: any /* TODO */ - log: any /* TODO */ - menu: any /* TODO */ - process: Process - statusBar: StatusBar - workspace: Workspace - } - } -} - -export = Oni -export as namespace Oni - diff --git a/package.json b/package.json index d0812a1d7e..efa6cb699a 100644 --- a/package.json +++ b/package.json @@ -119,6 +119,7 @@ "minimist": "1.2.0", "msgpack-lite": "0.1.26", "ocaml-language-server": "1.0.12", + "oni-api": "0.0.4", "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "oni-types": "0.0.4", @@ -138,8 +139,7 @@ "@types/mocha": "2.2.33", "@types/msgpack-lite": "0.1.4", "@types/node": "6.0.48", - "@types/react": "16.0.23", - "@types/react-dom": "0.14.18", + "@types/react-dom": "16.0.3", "@types/react-motion": "0.0.23", "@types/react-redux": "5.0.12", "@types/react-transition-group": "2.0.6", diff --git a/test/tsconfig.json b/test/tsconfig.json index 1a27dd9deb..cf3c3e7284 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -13,9 +13,6 @@ ], "skipLibCheck": true }, - "files": [ - "./../definitions/Oni.d.ts" - ], "include": [ "**/*.ts", "**/*.js" diff --git a/vim/core/oni-plugin-typescript/src/CodeActions.ts b/vim/core/oni-plugin-typescript/src/CodeActions.ts index c08568a1b8..a791ddd6a6 100644 --- a/vim/core/oni-plugin-typescript/src/CodeActions.ts +++ b/vim/core/oni-plugin-typescript/src/CodeActions.ts @@ -4,7 +4,6 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" @@ -12,6 +11,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { LanguageConnection } from "./LightweightLanguageClient" import { IDocumentRangeFormattingParams } from "./Types" import { TypeScriptServerHost } from "./TypeScriptServerHost" diff --git a/vim/core/oni-plugin-typescript/src/Completion.ts b/vim/core/oni-plugin-typescript/src/Completion.ts index ed129d92e8..1e0d09ae94 100644 --- a/vim/core/oni-plugin-typescript/src/Completion.ts +++ b/vim/core/oni-plugin-typescript/src/Completion.ts @@ -4,7 +4,6 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" @@ -12,6 +11,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { ITextDocumentPositionParams } from "./Types" import { TypeScriptServerHost } from "./TypeScriptServerHost" import * as Utility from "./Utility" diff --git a/vim/core/oni-plugin-typescript/src/Definition.ts b/vim/core/oni-plugin-typescript/src/Definition.ts index 24392eda0c..c088b32a5b 100644 --- a/vim/core/oni-plugin-typescript/src/Definition.ts +++ b/vim/core/oni-plugin-typescript/src/Definition.ts @@ -4,7 +4,6 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" @@ -12,6 +11,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { TypeScriptServerHost } from "./TypeScriptServerHost" export const getDefinition = (oni: Oni.Plugin.Api, host: TypeScriptServerHost) => async (protocolName: string, payload: any): Promise => { diff --git a/vim/core/oni-plugin-typescript/src/FindAllReferences.ts b/vim/core/oni-plugin-typescript/src/FindAllReferences.ts index 8f7509bcd4..a87285b570 100644 --- a/vim/core/oni-plugin-typescript/src/FindAllReferences.ts +++ b/vim/core/oni-plugin-typescript/src/FindAllReferences.ts @@ -4,7 +4,6 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" @@ -12,6 +11,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { TypeScriptServerHost } from "./TypeScriptServerHost" export const findAllReferences = (oni: Oni.Plugin.Api, host: TypeScriptServerHost) => async (message: string, payload: any): Promise => { diff --git a/vim/core/oni-plugin-typescript/src/Formatting.ts b/vim/core/oni-plugin-typescript/src/Formatting.ts index a618df5856..d8e6d66329 100644 --- a/vim/core/oni-plugin-typescript/src/Formatting.ts +++ b/vim/core/oni-plugin-typescript/src/Formatting.ts @@ -2,7 +2,6 @@ * Formatting.ts */ -/// /// import * as os from "os" @@ -10,6 +9,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { IDocumentRangeFormattingParams } from "./Types" import { TypeScriptServerHost } from "./TypeScriptServerHost" import * as Utility from "./Utility" diff --git a/vim/core/oni-plugin-typescript/src/LightweightLanguageClient.ts b/vim/core/oni-plugin-typescript/src/LightweightLanguageClient.ts index 451d9eecaf..4775be6717 100644 --- a/vim/core/oni-plugin-typescript/src/LightweightLanguageClient.ts +++ b/vim/core/oni-plugin-typescript/src/LightweightLanguageClient.ts @@ -11,6 +11,8 @@ export type ServerRequestHandler = (requestName: string, payload: any) => Promis export type ClientRequestHandler = (payload: any) => Promise export type NotificationHandler = (notificationName: string, payload: any) => void +import { Event } from "oni-types" + export class LanguageConnection { constructor(private _client: LightweightLanguageClient) { @@ -38,7 +40,7 @@ export class LanguageConnection { export class LightweightLanguageClient { - private _subscriptions: { [key: string]: Oni.Event } = { } + private _subscriptions: { [key: string]: Event } = { } // This is confusing because the requests are handled both ways... // This dictionary tracks handlers on the 'server' side @@ -77,7 +79,7 @@ export class LightweightLanguageClient { } } - public subscribe(notificationName: string, evt: Oni.Event) { + public subscribe(notificationName: string, evt: Event) { this._subscriptions[notificationName] = evt } diff --git a/vim/core/oni-plugin-typescript/src/QuickInfo.ts b/vim/core/oni-plugin-typescript/src/QuickInfo.ts index ca136c212e..a5c54a88f1 100644 --- a/vim/core/oni-plugin-typescript/src/QuickInfo.ts +++ b/vim/core/oni-plugin-typescript/src/QuickInfo.ts @@ -4,7 +4,6 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" @@ -12,6 +11,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { TypeScriptServerHost } from "./TypeScriptServerHost" export const getQuickInfo = (oni: Oni.Plugin.Api, host: TypeScriptServerHost) => async (protocolName: string, payload: any): Promise => { diff --git a/vim/core/oni-plugin-typescript/src/Rename.ts b/vim/core/oni-plugin-typescript/src/Rename.ts index dbc4fce01f..b912262b17 100644 --- a/vim/core/oni-plugin-typescript/src/Rename.ts +++ b/vim/core/oni-plugin-typescript/src/Rename.ts @@ -4,7 +4,6 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" @@ -12,6 +11,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { IRenameParams } from "./Types" import { TypeScriptServerHost } from "./TypeScriptServerHost" import * as Utility from "./Utility" diff --git a/vim/core/oni-plugin-typescript/src/SignatureHelp.ts b/vim/core/oni-plugin-typescript/src/SignatureHelp.ts index aec1d6239e..c7a046fbea 100644 --- a/vim/core/oni-plugin-typescript/src/SignatureHelp.ts +++ b/vim/core/oni-plugin-typescript/src/SignatureHelp.ts @@ -4,11 +4,12 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { getCompletions } from "./Completion" import { LightweightLanguageClient } from "./LightweightLanguageClient" import { TypeScriptServerHost } from "./TypeScriptServerHost" diff --git a/vim/core/oni-plugin-typescript/src/Symbols.ts b/vim/core/oni-plugin-typescript/src/Symbols.ts index aacd323628..dfcd4b5bd1 100644 --- a/vim/core/oni-plugin-typescript/src/Symbols.ts +++ b/vim/core/oni-plugin-typescript/src/Symbols.ts @@ -2,7 +2,6 @@ * Formatting.ts */ -/// /// import * as os from "os" @@ -10,6 +9,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import * as Oni from "oni-api" + import { ISymbolSearchParams, ITextDocumentParams } from "./Types" import { TypeScriptServerHost } from "./TypeScriptServerHost" import * as Utility from "./Utility" diff --git a/vim/core/oni-plugin-typescript/src/Types.ts b/vim/core/oni-plugin-typescript/src/Types.ts index bb324b2a56..6c5fb2d4ec 100644 --- a/vim/core/oni-plugin-typescript/src/Types.ts +++ b/vim/core/oni-plugin-typescript/src/Types.ts @@ -4,7 +4,6 @@ * Helper types */ -/// /// import * as types from "vscode-languageserver-types" diff --git a/vim/core/oni-plugin-typescript/src/index.ts b/vim/core/oni-plugin-typescript/src/index.ts index 0ed52bcbfe..7d9a188b11 100644 --- a/vim/core/oni-plugin-typescript/src/index.ts +++ b/vim/core/oni-plugin-typescript/src/index.ts @@ -4,12 +4,13 @@ * Entry point for ONI's TypeScript Language Service integraiton */ -/// /// import * as os from "os" import * as path from "path" +import * as Oni from "oni-api" + import * as types from "vscode-languageserver-types" import { executeCommand, getCodeActions } from "./CodeActions" diff --git a/vim/core/oni-plugin-typescript/tsconfig.json b/vim/core/oni-plugin-typescript/tsconfig.json index 4cbbe7ac73..73e33f18bb 100644 --- a/vim/core/oni-plugin-typescript/tsconfig.json +++ b/vim/core/oni-plugin-typescript/tsconfig.json @@ -7,9 +7,6 @@ "sourceMap": true, "target": "ES5" }, - "files": [ - "./../../../definitions/Oni.d.ts" - ], "include": [ "src/**/*.ts" ], diff --git a/vim/core/oni-plugin-typescript/tsconfig.test.json b/vim/core/oni-plugin-typescript/tsconfig.test.json index 2a7bf62331..e7ba5da546 100644 --- a/vim/core/oni-plugin-typescript/tsconfig.test.json +++ b/vim/core/oni-plugin-typescript/tsconfig.test.json @@ -7,9 +7,6 @@ "sourceMap": true, "target": "ES5" }, - "files": [ - "./../../../definitions/Oni.d.ts" - ], "include": [ "test/**/*.ts", "src/**/*.ts" diff --git a/yarn.lock b/yarn.lock index 3ccb85a62a..abb85fbeaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -81,17 +81,18 @@ "@types/node" "*" "@types/node@*", "@types/node@^8.0.24": - version "8.0.52" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.52.tgz#8e7f47747868e7687f2cd4922966e2d6af78d22d" + version "8.0.53" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.53.tgz#396b35af826fa66aad472c8cb7b8d5e277f4e6d8" "@types/node@6.0.48": version "6.0.48" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.48.tgz#86ccc15f66b73cbbc5eb3483398936c585122b3c" -"@types/react-dom@0.14.18": - version "0.14.18" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-0.14.18.tgz#af4fb4092f433667f5f094e762b32c294e0010dc" +"@types/react-dom@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64" dependencies: + "@types/node" "*" "@types/react" "*" "@types/react-motion@0.0.23": @@ -113,9 +114,9 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@16.0.23": - version "16.0.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.23.tgz#f0f713b07912c6fd8e10c9ccc539443ceb06dbca" +"@types/react@*": + version "16.0.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.25.tgz#bf696b83fe480c5e0eff4335ee39ebc95884a1ed" "@types/sinon@1.16.32": version "1.16.32" @@ -176,8 +177,8 @@ ajv@^4.9.1: json-stable-stringify "^1.0.1" ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.2, ajv@^5.2.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" + version "5.4.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -777,8 +778,8 @@ big.js@^3.1.3: resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" bl@^1.0.0: version "1.2.1" @@ -792,7 +793,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird-lst@^1.0.2, bluebird-lst@^1.0.3, bluebird-lst@^1.0.4: +bluebird-lst@^1.0.2, bluebird-lst@^1.0.3, bluebird-lst@^1.0.4, bluebird-lst@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9" dependencies: @@ -1067,8 +1068,8 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000515, caniuse-db@^1.0.30000525, caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000764" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000764.tgz#d73ab11ae62f6a9e2f69867d6d9c23ae3f2e5d8d" + version "1.0.30000769" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000769.tgz#c230b9c1b9e8db3e1c0d858c96e685741b96cc10" capture-stack-trace@^1.0.0: version "1.0.0" @@ -1117,6 +1118,10 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chardet@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.0.tgz#0bbe1355ac44d7a3ed4a925707c4ef70f8190f6c" + chokidar@^1.6.0, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1137,8 +1142,8 @@ chromium-pickle-js@^0.2.0: resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" ci-info@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" + version "1.1.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -2271,11 +2276,11 @@ extend@~3.0.0, extend@~3.0.1: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" external-editor@^2.0.1, external-editor@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" dependencies: + chardet "^0.4.0" iconv-lite "^0.4.17" - jschardet "^1.4.2" tmp "^0.0.33" extglob@^0.3.1: @@ -2600,8 +2605,8 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: path-is-absolute "^1.0.0" global-dirs@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" dependencies: ini "^1.3.4" @@ -3224,10 +3229,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jschardet@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" - jsdom@11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.0.0.tgz#1ee507cb2c0b16c875002476b1a8557d951353e5" @@ -3777,8 +3778,8 @@ multicast-dns-service-types@^1.1.0: resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" multicast-dns@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" + version "6.2.0" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.0.tgz#13f22d0c32dc5ee82a32878e3c380d875b3eab22" dependencies: dns-packet "^1.0.1" thunky "^0.1.0" @@ -4031,6 +4032,10 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +oni-api@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.4.tgz#9e2c4a5f6a42cc6f511faac93a0c912b65c7f544" + oni-neovim-binaries@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/oni-neovim-binaries/-/oni-neovim-binaries-0.1.0.tgz#3852b654b2db8aa53e72c053163ade50eb80ee5b" @@ -5728,12 +5733,12 @@ tar@^2.0.0, tar@^2.2.1: inherits "2" temp-file@^2.0.2, temp-file@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.0.3.tgz#0de2540629fc77a6406ca56f50214d1f224947ac" + version "2.1.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.1.0.tgz#e88851886d9cae17152bd71bb929189fa8b5bcf8" dependencies: async-exit-hook "^2.0.1" - bluebird-lst "^1.0.3" - fs-extra-p "^4.4.0" + bluebird-lst "^1.0.5" + fs-extra-p "^4.4.4" lazy-val "^1.0.2" term-size@^1.2.0: @@ -6170,8 +6175,8 @@ webdriverio@4.8.0: wgxpath "~1.0.0" webdriverio@^4.0.4: - version "4.9.8" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.9.8.tgz#907180e715d3b9e16cabe20bad59854bec1e44fa" + version "4.9.9" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.9.9.tgz#695de325166528e162d5b6d29a7f2c18aafdd3aa" dependencies: archiver "~2.1.0" babel-runtime "^6.26.0" From d64357dfc994e4de29428a7481ffd4b9e2e41442 Mon Sep 17 00:00:00 2001 From: Ryan C Date: Tue, 21 Nov 2017 22:37:12 +0000 Subject: [PATCH 24/63] Add native tab option (#992) * Add the option for Native vim tabs. Either set "tabs.enabled": to false, or "tabs.showVimTabs" to native. * Fix logic. * Swap config option to "tabs.mode". * Only set ext_tabline to false if the user is in native mode. * Add "hidden" option, remove "tabs.enabled" option. --- .../Services/Configuration/DefaultConfiguration.ts | 3 +-- .../Services/Configuration/IConfigurationValues.ts | 3 +-- browser/src/UI/components/Tabs.tsx | 6 ++++-- browser/src/neovim/NeovimInstance.ts | 14 +++++++++++--- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index ca5eee4f37..066d0eddfd 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -129,8 +129,7 @@ const BaseConfiguration: IConfigurationValues = { "statusbar.enabled": true, "statusbar.fontSize": "0.9em", - "tabs.enabled": true, - "tabs.showVimTabs": false, + "tabs.mode": "buffers", "tabs.height": "2.5em", "tabs.maxWidth": "30em", "tabs.wrap": false, diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index b7d14da153..0976bd5f5d 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -153,8 +153,7 @@ export interface IConfigurationValues { "statusbar.enabled": boolean "statusbar.fontSize": string - "tabs.enabled": boolean - "tabs.showVimTabs": boolean + "tabs.mode": string // Height of individual tabs in the tab strip "tabs.height": string diff --git a/browser/src/UI/components/Tabs.tsx b/browser/src/UI/components/Tabs.tsx index 89f7c44fff..0f4b3c812b 100644 --- a/browser/src/UI/components/Tabs.tsx +++ b/browser/src/UI/components/Tabs.tsx @@ -179,10 +179,12 @@ const getTabsFromVimTabs = createSelector( const mapStateToProps = (state: State.IState, ownProps: ITabContainerProps): ITabsProps => { - const shouldUseVimTabs = state.configuration["tabs.showVimTabs"] + const oniTabMode = state.configuration["tabs.mode"] + const shouldUseVimTabs = oniTabMode === "tabs" + const tabs = shouldUseVimTabs ? getTabsFromVimTabs(state) : getTabsFromBuffers(state) - const visible = state.configuration["tabs.enabled"] + const visible = oniTabMode !== "native" && oniTabMode !== "hidden" const height = state.configuration["tabs.height"] const maxWidth = state.configuration["tabs.maxWidth"] diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 6353539db2..69c75709ed 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -630,19 +630,27 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { private async _attachUI(columns: number, rows: number): Promise { const version = await this.getApiVersion() + + const useNativeTabs = configuration.getValue("tabs.mode") === "native" + + const externaliseTabline = !useNativeTabs + console.log(`Neovim version reported as ${version.major}.${version.minor}.${version.patch}`) // tslint:disable-line no-console - const startupOptions = this._getStartupOptionsForVersion(version.major, version.minor, version.patch) + const startupOptions = this._getStartupOptionsForVersion(version.major, + version.minor, + version.patch, + externaliseTabline) await this._neovim.request("nvim_ui_attach", [columns, rows, startupOptions]) } - private _getStartupOptionsForVersion(major: number, minor: number, patch: number) { + private _getStartupOptionsForVersion(major: number, minor: number, patch: number, shouldExtTabs: boolean) { if (major >= 0 && minor >= 2 && patch >= 1) { return { rgb: true, popupmenu_external: true, - ext_tabline: true, + ext_tabline: shouldExtTabs, } } else if (major === 0 && minor === 2) { // 0.1 and below does not support external tabline From 7de583bc8f419e09023ac59b3ec519c61c07fdf0 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Tue, 21 Nov 2017 16:29:31 -0800 Subject: [PATCH 25/63] Remove outdated examples (#999) --- examples/oni-plugin-default-language/index.js | 67 ------------------- .../oni-plugin-default-language/package.json | 22 ------ 2 files changed, 89 deletions(-) delete mode 100644 examples/oni-plugin-default-language/index.js delete mode 100644 examples/oni-plugin-default-language/package.json diff --git a/examples/oni-plugin-default-language/index.js b/examples/oni-plugin-default-language/index.js deleted file mode 100644 index 157de020c9..0000000000 --- a/examples/oni-plugin-default-language/index.js +++ /dev/null @@ -1,67 +0,0 @@ - -var os = require("os") - -var currentWords = [] -var lastBuffer = [] - -const activate = (Oni) => { - Oni.on("buffer-update", (args) => { - const fullText = args.bufferLines.join(os.EOL) - const words = fullText.split(/\W+/) - - lastBuffer = args.bufferLines - - currentWords = Object.keys(words.reduce((prev, cur) => { - prev[cur] = cur - return prev - }, {})) - .filter(w => w.length >= 3) - }) - - const getCompletions = (textDocumentPosition) => { - if (textDocumentPosition.column <= 1) - return Promise.resolve({ - completions: [] - }) - - let currentLine = lastBuffer[textDocumentPosition.line - 1]; - let col = textDocumentPosition.column - 2 - let currentPrefix = ""; - - while (col >= 0) { - const currentCharacter = currentLine[col] - - if (!currentCharacter.match(/[_a-z]/i)) - break - - currentPrefix = currentCharacter + currentPrefix - col-- - } - - const basePos = col; - - if (currentPrefix.length < 1) - return Promise.resolve({ - base: currentPrefix, - completions: [] - }) - - - return Promise.resolve({ - base: currentPrefix, - completions: currentWords.filter(w => w.indexOf(currentPrefix) === 0).map(w => ({ - label: w, - kind: "text" - })) - }) - } - - Oni.registerLanguageService({ - getCompletions: getCompletions - }) - -} - -module.exports = { - activate -} diff --git a/examples/oni-plugin-default-language/package.json b/examples/oni-plugin-default-language/package.json deleted file mode 100644 index ff76055e08..0000000000 --- a/examples/oni-plugin-default-language/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "main": "index.js", - "engines": { - "oni": "^0.0.1" - }, - "scripts": { - }, - "oni": { - "@@DEFAULT_LANGUAGE_PROTOTYPE": { - "subscriptions": [ - "buffer-update", - "vim-events" - ], - "languageService": [ - "completion-provider" - ], - "diagnosticsService": [] - } - }, - "dependencies": { - } -} From c887399ca92207bc85664f915365d083da778386 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 22 Nov 2017 12:29:31 -0800 Subject: [PATCH 26/63] Upgrade TypeScript to 2.6.1 (#887) * Bump typescript dependency * Remove usage of InstallHelp, because it is unused right now * Remove some unused values flagged by TS * Remove some unused values * Remove unused scrollcmdX * Remove unused end variable * Implement stubs for dispose * Fix remaining compilation issues * Fix lint issues --- browser/src/Editor/NeovimEditor.tsx | 11 +++++++++-- browser/src/Editor/NeovimPopupMenu.tsx | 5 +++++ browser/src/Grid.ts | 3 --- browser/src/Input/Mouse.ts | 2 -- browser/src/Plugins/PluginManager.ts | 8 ++++++-- browser/src/Services/EditorManager.ts | 4 ++++ browser/src/Services/QuickOpen/FinderProcess.ts | 2 -- browser/src/Services/Tasks.ts | 7 ------- browser/src/Services/TypingPredictionManager.ts | 2 -- browser/src/Services/WindowManager.ts | 6 +++--- browser/src/UI/components/TypingPredictions.tsx | 5 +++-- browser/src/neovim/NeovimWindowManager.ts | 4 ++++ package.json | 2 +- vim/core/oni-plugin-typescript/src/Utility.ts | 6 ++++-- yarn.lock | 6 +++--- 15 files changed, 42 insertions(+), 31 deletions(-) diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 9b067fc73b..a96f5f7b3a 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -276,6 +276,15 @@ export class NeovimEditor implements IEditor { } } + public dispose(): void { + // TODO: Implement full disposal logic + this._popupMenu.dispose() + this._popupMenu = null + + this._windowManager.dispose() + this._windowManager = null + } + public async openFile(file: string): Promise { await this._neovimInstance.command(":e " + file) return this.activeBuffer @@ -349,8 +358,6 @@ export class NeovimEditor implements IEditor { private _onVimEvent(eventName: string, evt: EventContext): void { UI.Actions.setWindowCursor(evt.windowNumber, evt.line - 1, evt.column - 1) - tasks.onEvent(evt) - const lastBuffer = this.activeBuffer const buf = this._bufferManager.updateBufferFromEvent(evt) diff --git a/browser/src/Editor/NeovimPopupMenu.tsx b/browser/src/Editor/NeovimPopupMenu.tsx index 5b903c5daf..3ba8340f9e 100644 --- a/browser/src/Editor/NeovimPopupMenu.tsx +++ b/browser/src/Editor/NeovimPopupMenu.tsx @@ -46,6 +46,11 @@ export class NeovimPopupMenu { }) } + public dispose(): void { + // TODO: Implement 'unsubscribe' logic here + // tslint:disable-line + } + private _renderCompletionMenu(selectedIndex: number): void { let itemsToRender: IContextMenuItem[] = [] let adjustedIndex = selectedIndex diff --git a/browser/src/Grid.ts b/browser/src/Grid.ts index f04a2aa48e..a106230eea 100644 --- a/browser/src/Grid.ts +++ b/browser/src/Grid.ts @@ -55,16 +55,13 @@ export class Grid { let dir: any let start: any - let end: any if (rowsToShift >= 0) { dir = 1 start = 0 - end = this._height } else { dir = -1 start = this._height - 1 - end = 0 } let current = start diff --git a/browser/src/Input/Mouse.ts b/browser/src/Input/Mouse.ts index 1886f0efd0..b04124b8ec 100644 --- a/browser/src/Input/Mouse.ts +++ b/browser/src/Input/Mouse.ts @@ -41,10 +41,8 @@ export class Mouse extends EventEmitter { this._editorElement.addEventListener("wheel", (evt: WheelEvent) => { const { line, column } = this._convertEventToPosition(evt) let scrollcmdY = `<` - let scrollcmdX = `<` if (evt.ctrlKey || evt.shiftKey) { scrollcmdY += `C-` // The S- and C- prefixes have the same effect - scrollcmdX += `C-` } // This is 'less than' because I made this on a mac to behave just like diff --git a/browser/src/Plugins/PluginManager.ts b/browser/src/Plugins/PluginManager.ts index 947db7ea33..80851d7f7e 100644 --- a/browser/src/Plugins/PluginManager.ts +++ b/browser/src/Plugins/PluginManager.ts @@ -18,6 +18,10 @@ export class PluginManager extends EventEmitter { private _plugins: Plugin[] = [] private _anonymousPlugin: AnonymousPlugin + public get plugins(): Plugin[] { + return this._plugins + } + constructor() { super() @@ -32,8 +36,8 @@ export class PluginManager extends EventEmitter { } public startPlugins(): Oni.Plugin.Api { - const allPlugins = this._getAllPluginPaths() - this._plugins = allPlugins.map((pluginRootDirectory) => this._createPlugin(pluginRootDirectory)) + const allPluginPaths = this._getAllPluginPaths() + this._plugins = allPluginPaths.map((pluginRootDirectory) => this._createPlugin(pluginRootDirectory)) this._anonymousPlugin = new AnonymousPlugin() diff --git a/browser/src/Services/EditorManager.ts b/browser/src/Services/EditorManager.ts index bab32025db..765c5b4f0e 100644 --- a/browser/src/Services/EditorManager.ts +++ b/browser/src/Services/EditorManager.ts @@ -123,6 +123,10 @@ class AllEditors implements Oni.Editor { return this._onBufferSaved } + public dispose(): void { + // tslint:disable-line + } + /** * Internal methods */ diff --git a/browser/src/Services/QuickOpen/FinderProcess.ts b/browser/src/Services/QuickOpen/FinderProcess.ts index bc2ea0d09d..e1f815fa18 100644 --- a/browser/src/Services/QuickOpen/FinderProcess.ts +++ b/browser/src/Services/QuickOpen/FinderProcess.ts @@ -12,7 +12,6 @@ export class FinderProcess { private _process: ChildProcess - private _isExplicitlyStopped: boolean = false private _lastData: string = "" private _onData = new Event() @@ -68,7 +67,6 @@ export class FinderProcess { } public stop(): void { - this._isExplicitlyStopped = true this._process.kill() } } diff --git a/browser/src/Services/Tasks.ts b/browser/src/Services/Tasks.ts index 3dbee0d817..41bf12f099 100644 --- a/browser/src/Services/Tasks.ts +++ b/browser/src/Services/Tasks.ts @@ -16,8 +16,6 @@ import * as flatten from "lodash/flatten" import * as Oni from "oni-api" -import { EventContext } from "./../neovim" - import { Menu, menuManager } from "./../Services/Menu" export interface ITask { @@ -35,7 +33,6 @@ export interface ITaskProvider { export class Tasks extends EventEmitter { private _lastTasks: ITask[] = [] - private _currentBufferPath: string private _menu: Menu @@ -48,10 +45,6 @@ export class Tasks extends EventEmitter { this._providers.push(taskProvider) } - public onEvent(event: EventContext): void { - this._currentBufferPath = event.bufferFullPath - } - public show(): void { this._refreshTasks().then(() => { const options: Oni.Menu.MenuOption[] = this._lastTasks diff --git a/browser/src/Services/TypingPredictionManager.ts b/browser/src/Services/TypingPredictionManager.ts index c3137e6cf0..83dcc48fb7 100644 --- a/browser/src/Services/TypingPredictionManager.ts +++ b/browser/src/Services/TypingPredictionManager.ts @@ -17,7 +17,6 @@ export class TypingPredictionManager { private _predictionsChanged: Event = new Event() private _predictions: IPredictedCharacter[] = [] - private _completedPredictions: TypingPredictionId[] = [] private _enabled: boolean = false private _line: number = null @@ -84,7 +83,6 @@ export class TypingPredictionManager { public clearAllPredictions(): void { this._predictions = [] - this._completedPredictions = [] this._notifyPredictionsChanged() } diff --git a/browser/src/Services/WindowManager.ts b/browser/src/Services/WindowManager.ts index bbe59310d0..432d12a1f3 100644 --- a/browser/src/Services/WindowManager.ts +++ b/browser/src/Services/WindowManager.ts @@ -11,10 +11,10 @@ import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" -import { applySplit, closeSplit, createSplitLeaf, createSplitRoot, ISplitInfo, ISplitLeaf, SplitDirection } from "./WindowSplit" +import { applySplit, closeSplit, createSplitLeaf, createSplitRoot, ISplitInfo, SplitDirection } from "./WindowSplit" export class WindowManager { - private _activeSplit: ISplitLeaf + // private _activeSplit: ISplitLeaf private _splitRoot: ISplitInfo private _onSplitChanged = new Event>() @@ -29,7 +29,7 @@ export class WindowManager { constructor() { this._splitRoot = createSplitRoot(SplitDirection.Horizontal) - this._activeSplit = null + // this._activeSplit = null } public split(direction: SplitDirection, newSplit: Oni.IWindowSplit) { diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx index 35fce9fef4..7e8af31b8f 100644 --- a/browser/src/UI/components/TypingPredictions.tsx +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -36,10 +36,11 @@ export interface ITypingPredictionViewState { predictions: IPredictedCharacter[] } +const noop = (val?: any): void => { } // tslint:disable-line + class TypingPredictionView extends React.PureComponent { private _containerElement: HTMLElement - private _lastWidth: number private _subscription: IDisposable private _predictedElements: { [id: number]: HTMLElement } = {} @@ -78,7 +79,7 @@ class TypingPredictionView extends React.PureComponent { const newContext = await this._neovimInstance.getContext() this._scrollObservable.next(newContext) diff --git a/package.json b/package.json index efa6cb699a..a128712db4 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "oni-types": "0.0.4", - "typescript": "2.5.3", + "typescript": "2.6.1", "vscode-jsonrpc": "3.5.0", "vscode-languageserver": "3.5.0", "vscode-languageserver-types": "3.5.0" diff --git a/vim/core/oni-plugin-typescript/src/Utility.ts b/vim/core/oni-plugin-typescript/src/Utility.ts index d3560ef97c..1cf4e35df5 100644 --- a/vim/core/oni-plugin-typescript/src/Utility.ts +++ b/vim/core/oni-plugin-typescript/src/Utility.ts @@ -6,6 +6,8 @@ import * as path from "path" import * as types from "vscode-languageserver-types" +import { CodeEdit, TextSpan } from "typescript/lib/protocol" // tslint:disable-line + import { IDisplayPart } from "./Types" export const zeroBasedPositionToOneBasedPosition = (zeroBasedPosition: types.Position) => ({ @@ -19,7 +21,7 @@ export const getLanguageFromFileName = (fileName: string) => { return language } -export const convertCodeEditToTextEdit = (codeEdit: protocol.CodeEdit): types.TextEdit => { +export const convertCodeEditToTextEdit = (codeEdit: CodeEdit): types.TextEdit => { const range = types.Range.create(codeEdit.start.line - 1, codeEdit.start.offset - 1, codeEdit.end.line - 1, codeEdit.end.offset - 1) const newText = codeEdit.newText @@ -74,7 +76,7 @@ export const convertTypeScriptKindToSymbolKind = (kind: string): types.SymbolKin } } -export const convertTextSpanToRange = (span: protocol.TextSpan): types.Range => { +export const convertTextSpanToRange = (span: TextSpan): types.Range => { return types.Range.create(span.start.line - 1, span.start.offset - 1, span.end.line - 1, span.end.offset - 1) } diff --git a/yarn.lock b/yarn.lock index abb85fbeaa..12aee46156 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5887,9 +5887,9 @@ typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" +typescript@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.1.tgz#ef39cdea27abac0b500242d6726ab90e0c846631" ua-parser-js@^0.7.9: version "0.7.17" From 70728b597503173e18576d74ca455a8326f9d766 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 22 Nov 2017 16:25:17 -0800 Subject: [PATCH 27/63] Fix a few language server regressions after upgrading to TypeScript 2.6 (#1003) * Fix a few regressions from TypeScript 2.6 * Downgrade stderr output to warning, as it is not truly an error * Fix spacing issue --- .../oni-plugin-typescript/src/Definition.ts | 4 +++ .../src/TypeScriptServerHost.ts | 25 +++++++++++++++---- vim/core/oni-plugin-typescript/src/index.ts | 5 ++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/vim/core/oni-plugin-typescript/src/Definition.ts b/vim/core/oni-plugin-typescript/src/Definition.ts index c088b32a5b..d72437b69d 100644 --- a/vim/core/oni-plugin-typescript/src/Definition.ts +++ b/vim/core/oni-plugin-typescript/src/Definition.ts @@ -25,6 +25,10 @@ export const getDefinition = (oni: Oni.Plugin.Api, host: TypeScriptServerHost) = const resultPos = val[0] + if (!resultPos) { + return null + } + const range = types.Range.create(resultPos.start.line - 1, resultPos.start.offset - 1, resultPos.end.line - 1, resultPos.end.offset - 1) return { diff --git a/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts b/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts index ecdc665da2..620881e4c7 100644 --- a/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts +++ b/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts @@ -20,6 +20,8 @@ export class TypeScriptServerHost extends events.EventEmitter { private _seqToPromises = {} private _rl: any + private _openedFiles: string[] = [] + public get pid(): number { return this._tssProcess.pid } @@ -49,7 +51,7 @@ export class TypeScriptServerHost extends events.EventEmitter { }) this._tssProcess.stderr.on("data", (data, err) => { - console.error("Error from tss: " + data) // tslint:disable-line no-console + console.warn("Error from tss: " + data) // tslint:disable-line no-console }) this._tssProcess.on("error", (data) => { @@ -71,9 +73,17 @@ export class TypeScriptServerHost extends events.EventEmitter { }) } - public openFile(file: string): Promise { + public async openFile(file: string, text?: string): Promise { + + if (this._openedFiles.indexOf(file) >= 0) { + return + } + + this._openedFiles.push(file) + return this._makeTssRequest("open", { file, + fileContent: text, }) } @@ -141,10 +151,15 @@ export class TypeScriptServerHost extends events.EventEmitter { endOffset}) } - public updateFile(file: string, fileContent: string): Promise { - return this._makeTssRequest("open", { + public updateFile(file: string, fileContent: string): Promise { + const totalLines = fileContent.split(os.EOL) + return this._makeTssRequest("change", { file, - fileContent, + line: 1, + offset: 1, + endLine: totalLines.length + 1, + endOffset: 1, + insertString: fileContent, }) } diff --git a/vim/core/oni-plugin-typescript/src/index.ts b/vim/core/oni-plugin-typescript/src/index.ts index 7d9a188b11..b662b9545e 100644 --- a/vim/core/oni-plugin-typescript/src/index.ts +++ b/vim/core/oni-plugin-typescript/src/index.ts @@ -66,9 +66,10 @@ export const activate = (oni: Oni.Plugin.Api) => { }) const protocolOpenFile = (message: string, payload: any) => { - const textDocument: types.TextDocumentIdentifier = payload.textDocument + const textDocument: any = payload.textDocument const filePath = oni.language.unwrapFileUriPath(textDocument.uri) - host.openFile(filePath) + + host.openFile(filePath, textDocument.text) } const isSingleLineChange = (range: types.Range): boolean => { From d94397e5ad058410133c55a98e34ce90eae7d077 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 22 Nov 2017 18:04:01 -0800 Subject: [PATCH 28/63] Add backspace command (#1004) --- browser/src/Services/AutoClosingPairs.ts | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/browser/src/Services/AutoClosingPairs.ts b/browser/src/Services/AutoClosingPairs.ts index dc9914e129..6993682272 100644 --- a/browser/src/Services/AutoClosingPairs.ts +++ b/browser/src/Services/AutoClosingPairs.ts @@ -47,6 +47,39 @@ export const activate = (configuration: Configuration, editorManager: EditorMana return true } + const handleBackspaceCharacter = (pairs: IAutoClosingPair[], editor: Oni.Editor) => () => { + queue.enqueuePromise(async () => { + const activeBuffer = editor.activeBuffer + const lines = await activeBuffer.getLines(activeBuffer.cursor.line, activeBuffer.cursor.line + 1) + const line = lines[0] + const neovim = editor.neovim + + const { column } = activeBuffer.cursor + + const matchingPair = pairs.find((p) => { + return column >= 1 + && line[column] === p.close + && line[column - 1] === p.open + }) + + if (matchingPair) { + // Remove the pairs + const beforePair = line.substring(0, column - 1) + const afterPair = line.substring(column + 1, line.length) + + const pos = await neovim.callFunction("getpos", ["."]) + const [, oneBasedLine, oneBasedColumn] = pos + await editor.activeBuffer.setCursorPosition(oneBasedLine - 1, oneBasedColumn - 2) + + await activeBuffer.setLines(activeBuffer.cursor.line, activeBuffer.cursor.line + 1, [beforePair + afterPair]) + } else { + await neovim.input("") + } + }) + + return true + } + const handleCloseCharacter = (pair: IAutoClosingPair, editor: Oni.Editor) => () => { queue.enqueuePromise(async () => { @@ -83,6 +116,8 @@ export const activate = (configuration: Configuration, editorManager: EditorMana subscriptions.push(inputManager.bind(pair.close, handleCloseCharacter(pair, editorManager.activeEditor), insertModeFilter)) }) + subscriptions.push(inputManager.bind("", handleBackspaceCharacter(autoClosingPairs, editorManager.activeEditor), insertModeFilter)) + }) } From 759aa621c202d7769bf9ebc5ee1ec5b8f370aa2c Mon Sep 17 00:00:00 2001 From: Akin Date: Sat, 25 Nov 2017 00:18:12 +0000 Subject: [PATCH 29/63] * fix user-selection issue for buffer bar (#1013) - using user-select: none * added keys to WindowSplits (as the react keys error is Super distracting for me :worried:) --- browser/src/UI/components/Tabs.less | 1 + browser/src/UI/components/WindowSplits.tsx | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/browser/src/UI/components/Tabs.less b/browser/src/UI/components/Tabs.less index 72d988408c..e991c4cef8 100644 --- a/browser/src/UI/components/Tabs.less +++ b/browser/src/UI/components/Tabs.less @@ -54,6 +54,7 @@ overflow: hidden; text-overflow: ellipsis; + user-select: none; .name { flex: 1 1 auto; diff --git a/browser/src/UI/components/WindowSplits.tsx b/browser/src/UI/components/WindowSplits.tsx index 40621a40d6..3674b8fe05 100644 --- a/browser/src/UI/components/WindowSplits.tsx +++ b/browser/src/UI/components/WindowSplits.tsx @@ -51,16 +51,16 @@ export class WindowSplits extends React.PureComponent { + const editors = this.state.splitRoot.splits.map((splitNode, i) => { if (splitNode.type === "Split") { return null } else { const split: Oni.IWindowSplit = splitNode.contents if (!split) { - return
TODO: Implement an editor here...
+ return
TODO: Implement an editor here...
} else { - return + return } } }) From 5f7e8a6f75d011466ffa78889f487c5efe3cc0bc Mon Sep 17 00:00:00 2001 From: Akin Date: Sat, 25 Nov 2017 16:01:10 +0000 Subject: [PATCH 30/63] add overflow-x: hidden to tabs.less (#1017) --- browser/src/UI/components/Tabs.less | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/src/UI/components/Tabs.less b/browser/src/UI/components/Tabs.less index e991c4cef8..e1b34525bc 100644 --- a/browser/src/UI/components/Tabs.less +++ b/browser/src/UI/components/Tabs.less @@ -29,6 +29,7 @@ width: 100%; color: #c8c8c8; background-color: rgba(0, 0, 0, 0.2); + overflow-x: hidden; &:hover { overflow-x: overlay; From 6c5f054a5f028c88aa35ab275ff8110573948a88 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Sat, 25 Nov 2017 08:20:44 -0800 Subject: [PATCH 31/63] Performance: Batch redux notifications (#1011) * Improve react+redux render performance by batching re-renders to a requestAnimationFrame * Fix lint issue * Update predictions to instantly apply predicted cursor position, as opposed to waiting for the 'batched subscribe' invocation * Fix lint issue --- PLAN.md | 2 ++ browser/src/Services/TypingPredictionManager.ts | 14 +++++++++++--- browser/src/UI/components/Cursor.tsx | 12 ++++++++---- browser/src/UI/components/TypingPredictions.tsx | 15 +++++++-------- browser/src/UI/index.tsx | 16 ++++++++++++++++ package.json | 2 ++ yarn.lock | 12 +++++++++++- 7 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 PLAN.md diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000000..9d2f28f3b0 --- /dev/null +++ b/PLAN.md @@ -0,0 +1,2 @@ +- How does this work with typing predictions? Seems like there may be artifacts that weren't present before +- Any regressions? diff --git a/browser/src/Services/TypingPredictionManager.ts b/browser/src/Services/TypingPredictionManager.ts index 83dcc48fb7..431965ffa8 100644 --- a/browser/src/Services/TypingPredictionManager.ts +++ b/browser/src/Services/TypingPredictionManager.ts @@ -13,16 +13,21 @@ export interface IPredictedCharacter { id: number } +export interface ITypingPrediction { + predictedCharacters: IPredictedCharacter[] + predictedCursorColumn: number +} + export class TypingPredictionManager { - private _predictionsChanged: Event = new Event() + private _predictionsChanged: Event = new Event() private _predictions: IPredictedCharacter[] = [] private _enabled: boolean = false private _line: number = null private _column: number = null - public get onPredictionsChanged(): IEvent { + public get onPredictionsChanged(): IEvent { return this._predictionsChanged } @@ -88,6 +93,9 @@ export class TypingPredictionManager { } private _notifyPredictionsChanged(): void { - this._predictionsChanged.dispatch(this._predictions) + this._predictionsChanged.dispatch({ + predictedCharacters: this._predictions, + predictedCursorColumn: this._column + this._predictions.length, + }) } } diff --git a/browser/src/UI/components/Cursor.tsx b/browser/src/UI/components/Cursor.tsx index 1a61f7616a..06ed3f722e 100644 --- a/browser/src/UI/components/Cursor.tsx +++ b/browser/src/UI/components/Cursor.tsx @@ -29,7 +29,7 @@ export interface ICursorRendererProps { require("./Cursor.less") // tslint:disable-line no-var-requires export interface ICursorRendererState { - predictedCharacters: number + predictedCursorColumn: number } class CursorRenderer extends React.PureComponent { @@ -38,14 +38,14 @@ class CursorRenderer extends React.PureComponent { this.setState({ - predictedCharacters: predictions.length, + predictedCursorColumn: predictions.predictedCursorColumn, }) }) } @@ -60,10 +60,14 @@ class CursorRenderer extends React.PureComponent= 0 ? + this.state.predictedCursorColumn * this.props.fontPixelWidth : + this.props.x + const containerStyle: React.CSSProperties = { visibility: this.props.visible ? "visible" : "hidden", position: "absolute", - left: (this.props.x + this.state.predictedCharacters * this.props.fontPixelWidth).toString() + "px", + left: position.toString() + "px", top: this.props.y.toString() + "px", width: width.toString() + "px", height, diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx index 7e8af31b8f..78dd2658d8 100644 --- a/browser/src/UI/components/TypingPredictions.tsx +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -12,7 +12,7 @@ import { connect } from "react-redux" import * as State from "./../State" -import { IPredictedCharacter, TypingPredictionManager } from "./../../Services/TypingPredictionManager" +import { ITypingPrediction, TypingPredictionManager } from "./../../Services/TypingPredictionManager" export interface ITypingPredictionProps { typingPrediction: TypingPredictionManager @@ -32,13 +32,9 @@ export interface ITypingPredictionViewProps { highlightPredictions: boolean } -export interface ITypingPredictionViewState { - predictions: IPredictedCharacter[] -} - const noop = (val?: any): void => { } // tslint:disable-line -class TypingPredictionView extends React.PureComponent { +class TypingPredictionView extends React.PureComponent { private _containerElement: HTMLElement private _subscription: IDisposable @@ -46,7 +42,7 @@ class TypingPredictionView extends React.PureComponent { + this._subscription = this.props.typingPrediction.onPredictionsChanged.subscribe((prediction: ITypingPrediction) => { if (!this._containerElement) { return @@ -54,13 +50,16 @@ class TypingPredictionView extends React.PureComponent { const elem = document.createElement("div") elem.className = "predicted-text" elem.style.position = "absolute" elem.style.top = this.props.y.toString() + "px" - elem.style.left = (this.props.startX + idx * this.props.width).toString() + "px" + elem.style.left = (startX + idx * this.props.width).toString() + "px" elem.style.width = (this.props.width.toString()) + "px" elem.style.height = (this.props.height.toString()) + "px" elem.style.lineHeight = this.props.height.toString() + "px" diff --git a/browser/src/UI/index.tsx b/browser/src/UI/index.tsx index 02e59046eb..0105288b6a 100644 --- a/browser/src/UI/index.tsx +++ b/browser/src/UI/index.tsx @@ -31,6 +31,21 @@ import { PluginManager } from "./../Plugins/PluginManager" import { NeovimEditor } from "./../Editor/NeovimEditor" +import { batchedSubscribe } from "redux-batched-subscribe" + +let rafId: any = null + +const rafUpdateBatcher = (notify: any) => { + if (rafId) { + return + } + + rafId = window.requestAnimationFrame(() => { + rafId = null + notify() + }) +} + const defaultState = State.createDefaultState() require("./components/common.less") // tslint:disable-line no-var-requires @@ -38,6 +53,7 @@ require("./components/common.less") // tslint:disable-line no-var-requires const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"] || compose // tslint:disable-line no-string-literal const enhancer = composeEnhancers( applyMiddleware(thunk), + batchedSubscribe(rafUpdateBatcher), ) export const store = createStore(reducer, defaultState, enhancer) diff --git a/package.json b/package.json index a128712db4..04a139a88b 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ }, "license": "MIT", "dependencies": { + "@types/redux-batched-subscribe": "^0.1.2", "css-language-server": "0.0.2", "find-up": "2.1.0", "keyboard-layout": "2.0.13", @@ -123,6 +124,7 @@ "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "oni-types": "0.0.4", + "redux-batched-subscribe": "^0.1.6", "typescript": "2.6.1", "vscode-jsonrpc": "3.5.0", "vscode-languageserver": "3.5.0", diff --git a/yarn.lock b/yarn.lock index 12aee46156..9f9980ff83 100644 --- a/yarn.lock +++ b/yarn.lock @@ -118,6 +118,12 @@ version "16.0.25" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.25.tgz#bf696b83fe480c5e0eff4335ee39ebc95884a1ed" +"@types/redux-batched-subscribe@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/redux-batched-subscribe/-/redux-batched-subscribe-0.1.2.tgz#a5f0e510b07b6e8f10fe781bd830fae4f9bcf648" + dependencies: + redux ">=1.0.0" + "@types/sinon@1.16.32": version "1.16.32" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-1.16.32.tgz#b3246844902d7cb33f376b369b176a65a144af7e" @@ -4935,11 +4941,15 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" +redux-batched-subscribe@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/redux-batched-subscribe/-/redux-batched-subscribe-0.1.6.tgz#de928602708df7198b4d0c98c7119df993780d59" + redux-thunk@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" -redux@3.7.2, redux@^3.6.0: +redux@3.7.2, redux@>=1.0.0, redux@^3.6.0: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" dependencies: From a3da2c9876a5596c86f641df99c945d0a6539d56 Mon Sep 17 00:00:00 2001 From: Akin Date: Sun, 26 Nov 2017 15:14:38 +0000 Subject: [PATCH 32/63] Feature/incorporate shell env package (#934) * add shell-env module to source shell path * add typings for shell env add dependencies for shell env `thread sleep` and `spawn-sync` * Add async version of shellEnv call change call sites to await fn and typings to return Promise Fix package version for shell env * fix version numbers for remaining shell env deps * Init tss server host with a pending promise Await promise prior to calling make tss server request * Remove try-thread-sleep Merge master * add submodules to shell-env branch * remove deleted (in master) oni.d.ts which seems to have survived the merge * update oni-api package * upgrade electron-builder with yarn add await to before all in ci test * refactor to use child process to find path * Remove shell env module * merge remote changes await `oni.start` [WIP] fix failing CI tests --- browser/src/Plugins/Api/Oni.ts | 8 +- browser/src/Plugins/Api/Process.ts | 31 +- .../Language/LanguageClientProcess.ts | 4 +- browser/src/neovim/NeovimProcessSpawner.ts | 5 +- package.json | 82 ++-- test/CiTests.ts | 2 +- .../src/TypeScriptServerHost.ts | 11 +- yarn.lock | 453 +++++++++++------- 8 files changed, 366 insertions(+), 230 deletions(-) diff --git a/browser/src/Plugins/Api/Oni.ts b/browser/src/Plugins/Api/Oni.ts index 05f21bf8be..625f7c8fd4 100644 --- a/browser/src/Plugins/Api/Oni.ts +++ b/browser/src/Plugins/Api/Oni.ts @@ -140,19 +140,19 @@ export class Oni extends EventEmitter implements OniApi.Plugin.Api { this._services = new Services() } - public execNodeScript(scriptPath: string, args: string[] = [], options: ChildProcess.ExecOptions = {}, callback: (err: any, stdout: string, stderr: string) => void): ChildProcess.ChildProcess { + public async execNodeScript(scriptPath: string, args: string[] = [], options: ChildProcess.ExecOptions = {}, callback: (err: any, stdout: string, stderr: string) => void): Promise { Log.warn("WARNING: `OniApi.execNodeScript` is deprecated. Please use `OniApi.process.execNodeScript` instead") - return Process.execNodeScript(scriptPath, args, options, callback) + return await Process.execNodeScript(scriptPath, args, options, callback) } /** * Wrapper around `child_process.exec` to run using electron as opposed to node */ - public spawnNodeScript(scriptPath: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): ChildProcess.ChildProcess { + public async spawnNodeScript(scriptPath: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): Promise { Log.warn("WARNING: `OniApi.spawnNodeScript` is deprecated. Please use `OniApi.process.spawnNodeScript` instead") - return Process.spawnNodeScript(scriptPath, args, options) + return await Process.spawnNodeScript(scriptPath, args, options) } } diff --git a/browser/src/Plugins/Api/Process.ts b/browser/src/Plugins/Api/Process.ts index 589a0100cd..14b011b379 100644 --- a/browser/src/Plugins/Api/Process.ts +++ b/browser/src/Plugins/Api/Process.ts @@ -1,13 +1,17 @@ import * as ChildProcess from "child_process" +import * as util from "util" import * as Platform from "./../../Platform" import { configuration } from "./../../Services/Configuration" +const exec = util.promisify(ChildProcess.exec) +type ExecReturn = string | { stdout: string, stderr: string } + const getPathSeparator = () => { return Platform.isWindows() ? ";" : ":" } -const mergePathEnvironmentVariable = (currentPath: string, pathsToAdd: string[]): string => { +const mergePathEnvironmentVariable = (currentPath: ExecReturn, pathsToAdd: string[]): ExecReturn => { if (!pathsToAdd || !pathsToAdd.length) { return currentPath } @@ -19,7 +23,7 @@ const mergePathEnvironmentVariable = (currentPath: string, pathsToAdd: string[]) return currentPath + separator + joinedPathsToAdd + separator } -const mergeSpawnOptions = (originalSpawnOptions: ChildProcess.ExecOptions | ChildProcess.SpawnOptions): any => { +const mergeSpawnOptions = async (originalSpawnOptions: ChildProcess.ExecOptions | ChildProcess.SpawnOptions): Promise => { const requiredOptions = { env: { ...process.env, @@ -27,7 +31,16 @@ const mergeSpawnOptions = (originalSpawnOptions: ChildProcess.ExecOptions | Chil }, } - const existingPath = process.env.Path || process.env.PATH + let existingPath: ExecReturn + + try { + const pathCommand = Platform.isWindows() ? "echo %PATH%" : "echo $PATH" + const path = await exec(pathCommand) + + existingPath = path || process.env.Path || process.env.PATH + } catch (e) { + existingPath = process.env.Path || process.env.PATH + } requiredOptions.env.PATH = mergePathEnvironmentVariable(existingPath, configuration.getValue("environment.additionalPaths")) @@ -41,8 +54,8 @@ const mergeSpawnOptions = (originalSpawnOptions: ChildProcess.ExecOptions | Chil * API surface area responsible for handling process-related tasks * (spawning processes, managing running process, etc) */ -export const execNodeScript = (scriptPath: string, args: string[] = [], options: ChildProcess.ExecOptions = {}, callback: (err: any, stdout: string, stderr: string) => void): ChildProcess.ChildProcess => { - const spawnOptions = mergeSpawnOptions(options) +export const execNodeScript = async (scriptPath: string, args: string[] = [], options: ChildProcess.ExecOptions = {}, callback: (err: any, stdout: string, stderr: string) => void): Promise => { + const spawnOptions = await mergeSpawnOptions(options) spawnOptions.env.ELECTRON_RUN_AS_NODE = 1 const execOptions = [process.execPath, scriptPath].concat(args) @@ -54,8 +67,8 @@ export const execNodeScript = (scriptPath: string, args: string[] = [], options: /** * Wrapper around `child_process.exec` to run using electron as opposed to node */ -export const spawnNodeScript = (scriptPath: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): ChildProcess.ChildProcess => { - const spawnOptions = mergeSpawnOptions(options) +export const spawnNodeScript = async (scriptPath: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): Promise => { + const spawnOptions = await mergeSpawnOptions(options) spawnOptions.env.ELECTRON_RUN_AS_NODE = 1 const allArgs = [scriptPath].concat(args) @@ -66,8 +79,8 @@ export const spawnNodeScript = (scriptPath: string, args: string[] = [], options /** * Spawn process - wrapper around `child_process.spawn` */ -export const spawnProcess = (startCommand: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): ChildProcess.ChildProcess => { - const spawnOptions = mergeSpawnOptions(options) +export const spawnProcess = async (startCommand: string, args: string[] = [], options: ChildProcess.SpawnOptions = {}): Promise => { + const spawnOptions = await mergeSpawnOptions(options) return ChildProcess.spawn(startCommand, args, spawnOptions) } diff --git a/browser/src/Services/Language/LanguageClientProcess.ts b/browser/src/Services/Language/LanguageClientProcess.ts index 236c92aadd..f9689eacd1 100644 --- a/browser/src/Services/Language/LanguageClientProcess.ts +++ b/browser/src/Services/Language/LanguageClientProcess.ts @@ -113,10 +113,10 @@ export class LanguageClientProcess { if (this._serverOptions.command) { Log.info(`[LanguageClientProcess]: Starting process via '${this._serverOptions.command}'`) - this._process = Process.spawnProcess(this._serverOptions.command, args, options) + this._process = await Process.spawnProcess(this._serverOptions.command, args, options) } else if (this._serverOptions.module) { Log.info(`[LanguageClientProcess]: Starting process via node script '${this._serverOptions.module}'`) - this._process = Process.spawnNodeScript(this._serverOptions.module, args, options) + this._process = await Process.spawnNodeScript(this._serverOptions.module, args, options) } else { throw new Error("A command or module must be specified to start the server") } diff --git a/browser/src/neovim/NeovimProcessSpawner.ts b/browser/src/neovim/NeovimProcessSpawner.ts index a07994b6f5..a6c71d01ec 100644 --- a/browser/src/neovim/NeovimProcessSpawner.ts +++ b/browser/src/neovim/NeovimProcessSpawner.ts @@ -91,10 +91,9 @@ export const startNeovim = async (options: INeovimStartOptions = DefaultStartOpt .concat(["--cmd", `let &rtp.=',${joinedRuntimePaths}'`, "--cmd", "let g:gui_oni = 1", "-N", "--embed", "--"]) .concat(args) - const nvimProc = spawnProcess(nvimProcessPath, argsToPass, {}) + const nvimProc = await spawnProcess(nvimProcessPath, argsToPass, {}) console.log(`Starting Neovim - process: ${nvimProc.pid}`) // tslint:disable-line no-console - return getSessionFromProcess(nvimProc, options.transport) - + return await getSessionFromProcess(nvimProc, options.transport) } diff --git a/package.json b/package.json index 04a139a88b..2d3b5dbb8a 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,7 @@ "homepage": "https://www.onivim.io", "version": "0.2.18", "description": "NeoVim front-end with IDE-style extensibility", - "keywords": [ - "vim", - "neovim", - "text", - "editor", - "ide", - "vim" - ], + "keywords": ["vim", "neovim", "text", "editor", "ide", "vim"], "main": "./lib/main/src/main.js", "bin": { "oni": "./cli/oni", @@ -45,63 +38,63 @@ "mac": { "artifactName": "${productName}-${version}-osx.${ext}", "category": "public.app-category.developer-tools", - "target": [ - "dmg", - "zip" - ], - "files": [ - "bin/osx/**/*" - ] + "target": ["dmg", "zip"], + "files": ["bin/osx/**/*"] }, "linux": { "artifactName": "${productName}-${version}-${arch}-linux.${ext}", "maintainer": "bryphe@outlook.com", - "target": [ - "tar.gz", - "deb", - "rpm" - ] + "target": ["tar.gz", "deb", "rpm"] }, "win": { - "target": [ - "zip", - "dir" - ], - "files": [ - "bin/x86/**/*" - ] + "target": ["zip", "dir"], + "files": ["bin/x86/**/*"] } }, "scripts": { - "build": "npm run build:browser && npm run build:main && npm run build:plugins", + "build": + "npm run build:browser && npm run build:main && npm run build:plugins", "build-debug": "npm run build:browser-debug && npm run build:plugins", "build:browser": "webpack --config browser/webpack.production.config.js", "build:browser-debug": "webpack --config browser/webpack.debug.config.js", "build:main": "cd main && tsc -p tsconfig.json", "build:plugins": "npm run build:plugin:oni-plugin-typescript", - "build:plugin:oni-plugin-typescript": "cd vim/core/oni-plugin-typescript && npm run build", + "build:plugin:oni-plugin-typescript": + "cd vim/core/oni-plugin-typescript && npm run build", "build:test": "cd test && tsc -p tsconfig.json", "pack": "build --publish never", "copy-icons": "node build/CopyIcons.js", "dist:win": "build --arch ia32 --publish never", - "pack:win": "node build/BuildSetupTemplate.js && innosetup-compiler dist/setup.iss --verbose --O=dist", + "pack:win": + "node build/BuildSetupTemplate.js && innosetup-compiler dist/setup.iss --verbose --O=dist", "test": "npm run test:unit && npm run test:integration", - "test:integration": "npm run build:test && mocha -t 30000 lib_test/test/CiTests.js", - "test:stability": "npm run build:test && mocha -t 600000 --recursive lib_test/test/stability", + "test:integration": + "npm run build:test && mocha -t 30000 lib_test/test/CiTests.js", + "test:stability": + "npm run build:test && mocha -t 600000 --recursive lib_test/test/stability", "test:unit": "npm run test:unit:browser", - "test:unit:browser": "cd browser && tsc -p tsconfig.json && mocha --recursive ../lib_test/browser/test", - "fix-lint": "npm run fix-lint:browser && npm run fix-lint:main && npm run fix-lint:test", - "fix-lint:browser": "tslint --fix --project browser/tsconfig.json --config tslint.json && tslint --fix --project vim/core/oni-plugin-typescript/tsconfig.json --config tslint.json", - "fix-lint:main": "tslint --fix --project main/tsconfig.json --config tslint.json", - "fix-lint:test": "tslint --fix --project test/tsconfig.json --config tslint.json", + "test:unit:browser": + "cd browser && tsc -p tsconfig.json && mocha --recursive ../lib_test/browser/test", + "fix-lint": + "npm run fix-lint:browser && npm run fix-lint:main && npm run fix-lint:test", + "fix-lint:browser": + "tslint --fix --project browser/tsconfig.json --config tslint.json && tslint --fix --project vim/core/oni-plugin-typescript/tsconfig.json --config tslint.json", + "fix-lint:main": + "tslint --fix --project main/tsconfig.json --config tslint.json", + "fix-lint:test": + "tslint --fix --project test/tsconfig.json --config tslint.json", "lint": "npm run lint:browser && npm run lint:main && npm run lint:test", - "lint:browser": "tslint --project browser/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", + "lint:browser": + "tslint --project browser/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", "lint:main": "tslint --project main/tsconfig.json --config tslint.json", - "lint:test": "tslint --project test/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", - "start": "concurrently --kill-others \"npm run start-hot\" \"npm run watch:browser\" \"npm run watch:plugins\"", + "lint:test": + "tslint --project test/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", + "start": + "concurrently --kill-others \"npm run start-hot\" \"npm run watch:browser\" \"npm run watch:plugins\"", "start-hot": "cross-env NODE_ENV=development electron lib/main/src/main.js", "start-not-dev": "cross-env electron main.js", - "watch:browser": "webpack-dev-server --config browser/webpack.debug.config.js --host localhost --port 8191", + "watch:browser": + "webpack-dev-server --config browser/webpack.debug.config.js --host localhost --port 8191", "watch:plugins": "cd vim/core/oni-plugin-typescript && tsc --watch", "uninstall-global": "npm rm -g oni-vim", "install-global": "npm install -g oni-vim", @@ -120,7 +113,7 @@ "minimist": "1.2.0", "msgpack-lite": "0.1.26", "ocaml-language-server": "1.0.12", - "oni-api": "0.0.4", + "oni-api": "0.0.5", "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "oni-types": "0.0.4", @@ -140,7 +133,7 @@ "@types/mkdirp": "0.3.29", "@types/mocha": "2.2.33", "@types/msgpack-lite": "0.1.4", - "@types/node": "6.0.48", + "@types/node": "8.0.53", "@types/react-dom": "16.0.3", "@types/react-motion": "0.0.23", "@types/react-redux": "5.0.12", @@ -155,7 +148,7 @@ "cross-env": "3.1.3", "css-loader": "0.28.4", "electron": "1.8.1", - "electron-builder": "19.26.0", + "electron-builder": "19.46.4", "electron-devtools-installer": "2.2.0", "electron-rebuild": "1.6.0", "extract-zip": "1.6.0", @@ -183,7 +176,6 @@ "redux": "3.7.2", "redux-thunk": "2.2.0", "reselect": "3.0.1", - "rimraf": "2.6.2", "rxjs": "5.5.0", "shelljs": "0.7.7", "sinon": "1.17.6", diff --git a/test/CiTests.ts b/test/CiTests.ts index 8fc924dc3d..377e8e407d 100644 --- a/test/CiTests.ts +++ b/test/CiTests.ts @@ -103,7 +103,7 @@ describe("ci tests", function() { // tslint:disable-line only-arrow-functions } oni = new Oni() - return oni.start() + await oni.start() }) afterEach(async () => { diff --git a/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts b/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts index 620881e4c7..79b69cc80e 100644 --- a/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts +++ b/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts @@ -19,6 +19,7 @@ export class TypeScriptServerHost extends events.EventEmitter { private _seqNumber = 0 private _seqToPromises = {} private _rl: any + private _initPromise: Promise private _openedFiles: string[] = [] @@ -28,7 +29,6 @@ export class TypeScriptServerHost extends events.EventEmitter { constructor(Oni: any) { super() - // Other tries for creating process: // this._tssProcess = childProcess.spawn("node", [tssPath], { stdio: "pipe", detached: true, shell: false }); // this._tssProcess = childProcess.fork(tssPath, [], { stdio: "pipe "}) @@ -41,7 +41,11 @@ export class TypeScriptServerHost extends events.EventEmitter { // This has some info on using eventPort: https://github.com/Microsoft/TypeScript/blob/master/src/server/server.ts // which might be more reliable // Can create the port using this here: https://github.com/Microsoft/TypeScript/blob/master/src/server/server.ts - this._tssProcess = Oni.process.spawnNodeScript(tssPath) + this._initPromise = this._startTypescriptServer(Oni) + } + + public async _startTypescriptServer(Oni): Promise { + this._tssProcess = await Oni.process.spawnNodeScript(tssPath) console.log("Process ID: " + this._tssProcess.pid) // tslint:disable-line no-console this._rl = readline.createInterface({ @@ -248,7 +252,8 @@ export class TypeScriptServerHost extends events.EventEmitter { }) } - public _makeTssRequest(commandName: string, args: any): Promise { + public async _makeTssRequest(commandName: string, args: any): Promise { + await this._initPromise const seq = this._seqNumber++ const payload = { seq, diff --git a/yarn.lock b/yarn.lock index 9f9980ff83..f45fcdcfe4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,7 +14,7 @@ version "2.1.1" resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz#8acfc28bb34e53a9476b46ae85a97418e6035c20" -"7zip-bin@^2.2.3": +"7zip-bin@^2.2.7": version "2.2.7" resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.2.7.tgz#724802b8d6bda0bf2cfe61a4b86a820efc8ece93" optionalDependencies: @@ -80,14 +80,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^8.0.24": +"@types/node@*", "@types/node@8.0.53", "@types/node@^8.0.24": version "8.0.53" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.53.tgz#396b35af826fa66aad472c8cb7b8d5e277f4e6d8" -"@types/node@6.0.48": - version "6.0.48" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.48.tgz#86ccc15f66b73cbbc5eb3483398936c585122b3c" - "@types/react-dom@16.0.3": version "16.0.3" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64" @@ -182,9 +178,9 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.2, ajv@^5.2.3: - version "5.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" +ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3: + version "5.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.0.tgz#eb2840746e9dc48bd5e063a36e3fd400c5eab5a9" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -258,6 +254,17 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +app-package-builder@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-1.5.1.tgz#92bc9bf8821a7d61eb057171515718cc1f6f4514" + dependencies: + bluebird-lst "^1.0.5" + builder-util "^3.4.0" + builder-util-runtime "^3.2.0" + fs-extra-p "^4.4.4" + int64-buffer "^0.1.9" + rabin-bindings "~1.7.3" + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -357,12 +364,12 @@ asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" -asar-integrity@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.1.2.tgz#461248c63c24b13d4a11a70c378f8f59dba2b4af" +asar-integrity@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.2.3.tgz#b238a68ef1218561b4904db8400c0943fbc62c62" dependencies: - bluebird-lst "^1.0.2" - fs-extra-p "^4.4.0" + bluebird-lst "^1.0.5" + fs-extra-p "^4.4.4" asn1.js@^4.0.0: version "4.9.2" @@ -787,6 +794,10 @@ binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" +bindings@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" + bl@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" @@ -799,7 +810,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird-lst@^1.0.2, bluebird-lst@^1.0.3, bluebird-lst@^1.0.4, bluebird-lst@^1.0.5: +bluebird-lst@^1.0.4, bluebird-lst@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9" dependencies: @@ -985,48 +996,64 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builder-util@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-1.0.1.tgz#e47e82be0ab3ae5ebff4bb361b91b94e49e27a8b" - dependencies: - "7zip-bin" "^2.2.3" - bluebird-lst "^1.0.3" - chalk "^2.1.0" - debug "^3.0.1" - electron-builder-http "~19.23.0" - fcopy-pre-bundled "0.3.4" - fs-extra-p "^4.4.0" - ini "^1.3.4" +builder-util-runtime@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-3.2.0.tgz#b946032b61c940533fa5e8f05afc550b8e56c94c" + dependencies: + bluebird-lst "^1.0.5" + debug "^3.1.0" + fs-extra-p "^4.4.4" + sax "^1.2.4" + +builder-util-runtime@^3.2.0, builder-util-runtime@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-3.3.0.tgz#6374029211544f1a380fc7275658b0616b0e9ae1" + dependencies: + bluebird-lst "^1.0.5" + debug "^3.1.0" + fs-extra-p "^4.4.4" + sax "^1.2.4" + +builder-util@3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.4.1.tgz#b9f079ff4c279699ca52f42930bab1c19ff62517" + dependencies: + "7zip-bin" "^2.2.7" + bluebird-lst "^1.0.5" + builder-util-runtime "^3.2.0" + chalk "^2.3.0" + debug "^3.1.0" + fs-extra-p "^4.4.4" + ini "^1.3.5" is-ci "^1.0.10" - js-yaml "^3.9.1" + js-yaml "^3.10.0" lazy-val "^1.0.2" node-emoji "^1.8.1" semver "^5.4.1" - source-map-support "^0.4.16" + source-map-support "^0.5.0" stat-mode "^0.2.2" - temp-file "^2.0.2" + temp-file "^2.1.1" tunnel-agent "^0.6.0" -builder-util@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-1.0.2.tgz#93a4aadd8adf67d663717629eb6cd4b0666bea32" - dependencies: - "7zip-bin" "^2.2.3" - bluebird-lst "^1.0.3" - chalk "^2.1.0" - debug "^3.0.1" - electron-builder-http "^19.27.4" - fcopy-pre-bundled "0.3.4" - fs-extra-p "^4.4.0" - ini "^1.3.4" +builder-util@^3.4.0, builder-util@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.4.2.tgz#d5dbf595038f4912f3bbac0a98ab4010d2708b9c" + dependencies: + "7zip-bin" "^2.2.7" + bluebird-lst "^1.0.5" + builder-util-runtime "^3.3.0" + chalk "^2.3.0" + debug "^3.1.0" + fs-extra-p "^4.4.4" + ini "^1.3.5" is-ci "^1.0.10" - js-yaml "^3.9.1" + js-yaml "^3.10.0" lazy-val "^1.0.2" node-emoji "^1.8.1" semver "^5.4.1" - source-map-support "^0.4.16" + source-map-support "^0.5.0" stat-mode "^0.2.2" - temp-file "^2.0.3" + temp-file "^3.0.0" tunnel-agent "^0.6.0" builtin-modules@^1.0.0: @@ -1074,8 +1101,8 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000515, caniuse-db@^1.0.30000525, caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000769" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000769.tgz#c230b9c1b9e8db3e1c0d858c96e685741b96cc10" + version "1.0.30000770" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000770.tgz#cf68ae1cb8a82f6d3c35df41c62dc6973e470244" capture-stack-trace@^1.0.0: version "1.0.0" @@ -1116,7 +1143,7 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: @@ -1143,6 +1170,10 @@ chokidar@^1.6.0, chokidar@^1.7.0: optionalDependencies: fsevents "^1.0.0" +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" @@ -1295,8 +1326,8 @@ commander@2.9.0: graceful-readlink ">= 1.0.0" commander@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + version "2.12.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.1.tgz#468635c4168d06145b9323356d1da84d14ac4a7a" compare-version@^0.1.2: version "0.1.2" @@ -1404,8 +1435,8 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" cookie-signature@1.0.6: version "1.0.6" @@ -1643,10 +1674,6 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1685,7 +1712,7 @@ debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.5.1, debug@^2.6.3, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.0.1: +debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -1766,8 +1793,8 @@ detect-indent@^4.0.0: repeating "^2.0.0" detect-libc@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" detect-node@^2.0.3: version "2.0.3" @@ -1793,13 +1820,16 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dmg-builder@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-1.0.1.tgz#8a5d319ce29b2de99ed2d687aee3cece2549f2cc" +dmg-builder@2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-2.1.7.tgz#0d672ee00929f6a1ff321b3b660d0350e4c880eb" dependencies: - bluebird-lst "^1.0.3" - builder-util "^1.0.0" - fs-extra-p "^4.4.0" + bluebird-lst "^1.0.5" + builder-util "^3.4.0" + debug "^3.1.0" + fs-extra-p "^4.4.4" + iconv-lite "^0.4.19" + js-yaml "^3.10.0" parse-color "^1.0.0" dns-equal@^1.0.0: @@ -1859,60 +1889,54 @@ ejs@^2.5.7, ejs@~2.5.6: version "2.5.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" -electron-builder-http@19.23.0, electron-builder-http@~19.23.0: - version "19.23.0" - resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-19.23.0.tgz#a7ec01bd1ca97b9e3a00d4799faa9ff1d52a4893" +electron-builder-lib@19.46.4: + version "19.46.4" + resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-19.46.4.tgz#abd522640b64872379bebef24d777dc542e9e83c" dependencies: - bluebird-lst "^1.0.3" - debug "^3.0.0" - fs-extra-p "^4.4.0" - -electron-builder-http@^19.27.4: - version "19.27.5" - resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-19.27.5.tgz#800865df2e618ffab9e5b3b895c15b4ce7fd7f17" - dependencies: - bluebird-lst "^1.0.3" - debug "^3.0.1" - fs-extra-p "^4.4.0" - -electron-builder@19.26.0: - version "19.26.0" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.26.0.tgz#92a98aa915d91e75da6e32b0da8f4e58d0b03e70" - dependencies: - "7zip-bin" "^2.2.3" - ajv "^5.2.2" - ajv-keywords "^2.1.0" - asar-integrity "0.1.2" - bluebird-lst "^1.0.3" - builder-util "1.0.1" - chalk "^2.1.0" + "7zip-bin" "^2.2.7" + app-package-builder "1.5.1" + asar-integrity "0.2.3" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.5" + builder-util "3.4.1" + builder-util-runtime "3.2.0" chromium-pickle-js "^0.2.0" - cuint "^0.2.2" - debug "^3.0.1" - dmg-builder "1.0.1" - dotenv "^4.0.0" - dotenv-expand "^4.0.1" + debug "^3.1.0" + dmg-builder "2.1.7" ejs "^2.5.7" - electron-builder-http "19.23.0" - electron-download-tf "4.3.4" electron-osx-sign "0.4.7" - electron-publish "19.25.0" - fs-extra-p "^4.4.0" + electron-publish "19.46.4" + fs-extra-p "^4.4.4" hosted-git-info "^2.5.0" is-ci "^1.0.10" isbinaryfile "^3.0.2" - js-yaml "^3.9.1" + js-yaml "^3.10.0" lazy-val "^1.0.2" minimatch "^3.0.4" normalize-package-data "^2.4.0" plist "^2.1.0" - read-config-file "^1.0.5" + read-config-file "1.2.0" sanitize-filename "^1.6.1" semver "^5.4.1" - temp-file "^2.0.2" - update-notifier "^2.2.0" - uuid-1345 "^0.99.6" - yargs "^8.0.2" + temp-file "^2.1.1" + +electron-builder@^19.46.4: + version "19.46.4" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.46.4.tgz#d69ac60b78778258ab5cba0a9fb94963563e903b" + dependencies: + bluebird-lst "^1.0.5" + builder-util "3.4.1" + builder-util-runtime "3.2.0" + chalk "^2.3.0" + electron-builder-lib "19.46.4" + electron-download-tf "4.3.4" + fs-extra-p "^4.4.4" + is-ci "^1.0.10" + lazy-val "^1.0.2" + read-config-file "1.2.0" + sanitize-filename "^1.6.1" + update-notifier "^2.3.0" + yargs "^10.0.3" electron-chromedriver@~1.6.0: version "1.6.0" @@ -1969,16 +1993,16 @@ electron-osx-sign@0.4.7: minimist "^1.2.0" plist "^2.1.0" -electron-publish@19.25.0: - version "19.25.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.25.0.tgz#e8954fd64093ea9d8f287a0c34292d67de8f302e" +electron-publish@19.46.4: + version "19.46.4" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.46.4.tgz#fb9e53f16329c89d3c234b1c653fb7d603b903d1" dependencies: - bluebird-lst "^1.0.3" - builder-util "^1.0.0" - chalk "^2.1.0" - electron-builder-http "~19.23.0" - fs-extra-p "^4.4.0" - mime "^1.3.6" + bluebird-lst "^1.0.5" + builder-util "^3.4.1" + builder-util-runtime "^3.2.0" + chalk "^2.3.0" + fs-extra-p "^4.4.4" + mime "^2.0.3" electron-rebuild@1.6.0: version "1.6.0" @@ -2032,7 +2056,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" dependencies: @@ -2064,8 +2088,8 @@ error-ex@^1.2.0: is-arrayish "^0.2.1" es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.35" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f" + version "0.10.37" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3" dependencies: es6-iterator "~2.0.1" es6-symbol "~3.1.1" @@ -2242,6 +2266,10 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-template@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc" + express@^4.13.3: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" @@ -2357,10 +2385,6 @@ fbjs@^0.8.16: setimmediate "^1.0.5" ua-parser-js "^0.7.9" -fcopy-pre-bundled@0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/fcopy-pre-bundled/-/fcopy-pre-bundled-0.3.4.tgz#7ff1a1c339e877baa86b0856bebb33621cd5620b" - fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -2399,7 +2423,7 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" -find-up@2.1.0, find-up@^2.0.0: +find-up@2.1.0, find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -2460,7 +2484,7 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" -fs-extra-p@^4.4.0, fs-extra-p@^4.4.4: +fs-extra-p@^4.4.4: version "4.4.4" resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.4.tgz#396ad6f914eb2954e1700fd0e18288301ed45f04" dependencies: @@ -2566,6 +2590,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + github-releases@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/github-releases/-/github-releases-0.4.1.tgz#4a13bdf85c4161344271db3d81db08e7379102ff" @@ -2871,7 +2899,7 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -2930,9 +2958,9 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" innosetup-compiler@5.5.9: version "5.5.9" @@ -3217,7 +3245,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.10.0, js-yaml@^3.9.1: +js-yaml@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -3586,7 +3614,7 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -macaddress@^0.2.7, macaddress@^0.2.8: +macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" @@ -3696,10 +3724,18 @@ mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, dependencies: mime-db "~1.30.0" -mime@1.4.1, mime@^1.2.11, mime@^1.3.4, mime@^1.3.6: +mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" +mime@^1.2.11, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +mime@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.3.tgz#4353337854747c48ea498330dc034f9f4bbbcc0b" + mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" @@ -3784,8 +3820,8 @@ multicast-dns-service-types@^1.1.0: resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" multicast-dns@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.0.tgz#13f22d0c32dc5ee82a32878e3c380d875b3eab22" + version "6.2.1" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.1.tgz#c5035defa9219d30640558a49298067352098060" dependencies: dns-packet "^1.0.1" thunky "^0.1.0" @@ -3794,7 +3830,7 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.0.0, nan@^2.3.0: +nan@^2.0.0, nan@^2.3.0, nan@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -3802,7 +3838,7 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -node-abi@^2.0.0: +node-abi@^2.0.0, node-abi@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.2.tgz#4da6caceb6685fcd31e7dd1994ef6bb7d0a9c0b2" dependencies: @@ -3894,6 +3930,10 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -3945,7 +3985,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -4026,7 +4066,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4038,9 +4078,9 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -oni-api@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.4.tgz#9e2c4a5f6a42cc6f511faac93a0c912b65c7f544" +oni-api@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.5.tgz#d690565e3dc1af8c4cfaea3a69a3896206877928" oni-neovim-binaries@0.1.0: version "0.1.0" @@ -4136,7 +4176,7 @@ os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" -os-homedir@^1.0.0: +os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -4595,6 +4635,25 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^4.4.0" +prebuild-install@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.3.0.tgz#19481247df728b854ab57b187ce234211311b485" + dependencies: + expand-template "^1.0.2" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + node-abi "^2.1.1" + noop-logger "^0.1.1" + npmlog "^4.0.1" + os-homedir "^1.0.1" + pump "^1.0.1" + rc "^1.1.6" + simple-get "^1.4.2" + tar-fs "^1.13.0" + tunnel-agent "^0.6.0" + xtend "4.0.1" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -4679,6 +4738,13 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" +pump@^1.0.0, pump@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -4722,6 +4788,14 @@ querystringify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +rabin-bindings@~1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/rabin-bindings/-/rabin-bindings-1.7.3.tgz#fb6ae9dbf897988bc2504ccf4832ee4f0546d32a" + dependencies: + bindings "^1.3.0" + nan "^2.7.0" + prebuild-install "^2.3.0" + raf@^3.1.0: version "3.4.0" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" @@ -4829,7 +4903,7 @@ react@16.0.0: object-assign "^4.1.1" prop-types "^15.6.0" -read-config-file@^1.0.5: +read-config-file@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-1.2.0.tgz#1fd7dc8ccdad838cac9f686182625290fc94f456" dependencies: @@ -5136,7 +5210,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -5207,7 +5281,7 @@ sanitize-filename@^1.6.1: dependencies: truncate-utf8-bytes "^1.0.0" -sax@^1.2.1, sax@~1.2.1: +sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -5329,6 +5403,14 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +simple-get@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb" + dependencies: + once "^1.3.1" + unzip-response "^1.0.0" + xtend "^4.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -5407,12 +5489,18 @@ source-map-resolve@^0.3.0: source-map-url "~0.3.0" urix "~0.1.0" -source-map-support@^0.4.15, source-map-support@^0.4.16: +source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" +source-map-support@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab" + dependencies: + source-map "^0.6.0" + source-map-url@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -5433,7 +5521,7 @@ source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3, sour version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -5712,6 +5800,15 @@ tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" +tar-fs@^1.13.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896" + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" @@ -5725,7 +5822,7 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" -tar-stream@^1.5.0: +tar-stream@^1.1.2, tar-stream@^1.5.0: version "1.5.5" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" dependencies: @@ -5742,9 +5839,18 @@ tar@^2.0.0, tar@^2.2.1: fstream "^1.0.2" inherits "2" -temp-file@^2.0.2, temp-file@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.1.0.tgz#e88851886d9cae17152bd71bb929189fa8b5bcf8" +temp-file@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.1.3.tgz#cc54f01d367df6e36c1fefbd662afbd95fdd0f37" + dependencies: + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.5" + fs-extra-p "^4.4.4" + lazy-val "^1.0.2" + +temp-file@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.0.0.tgz#1e9eca9c411a41564f5746bc2774c39080021db0" dependencies: async-exit-hook "^2.0.1" bluebird-lst "^1.0.5" @@ -5958,11 +6064,15 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unzip-response@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@^2.2.0: +update-notifier@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" dependencies: @@ -6025,12 +6135,6 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid-1345@^0.99.6: - version "0.99.6" - resolved "https://registry.yarnpkg.com/uuid-1345/-/uuid-1345-0.99.6.tgz#b1270ae015a7721c7adec6c46ec169c6098aed40" - dependencies: - macaddress "^0.2.7" - uuid@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" @@ -6051,8 +6155,8 @@ validator@~7.0.0: resolved "https://registry.yarnpkg.com/validator/-/validator-7.0.0.tgz#c74deb8063512fac35547938e6f0b1504a282fd2" validator@~9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/validator/-/validator-9.1.1.tgz#3bdd1065cbd28f9d96ac806dee01030d32fd97ef" + version "9.1.2" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.1.2.tgz#5711b6413f78bd9d56003130c81b47c39e86546c" vary@~1.1.2: version "1.1.2" @@ -6220,11 +6324,11 @@ webidl-conversions@^4.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" webpack-dev-middleware@^1.11.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" + version "1.12.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.1.tgz#338be3ca930973be1c2ce07d84d275e997e1a25a" dependencies: memory-fs "~0.4.1" - mime "^1.3.4" + mime "^1.4.1" path-is-absolute "^1.0.0" range-parser "^1.0.3" time-stamp "^2.0.0" @@ -6415,7 +6519,7 @@ xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" -xtend@^4.0.0: +xtend@4.0.1, xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -6458,6 +6562,29 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.0.0.tgz#21d476330e5a82279a4b881345bf066102e219c6" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.0.0" + yargs@^4.8.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" From 4dd43453b0de3c3e468c1991b21fe3369b98a149 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Sun, 26 Nov 2017 08:08:12 -0800 Subject: [PATCH 33/63] [WIP / Prototype] Use TextMate themes for syntax highlighting (#848) * Add vscode-textmate * Add syntax highlighting strategy plus JavaScript textmate theme * Move to syntaxes folder * Start parsing tokens from buffer updates * Hard wire some scopes to Vim functions as a proof-of-concept * Add syntax highlighting store * Factor out to use epic * Get end-to-end working (although everything gets scoped as a function! * Update PLAN * Fix compilation issues after merge * Update Plan, initialize token colors * Tweak keyword back to purple, test out identifiers * Move settings to configuration, instead of being hardcoded * Fix first round of lint issues * Use textMateGrammar setting for loading language * Update PLAN * Fix remaining lint errors * Add 'notifyViewportChanged' handler * Remove no-op log * Hook up SYNTAX_UPDATE_BUFFER_VIEWPORT action, and filter reconciler to only grab visible rows * Add some smarts so that the Buffer can less aggressively update highlights, if the highlight is already set * Update PLAN * Batch calls to Neovim for adding and clearing highlights * Performance improvements for parsing tokens * Get working end-to-end * Get working end-to-end with incremental updates * Start cleaning up code * Start cleaning up / remove unused code * Fix lint issues * Tweak throttled values * Update PLAN.md * Fix lint issues * Add line limit * Add debug scopes element, start tweaking scopes * Fix lint issues * Update PLAN * Update PLAN * Fix tests * Update to use selector for getting the relevant range * Wire up insert mode actions * Fix some remaining bugs with synchronizing highlights * Update configuration for additional tokens, update PLAN * Additional bug fixes for syntax highligher * Fix logging * Remove line for getting syntax store * Update PLAN * Remove some unused code * Add additional logging for notifyViewportChanged * Change from info -> verbose * Fix lint issue * Update GrammarLoader to support querying based on extension * Update loader to different grammars based on file extensions * Remove PLAN, fix lint issue in GrammarLoader --- PLAN.md | 2 - browser/src/Editor/BufferHighlights.ts | 77 + browser/src/Editor/BufferManager.ts | 29 + browser/src/Editor/NeovimEditor.tsx | 26 + browser/src/Editor/NeovimInput.tsx | 1 - browser/src/PeriodicJobs.ts | 68 + browser/src/Plugins/PluginManager.ts | 5 +- .../Services/Configuration/Configuration.ts | 2 +- .../Configuration/DefaultConfiguration.ts | 41 + .../Configuration/IConfigurationValues.ts | 16 + browser/src/Services/Language/Hover.tsx | 29 + .../SyntaxHighlighting/Definitions.ts | 14 + .../SyntaxHighlighting/GrammarLoader.ts | 51 + .../SyntaxHighlightReconciler.ts | 144 + .../SyntaxHighlightSelectors.ts | 30 + .../SyntaxHighlighting/SyntaxHighlighting.ts | 159 + .../SyntaxHighlightingPeriodicJob.ts | 109 + .../SyntaxHighlightingReducer.ts | 179 + .../SyntaxHighlightingStore.ts | 151 + .../src/Services/SyntaxHighlighting/index.ts | 4 + browser/src/UI/components/QuickInfo.tsx | 38 - browser/src/index.tsx | 13 +- .../SyntaxHighlightingReducerTests.ts | 87 + browser/webpack.debug.config.js | 1 + extensions/README.md | 6 + extensions/css/syntaxes/css.tmLanguage.json | 1807 +++++++ .../syntaxes/JavaScript.tmLanguage.json | 4262 ++++++++++++++++ .../syntaxes/JavaScriptReact.tmLanguage.json | 4262 ++++++++++++++++ extensions/less/syntaxes/less.tmLanguage.json | 550 +++ extensions/reason/syntaxes/reason.json | 2279 +++++++++ extensions/scss/syntaxes/scss.json | 1710 +++++++ .../syntaxes/TypeScript.tmLanguage.json | 3997 +++++++++++++++ .../syntaxes/TypeScriptReact.tmLanguage.json | 4259 ++++++++++++++++ .../syntaxes/JavaScript.tmLanguage.json | 4272 +++++++++++++++++ package.json | 4 +- vim/core/colors/onedark.vim | 2 +- yarn.lock | 21 + 37 files changed, 28653 insertions(+), 54 deletions(-) delete mode 100644 PLAN.md create mode 100644 browser/src/Editor/BufferHighlights.ts create mode 100644 browser/src/PeriodicJobs.ts create mode 100644 browser/src/Services/SyntaxHighlighting/Definitions.ts create mode 100644 browser/src/Services/SyntaxHighlighting/GrammarLoader.ts create mode 100644 browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts create mode 100644 browser/src/Services/SyntaxHighlighting/SyntaxHighlightSelectors.ts create mode 100644 browser/src/Services/SyntaxHighlighting/SyntaxHighlighting.ts create mode 100644 browser/src/Services/SyntaxHighlighting/SyntaxHighlightingPeriodicJob.ts create mode 100644 browser/src/Services/SyntaxHighlighting/SyntaxHighlightingReducer.ts create mode 100644 browser/src/Services/SyntaxHighlighting/SyntaxHighlightingStore.ts create mode 100644 browser/src/Services/SyntaxHighlighting/index.ts create mode 100644 browser/test/Services/SyntaxHighlighting/SyntaxHighlightingReducerTests.ts create mode 100644 extensions/README.md create mode 100644 extensions/css/syntaxes/css.tmLanguage.json create mode 100644 extensions/javascript/syntaxes/JavaScript.tmLanguage.json create mode 100644 extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json create mode 100644 extensions/less/syntaxes/less.tmLanguage.json create mode 100644 extensions/reason/syntaxes/reason.json create mode 100644 extensions/scss/syntaxes/scss.json create mode 100644 extensions/typescript/syntaxes/TypeScript.tmLanguage.json create mode 100644 extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json create mode 100644 languages/javascript/syntaxes/JavaScript.tmLanguage.json diff --git a/PLAN.md b/PLAN.md deleted file mode 100644 index 9d2f28f3b0..0000000000 --- a/PLAN.md +++ /dev/null @@ -1,2 +0,0 @@ -- How does this work with typing predictions? Seems like there may be artifacts that weren't present before -- Any regressions? diff --git a/browser/src/Editor/BufferHighlights.ts b/browser/src/Editor/BufferHighlights.ts new file mode 100644 index 0000000000..3148f148ae --- /dev/null +++ b/browser/src/Editor/BufferHighlights.ts @@ -0,0 +1,77 @@ +/** + * BufferHighlights.ts + * + * Helpers to manage buffer highlight state + */ + +import * as SyntaxHighlighting from "./../Services/SyntaxHighlighting" + +import { NeovimInstance } from "./../neovim" + +// Line number to highlight src id, for clearing +export type HighlightSourceId = number +export interface BufferHighlightState { [key: number]: HighlightSourceId } + +export interface IBufferHighlightsUpdater { + setHighlightsForLine(line: number, highlights: SyntaxHighlighting.HighlightInfo[]): void + clearHighlightsForLine(line: number): void +} + +// Helper class to efficiently update +// buffer highlights in a batch. +export class BufferHighlightsUpdater implements IBufferHighlightsUpdater { + + private _newSrcId: number + private _calls: any[] = [] + private _newState: BufferHighlightState + + constructor( + private _bufferId: number, + private _neovimInstance: NeovimInstance, + private _previousState: BufferHighlightState, + ) {} + + public async start(): Promise { + this._newState = { + ...this._previousState, + } + + this._newSrcId = await this._neovimInstance.request("nvim_buf_add_highlight", [this._bufferId, 0, "", 0, 0, 0]) + } + + public setHighlightsForLine(line: number, highlights: SyntaxHighlighting.HighlightInfo[]): void { + this.clearHighlightsForLine(line) + + if (!highlights || !highlights.length) { + return + } + + const addHighlightCalls = highlights.map((hl) => { + return ["nvim_buf_add_highlight", [this._bufferId, this._newSrcId, hl.highlightGroup, + hl.range.start.line, hl.range.start.character, hl.range.end.character]] + }) + + this._newState[line] = this._newSrcId + + this._calls = this._calls.concat(addHighlightCalls) + } + public clearHighlightsForLine(line: number): void { + const previousLine = this._previousState[line] + + if (!previousLine) { + return + } + + const oldSrcId = this._previousState[line] + this._newState[line] = null + + this._calls.push(["nvim_buf_clear_highlight", [this._bufferId, oldSrcId, line, line + 1]]) + } + + public async apply(): Promise { + if (this._calls.length > 0) { + await this._neovimInstance.request("nvim_call_atomic", [this._calls]) + } + return this._newState + } +} diff --git a/browser/src/Editor/BufferManager.ts b/browser/src/Editor/BufferManager.ts index c118f799b2..172d0f1655 100644 --- a/browser/src/Editor/BufferManager.ts +++ b/browser/src/Editor/BufferManager.ts @@ -17,6 +17,11 @@ import * as Oni from "oni-api" import { EventContext, NeovimInstance } from "./../neovim" import { languageManager, sortTextEdits } from "./../Services/Language" +import { PromiseQueue } from "./../Services/Language/PromiseQueue" + +import * as SyntaxHighlighting from "./../Services/SyntaxHighlighting" + +import { BufferHighlightState, BufferHighlightsUpdater, IBufferHighlightsUpdater } from "./BufferHighlights" import * as Constants from "./../Constants" import * as Log from "./../Log" @@ -34,6 +39,9 @@ export class Buffer implements Oni.Buffer { private _bufferLines: string[] = null private _lastBufferLineVersion: number = -1 + private _promiseQueue = new PromiseQueue() + private _previousHighlightState: BufferHighlightState = {} + public get filePath(): string { return this._filePath } @@ -124,6 +132,27 @@ export class Buffer implements Oni.Buffer { .toPromise() } + public async getOrCreateHighlightGroup(highlight: SyntaxHighlighting.IHighlight | string): Promise { + if (typeof highlight === "string") { + return highlight + } else { + // TODO: needed for theming integration! + return null + } + } + + public async updateHighlights(updateFunction: (highlightsUpdater: IBufferHighlightsUpdater) => void): Promise { + this._promiseQueue.enqueuePromise(async () => { + const bufferId = parseInt(this._id, 10) + const bufferUpdater = new BufferHighlightsUpdater(bufferId, this._neovimInstance, this._previousHighlightState) + await bufferUpdater.start() + + updateFunction(bufferUpdater) + + this._previousHighlightState = await bufferUpdater.apply() + }) + } + public async setLines(start: number, end: number, lines: string[]): Promise { // Clear buffer lines, so that if we make subsequent edits, we are always getting the freshest line // TODO: Speed this up by updating the `_bufferLines` cache instead diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index a96f5f7b3a..6ff9a670e5 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -28,6 +28,7 @@ import { registerBuiltInCommands } from "./../Services/Commands" import { configuration, IConfigurationValues } from "./../Services/Configuration" import { Errors } from "./../Services/Errors" import { addInsertModeLanguageFunctionality, addNormalModeLanguageFunctionality } from "./../Services/Language" +import { ISyntaxHighlighter, NullSyntaxHighlighter, SyntaxHighlighter } from "./../Services/SyntaxHighlighting" import { TypingPredictionManager } from "./../Services/TypingPredictionManager" import { WindowTitle } from "./../Services/WindowTitle" import { workspace } from "./../Services/Workspace" @@ -76,6 +77,7 @@ export class NeovimEditor implements IEditor { private _lastBufferId: string = null private _typingPredictionManager: TypingPredictionManager = new TypingPredictionManager() + private _syntaxHighlighter: ISyntaxHighlighter public get mode(): string { return this._currentMode @@ -115,6 +117,10 @@ export class NeovimEditor implements IEditor { return this._neovimInstance } + public get syntaxHighlighter(): ISyntaxHighlighter { + return this._syntaxHighlighter + } + constructor( private _config = configuration, ) { @@ -218,11 +224,16 @@ export class NeovimEditor implements IEditor { bufferUpdates$.subscribe((bufferUpdate) => { this._onBufferChangedEvent.dispatch(bufferUpdate) UI.Actions.bufferUpdate(parseInt(bufferUpdate.buffer.id, 10), bufferUpdate.buffer.modified, bufferUpdate.buffer.lineCount) + + this._syntaxHighlighter.notifyBufferUpdate(bufferUpdate) }) addInsertModeLanguageFunctionality(this._cursorMovedI$, this._modeChanged$) addNormalModeLanguageFunctionality(bufferUpdates$, this._cursorMoved$, this._modeChanged$) + const textMateHighlightingEnabled = this._config.getValue("experimental.editor.textMateHighlighting.enabled") + this._syntaxHighlighter = textMateHighlightingEnabled ? new SyntaxHighlighter() : new NullSyntaxHighlighter() + this._render() const browserWindow = remote.getCurrentWindow() @@ -277,6 +288,11 @@ export class NeovimEditor implements IEditor { } public dispose(): void { + if (this._syntaxHighlighter) { + this._syntaxHighlighter.dispose() + this._syntaxHighlighter = null + } + // TODO: Implement full disposal logic this._popupMenu.dispose() this._popupMenu = null @@ -353,11 +369,21 @@ export class NeovimEditor implements IEditor { UI.Actions.setMode(newMode) this._currentMode = newMode + + if (newMode === "insert") { + this._syntaxHighlighter.notifyStartInsertMode(this.activeBuffer) + } else { + this._syntaxHighlighter.notifyEndInsertMode(this.activeBuffer) + } + } private _onVimEvent(eventName: string, evt: EventContext): void { UI.Actions.setWindowCursor(evt.windowNumber, evt.line - 1, evt.column - 1) + // Convert to 0-based positions + this._syntaxHighlighter.notifyViewportChanged(evt.bufferNumber.toString(), evt.windowTopLine - 1, evt.windowBottomLine - 1) + const lastBuffer = this.activeBuffer const buf = this._bufferManager.updateBufferFromEvent(evt) diff --git a/browser/src/Editor/NeovimInput.tsx b/browser/src/Editor/NeovimInput.tsx index 417cd3935d..a5d0e4706c 100644 --- a/browser/src/Editor/NeovimInput.tsx +++ b/browser/src/Editor/NeovimInput.tsx @@ -9,7 +9,6 @@ import * as React from "react" import { Mouse } from "./../Input/Mouse" import { NeovimInstance } from "./../neovim" import { NeovimScreen } from "./../Screen" -// import * as UI from "./../UI/index" import { TypingPredictionManager } from "./../Services/TypingPredictionManager" diff --git a/browser/src/PeriodicJobs.ts b/browser/src/PeriodicJobs.ts new file mode 100644 index 0000000000..6e3f348d01 --- /dev/null +++ b/browser/src/PeriodicJobs.ts @@ -0,0 +1,68 @@ +import * as Constants from "./Constants" +import * as Log from "./Log" + +// IPeriodicJob implements the interface for a long-running job +// that would be expensive to run synchronously, so it is +// spread across multiple asynchronous iterations. +export interface IPeriodicJob { + // Execute should return `true` if the job is complete, + // false otherwise + execute(): boolean +} + +export class PeriodicJobManager { + + private _currentScheduledJob: number = null + private _pendingJobs: IPeriodicJob[] = [] + + public startJob(job: IPeriodicJob) { + this._pendingJobs.push(job) + Log.verbose("[PeriodicJobManager]::startJob - " + this._pendingJobs.length + " total jobs.") + this._scheduleJobs() + } + + private _scheduleJobs(): void { + if (this._currentScheduledJob) { + return + } + + if (this._pendingJobs.length === 0) { + Log.verbose("[PeriodicJobManager]::_scheduleJobs - no jobs pending.") + } + + this._currentScheduledJob = window.setTimeout(() => { + const completed = this._executePendingJobs() + window.clearTimeout(this._currentScheduledJob) + this._currentScheduledJob = null + + if (!completed) { + this._scheduleJobs() + } + }, Constants.Delay.INSTANT) + + Log.verbose("[PeriodicJobManager]::_scheduleJobs - " + this._currentScheduledJob) + } + + private _executePendingJobs(): boolean { + const completedJobs: IPeriodicJob[] = [] + this._pendingJobs.forEach((job) => { + const completed = job.execute() + + if (completed) { + completedJobs.push(job) + } + }) + + // Remove completed jobs + this._pendingJobs = this._pendingJobs.filter((job) => completedJobs.indexOf(job) === -1) + + if (this._pendingJobs.length === 0) { + Log.verbose("[PeriodicJobManager] All jobs complete.") + } else { + Log.verbose("[PeriodicJobManager] " + this._pendingJobs.length + " jobs remaining.") + } + + // Return true if all jobs were completed, false otherwise + return this._pendingJobs.length === 0 + } +} diff --git a/browser/src/Plugins/PluginManager.ts b/browser/src/Plugins/PluginManager.ts index 80851d7f7e..1f9533b9fb 100644 --- a/browser/src/Plugins/PluginManager.ts +++ b/browser/src/Plugins/PluginManager.ts @@ -22,8 +22,7 @@ export class PluginManager extends EventEmitter { return this._plugins } - constructor() { - super() + public startPlugins(): Oni.Plugin.Api { this._rootPluginPaths.push(corePluginsRoot) @@ -33,9 +32,7 @@ export class PluginManager extends EventEmitter { } this._rootPluginPaths.push(path.join(this._config.getUserFolder(), "plugins")) - } - public startPlugins(): Oni.Plugin.Api { const allPluginPaths = this._getAllPluginPaths() this._plugins = allPluginPaths.map((pluginRootDirectory) => this._createPlugin(pluginRootDirectory)) diff --git a/browser/src/Services/Configuration/Configuration.ts b/browser/src/Services/Configuration/Configuration.ts index 42ccd83caf..b4821e9a6f 100644 --- a/browser/src/Services/Configuration/Configuration.ts +++ b/browser/src/Services/Configuration/Configuration.ts @@ -31,7 +31,7 @@ export class Configuration implements Oni.Configuration { return this._onConfigurationChangedEvent } - constructor() { + public start(): void { Performance.mark("Config.load.start") this.applyConfig() diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index 066d0eddfd..eb029bd6e9 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -39,6 +39,9 @@ const BaseConfiguration: IConfigurationValues = { { "open": "(", "close": ")" }, ], + "experimental.editor.textMateHighlighting.enabled": false, + "experimental.editor.textMateHighlighting.maxLines": 2000, + "experimental.editor.typingPrediction": false, "experimental.neovim.transport": "stdio", @@ -92,6 +95,32 @@ const BaseConfiguration: IConfigurationValues = { "editor.cursorColumn": false, "editor.cursorColumnOpacity": 0.1, + "editor.tokenColors": [{ + scope: "variable.object", + settings: "Identifier", + }, { + scope: "variable.other.constant", + settings: "Constant", + }, { + scope: "variable.language", + settings: "Identifier", + }, { + scope: "variable.parameter", + settings: "Identifier", + }, { + scope: "variable.other", + settings: "Identifier", + }, { + scope: "support.function", + settings: "Function", + }, { + scope: "entity.name", + settings: "Function", + }, { + scope: "entity.other", + settings: "Constant", + }], + "environment.additionalPaths": [], "language.go.languageServer.command": "go-langserver", @@ -101,25 +130,37 @@ const BaseConfiguration: IConfigurationValues = { "language.css.languageServer.command": cssLanguageServerPath, "language.css.languageServer.arguments": ["--stdio"], + "language.css.textMateGrammar": path.join(__dirname, "extensions", "css", "syntaxes", "css.tmLanguage.json"), "language.less.languageServer.command": cssLanguageServerPath, "language.less.languageServer.arguments": ["--stdio"], + "language.less.textMateGrammar": path.join(__dirname, "extensions", "less", "syntaxes", "less.tmLanguage.json"), "language.scss.languageServer.command": cssLanguageServerPath, "language.scss.languageServer.arguments": ["--stdio"], + "language.scss.textMateGrammar": path.join(__dirname, "extensions", "scss", "syntaxes", "scss.json"), "language.reason.languageServer.command": ocamlLanguageServerPath, "language.reason.languageServer.arguments": ["--stdio"], "language.reason.languageServer.rootFiles": [".merlin", "bsconfig.json"], "language.reason.languageServer.configuration": ocamlAndReasonConfiguration, + "language.reason.textMateGrammar": path.join(__dirname, "extensions", "reason", "syntaxes", "reason.json"), "language.ocaml.languageServer.command": ocamlLanguageServerPath, "language.ocaml.languageServer.arguments": ["--stdio"], "language.ocaml.languageServer.configuration": ocamlAndReasonConfiguration, "language.typescript.completionTriggerCharacters": [".", "/", "\\"], + "language.typescript.textMateGrammar": { + ".ts": path.join(__dirname, "extensions", "typescript", "syntaxes", "TypeScript.tmLanguage.json"), + ".tsx": path.join(__dirname, "extensions", "typescript", "syntaxes", "TypeScriptReact.tmLanguage.json"), + }, "language.javascript.completionTriggerCharacters": [".", "/", "\\"], + "language.javascript.textMateGrammar": { + ".js": path.join(__dirname, "extensions", "javascript", "syntaxes", "JavaScript.tmLanguage.json"), + ".jsx": path.join(__dirname, "extensions", "javascript", "syntaxes", "JavaScriptReact.tmLanguage.json"), + }, "menu.caseSensitive": "smart", diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index 0976bd5f5d..8a15d5abad 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -8,6 +8,13 @@ import * as Oni from "oni-api" +import { IHighlight } from "./../SyntaxHighlighting" + +export interface ITokenColorsSetting { + scope: string + settings: IHighlight | string +} + export interface IConfigurationValues { "activate": (oni: Oni.Plugin.Api) => void @@ -31,9 +38,15 @@ export interface IConfigurationValues { "debug.fakeLag.neovimInput": number | null // Experimental feature flags + // - autoClosingPairs "experimental.autoClosingPairs.enabled": boolean "experimental.autoClosingPairs.default": any + // - textMateHighlighting + "experimental.editor.textMateHighlighting.enabled": boolean + // If a file has more lines than this value, syntax highlighting will be disabled + "experimental.editor.textMateHighlighting.maxLines": number + // The transport to use for Neovim // Valid values are "stdio" and "pipe" "experimental.neovim.transport": string @@ -113,6 +126,9 @@ export interface IConfigurationValues { // If true (default), the buffer scroll bar will be visible "editor.scrollBar.visible": boolean + // Allow overriding token colors for specific textmate scopes + "editor.tokenColors": ITokenColorsSetting[] + // Additional paths to include when launching sub-process from Oni // (and available in terminal integration, later) "environment.additionalPaths": string[] diff --git a/browser/src/Services/Language/Hover.tsx b/browser/src/Services/Language/Hover.tsx index b6c9431ed1..cde4af10c3 100644 --- a/browser/src/Services/Language/Hover.tsx +++ b/browser/src/Services/Language/Hover.tsx @@ -94,6 +94,10 @@ export const renderQuickInfo = (hover: types.Hover, errors: types.Diagnostic[]) const elements = [...errorElements, ...quickInfoElements ] + if (configuration.getValue("experimental.editor.textMateHighlighting.debugScopes")) { + elements.push(getDebugScopesElement()) + } + return
@@ -105,6 +109,31 @@ export const renderQuickInfo = (hover: types.Hover, errors: types.Diagnostic[])
} +const getDebugScopesElement = (): JSX.Element => { + const editor: any = editorManager.activeEditor + + if (!editor || !editor.syntaxHighlighter) { + return null + } + + const cursor = editorManager.activeEditor.activeBuffer.cursor + const scopeInfo = editor.syntaxHighlighter.getHighlightTokenAt(editorManager.activeEditor.activeBuffer.id, { + line: cursor.line, + character: cursor.column, + }) + + if (!scopeInfo || !scopeInfo.scopes) { + return null + } + const items = scopeInfo.scopes.map((si: string) =>
  • {si}
  • ) + return
    +
    DEBUG: TextMate Scopes:
    +
      + {items} +
    +
    +} + const getErrorElements = (errors: types.Diagnostic[], style: any): JSX.Element[] => { if (!errors || !errors.length) { return Selectors.EmptyArray diff --git a/browser/src/Services/SyntaxHighlighting/Definitions.ts b/browser/src/Services/SyntaxHighlighting/Definitions.ts new file mode 100644 index 0000000000..576acffbb1 --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/Definitions.ts @@ -0,0 +1,14 @@ + +import * as types from "vscode-languageserver-types" + +export interface IHighlight { + foregroundColor: string + backgroundColor: string + + bold: boolean + italic: boolean +} + +export type HighlightGroupId = string + +export interface HighlightInfo { range: types.Range, highlightGroup: HighlightGroupId } diff --git a/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts b/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts new file mode 100644 index 0000000000..f6fae9aa00 --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts @@ -0,0 +1,51 @@ +import { IGrammar, Registry } from "vscode-textmate" + +import { configuration } from "./../Configuration" + +export interface IGrammarLoader { + getGrammarForLanguage(language: string, extension: string): Promise +} + +export interface ExtensionToGrammarMap { [extension: string]: string } + +export const getPathForLanguage = (language: string, extension: string): string => { + const grammar: string | ExtensionToGrammarMap = configuration.getValue("language." + language + ".textMateGrammar") + + if (typeof grammar === "string") { + return grammar + } else { + return grammar[extension] || null + } +} + +export class GrammarLoader implements IGrammarLoader { + + private _grammarCache: { [language: string]: IGrammar } = {} + + constructor( + private _registry: Registry = new Registry(), + ) {} + + public async getGrammarForLanguage(language: string, extension: string): Promise { + + if (!language) { + return null + } + + if (this._grammarCache[language]) { + return this._grammarCache[language] + } + + const filePath = getPathForLanguage(language, extension) + + if (!filePath) { + return null + } + + const grammar = this._registry.loadGrammarFromPathSync(filePath) + + this._grammarCache[language] = grammar + + return grammar + } +} diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts new file mode 100644 index 0000000000..0e33816541 --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts @@ -0,0 +1,144 @@ +/** + * SyntaxHighlighting.ts + * + * Handles enhanced syntax highlighting + */ + +import * as throttle from "lodash/throttle" + +import { configuration, Configuration } from "./../Configuration" + +import { editorManager } from "./../EditorManager" +import { HighlightGroupId, HighlightInfo } from "./Definitions" +import { ISyntaxHighlightLineInfo, ISyntaxHighlightState, ISyntaxHighlightTokenInfo } from "./SyntaxHighlightingStore" + +import * as Selectors from "./SyntaxHighlightSelectors" + +import { Store, Unsubscribe } from "redux" + +import * as Log from "./../../Log" + +// SyntaxHighlightReconciler +// +// Essentially a renderer / reconciler, that will push +// highlight calls to the active buffer based on the active +// window and viewport +export class SyntaxHighlightReconciler { + + private _unsubscribe: Unsubscribe + + private _previousState: { [line: number]: ISyntaxHighlightLineInfo} = {} + + constructor( + private _store: Store, + private _configuration: Configuration = configuration, + ) { + + this._unsubscribe = this._store.subscribe(throttle(() => { + + Log.info("[SyntaxHighlightReconciler] Got state update.") + + const state = this._store.getState() + + const activeBuffer: any = editorManager.activeEditor.activeBuffer + + if (!activeBuffer) { + return + } + + const bufferId = activeBuffer.id + + const currentHighlightState = state.bufferToHighlights[bufferId] + + if (currentHighlightState && currentHighlightState.lines) { + const lineNumbers = Object.keys(currentHighlightState.lines) + + const relevantRange = Selectors.getRelevantRange(state, bufferId) + + const filteredLines = lineNumbers.filter((line) => { + const lineNumber = parseInt(line, 10) + + // Ignore lines that are not in current view + if (lineNumber < relevantRange.top + || lineNumber > relevantRange.bottom) { + return false + } + + const latestLine = currentHighlightState.lines[line] + + // If dirty (haven't processed tokens yet) - skip + if (latestLine.dirty) { + return false + } + + // Or lines that haven't been updated + return this._previousState[line] !== currentHighlightState.lines[line] + }) + + const tokens = filteredLines.map((li) => { + const line = currentHighlightState.lines[li] + + const highlights = this._mapTokensToHighlights(line.tokens) + return { + line: parseInt(li, 10), + highlights, + } + }) + + filteredLines.forEach((li) => { + this._previousState[li] = currentHighlightState.lines[li] + }) + + if (tokens.length > 0) { + Log.info("[SyntaxHighlightReconciler] Applying changes to " + tokens.length + " lines.") + activeBuffer.updateHighlights((highlightUpdater: any) => { + tokens.forEach((token) => { + const line = token.line + const highlights = token.highlights + + if (Log.isDebugLoggingEnabled()) { + Log.debug("[SyntaxHighlightingReconciler] Updating tokens for line: " + token.line + " | " + JSON.stringify(highlights)) + } + + highlightUpdater.setHighlightsForLine(line, highlights) + }) + }) + } + } + }, 100)) + } + + public dispose(): void { + if (this._unsubscribe) { + this._unsubscribe() + this._unsubscribe = null + } + } + + private _mapTokensToHighlights(tokens: ISyntaxHighlightTokenInfo[]): HighlightInfo[] { + + const mapTokenToHighlight = (token: ISyntaxHighlightTokenInfo) => ({ + highlightGroup: this._getHighlightGroupFromScope(token.scopes), + range: token.range, + }) + + return tokens.map(mapTokenToHighlight) + .filter((t) => !!t.highlightGroup) + } + + private _getHighlightGroupFromScope(scopes: string[]): HighlightGroupId { + + const configurationColors = this._configuration.getValue("editor.tokenColors") + + for (const scope of scopes) { + const matchingRule = configurationColors.find((c: any) => scope.indexOf(c.scope) === 0) + + if (matchingRule) { + // TODO: Convert to highlight group id + return matchingRule.settings + } + } + + return null + } +} diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightSelectors.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightSelectors.ts new file mode 100644 index 0000000000..7418461a0b --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightSelectors.ts @@ -0,0 +1,30 @@ +// SyntaxHighlightingSelectors.ts +// +// Reducers for handling state changes from ISyntaxHighlightActions + +import { ISyntaxHighlightState } from "./SyntaxHighlightingStore" + +export interface SyntaxHighlightRange { top: number, bottom: number } + +export const NullRange: SyntaxHighlightRange = { top: -1, bottom: -1 } + +export const getRelevantRange = (state: ISyntaxHighlightState, bufferId: number | string): SyntaxHighlightRange => { + + if (!state.bufferToHighlights[bufferId]) { + return NullRange + } + + const buffer = state.bufferToHighlights[bufferId] + + if (!state.isInsertMode) { + return { + top: buffer.topVisibleLine, + bottom: buffer.bottomVisibleLine, + } + } else { + return { + top: buffer.activeInsertModeLine, + bottom: buffer.activeInsertModeLine, + } + } +} diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlighting.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlighting.ts new file mode 100644 index 0000000000..64942ab3ad --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlighting.ts @@ -0,0 +1,159 @@ +/** + * SyntaxHighlighting.ts + * + * Handles enhanced syntax highlighting + */ + +import * as os from "os" +import * as path from "path" + +import * as types from "vscode-languageserver-types" + +import * as Oni from "oni-api" +import { IDisposable } from "oni-types" + +import { Store } from "redux" + +import { createSyntaxHighlightStore, ISyntaxHighlightState, ISyntaxHighlightTokenInfo } from "./SyntaxHighlightingStore" + +import { SyntaxHighlightReconciler } from "./SyntaxHighlightReconciler" + +import * as Log from "./../../Log" +import * as Utility from "./../../Utility" + +export interface ISyntaxHighlighter extends IDisposable { + notifyBufferUpdate(evt: Oni.EditorBufferChangedEventArgs): Promise + notifyViewportChanged(bufferId: string, topLineInView: number, bottomLineInView: number): void + notifyStartInsertMode(buffer: Oni.Buffer): void + notifyEndInsertMode(buffer: Oni.Buffer): void + + getHighlightTokenAt(bufferId: string, position: types.Position): ISyntaxHighlightTokenInfo +} + +export class SyntaxHighlighter implements ISyntaxHighlighter { + + private _store: Store + private _reconciler: SyntaxHighlightReconciler + + constructor() { + this._store = createSyntaxHighlightStore() + this._reconciler = new SyntaxHighlightReconciler(this._store) + } + + public notifyViewportChanged(bufferId: string, topLineInView: number, bottomLineInView: number): void { + + Log.verbose("[SyntaxHighlighting.notifyViewportChanged] - bufferId: " + bufferId + " topLineInView: " + topLineInView + " bottomLineInView: " + bottomLineInView) + + const state = this._store.getState() + const previousBufferState = state.bufferToHighlights[bufferId] + + if (previousBufferState && topLineInView === previousBufferState.topVisibleLine && bottomLineInView === previousBufferState.bottomVisibleLine) { + return + } + + this._store.dispatch({ + type: "SYNTAX_UPDATE_BUFFER_VIEWPORT", + bufferId, + topVisibleLine: topLineInView, + bottomVisibleLine: bottomLineInView, + }) + } + + public notifyStartInsertMode(buffer: Oni.Buffer): void { + this._store.dispatch({ + type: "START_INSERT_MODE", + bufferId: buffer.id, + }) + } + + public async notifyEndInsertMode(buffer: any): Promise { + + const lines = await buffer.getLines(0, buffer.lineCount, false) + + // const currentState = this._store.getState() + + // Send a full refresh of the lines + this._store.dispatch({ + type: "END_INSERT_MODE", + bufferId: buffer.id, + }) + + this._store.dispatch({ + type: "SYNTAX_UPDATE_BUFFER", + extension: path.extname(buffer.filePath), + language: buffer.language, + bufferId: buffer.id, + lines, + }) + } + + public async notifyBufferUpdate(evt: Oni.EditorBufferChangedEventArgs): Promise { + const firstChange = evt.contentChanges[0] + if (!firstChange.range && !firstChange.rangeLength) { + const lines = firstChange.text.split(os.EOL) + this._store.dispatch({ + type: "SYNTAX_UPDATE_BUFFER", + extension: path.extname(evt.buffer.filePath), + language: evt.buffer.language, + bufferId: evt.buffer.id, + lines, + }) + } else { + // Incremental update + this._store.dispatch({ + type: "SYNTAX_UPDATE_BUFFER_LINE", + bufferId: evt.buffer.id, + lineNumber: firstChange.range.start.line, + line: firstChange.text, + }) + } + } + + public getHighlightTokenAt(bufferId: string, position: types.Position): ISyntaxHighlightTokenInfo { + + const state = this._store.getState() + const buffer = state.bufferToHighlights[bufferId] + + if (!buffer) { + return null + } + + const line = buffer.lines[position.line] + + if (!line) { + return null + } + + return line.tokens.find((r) => Utility.isInRange(position.line, position.character, r.range)) + } + + public dispose(): void { + if (this._reconciler) { + this._reconciler.dispose() + this._reconciler = null + } + } +} + +export class NullSyntaxHighlighter implements ISyntaxHighlighter { + public notifyBufferUpdate(evt: Oni.EditorBufferChangedEventArgs): Promise { + return Promise.resolve(null) + } + + public getHighlightTokenAt(bufferId: string, position: types.Position): ISyntaxHighlightTokenInfo { + return null + } + + public notifyViewportChanged(bufferId: string, topLineInView: number, bottomLineInView: number): void { + // tslint: disable-line + } + public notifyStartInsertMode(buffer: Oni.Buffer): void { + // tslint: disable-line + } + + public notifyEndInsertMode(buffer: Oni.Buffer): void { + // tslint: disable-line + } + + public dispose(): void { } // tslint:disable-line +} diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingPeriodicJob.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingPeriodicJob.ts new file mode 100644 index 0000000000..ca2e494ca7 --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingPeriodicJob.ts @@ -0,0 +1,109 @@ +/** + * SyntaxHighlightingPeridiocJob.ts + * + * Periodic (asynchronous) job to process syntax highlights + */ + +import { Store } from "redux" + +import * as types from "vscode-languageserver-types" + +import { IGrammar } from "vscode-textmate" + +import * as SyntaxHighlighting from "./SyntaxHighlightingStore" +import * as Selectors from "./SyntaxHighlightSelectors" + +import { IPeriodicJob } from "./../../PeriodicJobs" + +import * as Log from "./../../Log" + +export const SYNTAX_JOB_BUDGET = 10 // Budget in milliseconds - time to allow the job to run for + +export class SyntaxHighlightingPeriodicJob implements IPeriodicJob { + + constructor( + private _store: Store, + private _bufferId: string, + private _grammar: IGrammar, + private _topLine: number, + private _bottomLine: number, + ) { + } + + public execute(): boolean { + + const start = new Date().getTime() + + // If the window has changed, we should bail + const currentWindow = Selectors.getRelevantRange(this._store.getState(), this._bufferId) + + if (currentWindow.top !== this._topLine || currentWindow.bottom !== this._bottomLine) { + Log.verbose("[SyntaxHighlightingPeriodicJob.execute] Completing without doing work, as window size has changed.") + return true + } + + while (true) { + + const current = new Date().getTime() + + if (current - start > SYNTAX_JOB_BUDGET) { + Log.verbose("[SyntaxHighlightingPeriodicJob.execute] Pending due to exceeding budget.") + return false + } + + const currentState = this._store.getState() + const bufferState = currentState.bufferToHighlights[this._bufferId] + + if (!bufferState) { + return true + } + + const anyDirty = this._tokenizeFirstDirtyLine(bufferState) + + if (!anyDirty) { + return true + } + } + } + + private _tokenizeFirstDirtyLine(state: SyntaxHighlighting.IBufferSyntaxHighlightState): boolean { + + let index = this._topLine + + while (index <= this._bottomLine) { + + const line = state.lines[index] + + if (!line) { + break + } + + if (!line.dirty) { + index++ + continue + } + + const previousStack = index === 0 ? null : state.lines[index - 1].ruleStack + const tokenizeResult = this._grammar.tokenizeLine(line.line, previousStack) + + const tokens = tokenizeResult.tokens.map((t: any) => ({ + range: types.Range.create(index, t.startIndex, index, t.endIndex), + scopes: t.scopes, + })) + + const ruleStack = tokenizeResult.ruleStack + + this._store.dispatch({ + type: "SYNTAX_UPDATE_TOKENS_FOR_LINE", + bufferId: state.bufferId, + lineNumber: index, + tokens, + ruleStack, + }) + + return true + } + + return false + } +} diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingReducer.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingReducer.ts new file mode 100644 index 0000000000..b680b88668 --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingReducer.ts @@ -0,0 +1,179 @@ +// SyntaxHighlightingReducer.ts +// +// Reducers for handling state changes from ISyntaxHighlightActions + +import { IBufferSyntaxHighlightState, ISyntaxHighlightAction, ISyntaxHighlightState, SyntaxHighlightLines } from "./SyntaxHighlightingStore" + +import { Reducer } from "redux" + +export const reducer: Reducer = ( + state: ISyntaxHighlightState = { + isInsertMode: false, + bufferToHighlights: {}, + }, + action: ISyntaxHighlightAction, +) => { + + let newState = state + + switch (action.type) { + case "START_INSERT_MODE": + newState = { + ...state, + isInsertMode: true, + } + break + case "END_INSERT_MODE": + newState = { + ...state, + isInsertMode: false, // If we're getting a full buffer update, assume we're not in insert mode + } + break + } + + return { + ...newState, + bufferToHighlights: bufferToHighlightsReducer(state.bufferToHighlights, action), + } +} + +export const bufferToHighlightsReducer: Reducer<{ [bufferId: string]: IBufferSyntaxHighlightState }> = ( + state: { [bufferId: string]: IBufferSyntaxHighlightState } = {}, + action: ISyntaxHighlightAction, +) => { + return { + ...state, + [action.bufferId]: bufferReducer(state[action.bufferId], action), + } +} + +export const bufferReducer: Reducer = ( + state: IBufferSyntaxHighlightState = { + bufferId: null, + extension: null, + language: null, + topVisibleLine: -1, + bottomVisibleLine: -1, + activeInsertModeLine: -1, + lines: {}, + }, + action: ISyntaxHighlightAction, +) => { + + switch (action.type) { + case "START_INSERT_MODE": + return { + ...state, + activeInsertModeLine: -1, + } + case "SYNTAX_UPDATE_BUFFER": + return { + ...state, + bufferId: action.bufferId, + language: action.language, + extension: action.extension, + lines: linesReducer(state.lines, action), + } + case "SYNTAX_UPDATE_BUFFER_LINE": + return { + ...state, + activeInsertModeLine: action.lineNumber, + lines: linesReducer(state.lines, action), + } + case "SYNTAX_UPDATE_BUFFER_VIEWPORT": + return { + ...state, + topVisibleLine: action.topVisibleLine, + bottomVisibleLine: action.bottomVisibleLine, + } + case "SYNTAX_UPDATE_TOKENS_FOR_LINE": + return { + ...state, + lines: linesReducer(state.lines, action), + } + default: + return state + } +} + +export const linesReducer: Reducer = ( + state: SyntaxHighlightLines = {}, + action: ISyntaxHighlightAction, +) => { + + switch (action.type) { + case "SYNTAX_UPDATE_TOKENS_FOR_LINE": + { + const newState = { + ...state, + } + + const originalLine = newState[action.lineNumber] + + // If the ruleStack changed, we need to invalidate the next line + const shouldDirtyNextLine = originalLine && originalLine.ruleStack && !originalLine.ruleStack.equals(action.ruleStack) + + newState[action.lineNumber] = { + ...originalLine, + dirty: false, + tokens: action.tokens, + ruleStack: action.ruleStack, + } + + const nextLine = newState[action.lineNumber + 1] + if (shouldDirtyNextLine && nextLine) { + newState[action.lineNumber + 1] = { + ...nextLine, + dirty: true, + } + } + + return newState + } + case "SYNTAX_UPDATE_BUFFER_LINE": + { + const newState = { + ...state, + } + + // Set 'dirty' flag for updated line to true + const oldLine = newState[action.lineNumber] + newState[action.lineNumber] = { + tokens: [], + ruleStack: null, + ...oldLine, + line: action.line, + dirty: true, + } + + return newState + } + case "SYNTAX_UPDATE_BUFFER": + + const updatedBufferState: SyntaxHighlightLines = { + ...state, + } + + for (let i = 0; i < action.lines.length; i++) { + const oldLine = updatedBufferState[i] + const newLine = action.lines[i] + + if (oldLine && oldLine.line === newLine) { + continue + } + + updatedBufferState[i] = { + tokens: [], + ruleStack: null, + ...oldLine, + line: newLine, + dirty: true, + } + + } + + return updatedBufferState + } + + return state +} diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingStore.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingStore.ts new file mode 100644 index 0000000000..174962475c --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightingStore.ts @@ -0,0 +1,151 @@ +/** + * SyntaxHighlighting.ts + * + * Handles enhanced syntax highlighting + */ + +import * as types from "vscode-languageserver-types" + +import { StackElement } from "vscode-textmate" + +import * as Log from "./../../Log" +import * as PeriodicJobs from "./../../PeriodicJobs" + +import { configuration } from "./../Configuration" + +import { GrammarLoader } from "./GrammarLoader" +import { SyntaxHighlightingPeriodicJob } from "./SyntaxHighlightingPeriodicJob" +import * as Selectors from "./SyntaxHighlightSelectors" + +const syntaxHighlightingJobs = new PeriodicJobs.PeriodicJobManager() + +export interface ISyntaxHighlightTokenInfo { + scopes: string[] + range: types.Range +} + +export interface ISyntaxHighlightLineInfo { + line: string + ruleStack: StackElement + tokens: ISyntaxHighlightTokenInfo[] + dirty: boolean, +} + +export interface SyntaxHighlightLines {[key: number]: ISyntaxHighlightLineInfo} + +export interface IBufferSyntaxHighlightState { + bufferId: string + language: string + extension: string + + // This doesn't work quite right if we have a buffer open in a separate window... + topVisibleLine: number + bottomVisibleLine: number + + // When in insert mode, we'll just syntax highlight that line + // Upon leaving insert mode, we'll refresh the whole view + activeInsertModeLine: number + + lines: SyntaxHighlightLines +} + +export interface ISyntaxHighlightState { + isInsertMode: boolean + bufferToHighlights: { + [bufferId: string]: IBufferSyntaxHighlightState, + } +} + +export type ISyntaxHighlightAction = { + type: "SYNTAX_UPDATE_BUFFER", + language: string, + extension: string, + bufferId: string, + lines: string[], +} | { + type: "SYNTAX_UPDATE_BUFFER_LINE", + bufferId: string, + lineNumber: number, + line: string, + } | { + type: "SYNTAX_UPDATE_TOKENS_FOR_LINE", + bufferId: string, + lineNumber: number, + tokens: ISyntaxHighlightTokenInfo[], + ruleStack: StackElement, + } | { + type: "SYNTAX_UPDATE_BUFFER_VIEWPORT", + bufferId: string, + topVisibleLine: number, + bottomVisibleLine: number, + } | { + type: "START_INSERT_MODE", + bufferId: string, + } | { + type: "END_INSERT_MODE", + bufferId: string, + } + +import { applyMiddleware, createStore, Store } from "redux" +import { reducer } from "./SyntaxHighlightingReducer" + +const grammarLoader = new GrammarLoader() + +const updateTokenMiddleware = (store: any) => (next: any) => (action: any) => { + const result: ISyntaxHighlightAction = next(action) + + if (action.type === "SYNTAX_UPDATE_BUFFER" + || action.type === "SYNTAX_UPDATE_BUFFER_LINE" + || action.type === "SYNTAX_UPDATE_BUFFER_VIEWPORT") { + + const state = store.getState() + const bufferId = action.bufferId + + const language = state.bufferToHighlights[bufferId].language + const extension = state.bufferToHighlights[bufferId].extension + + if (!language || !extension) { + return result + } + + grammarLoader.getGrammarForLanguage(language, extension) + .then((grammar) => { + + if (!grammar) { + return + } + + const buffer = state.bufferToHighlights[bufferId] + + if (Object.keys(buffer.lines).length >= configuration.getValue("experimental.editor.textMateHighlighting.maxLines")) { + Log.info("[SyntaxHighlighting - fullBufferUpdateEpic]: Not applying syntax highlighting as the maxLines limit was exceeded") + return + } + + const relevantRange = Selectors.getRelevantRange(state, bufferId) + + syntaxHighlightingJobs.startJob(new SyntaxHighlightingPeriodicJob( + store as any, + action.bufferId, + grammar, + relevantRange.top, + relevantRange.bottom, + )) + }) + } + + return result +} + +const logger = (store: any) => (next: any) => (action: any) => { + // console.log("dispatching action: " + action.type + "|" + JSON.stringify(action)) + return next(action) +} + +export const createSyntaxHighlightStore = (): Store => { + const syntaxHighlightStore: Store = createStore(reducer, + applyMiddleware(updateTokenMiddleware, logger) as any, + ) + + return syntaxHighlightStore +} diff --git a/browser/src/Services/SyntaxHighlighting/index.ts b/browser/src/Services/SyntaxHighlighting/index.ts new file mode 100644 index 0000000000..3156d4bd61 --- /dev/null +++ b/browser/src/Services/SyntaxHighlighting/index.ts @@ -0,0 +1,4 @@ +export * from "./Definitions" +export * from "./SyntaxHighlighting" +export * from "./SyntaxHighlightingReducer" +export * from "./SyntaxHighlightingStore" diff --git a/browser/src/UI/components/QuickInfo.tsx b/browser/src/UI/components/QuickInfo.tsx index b7738ed8a0..997f0d446d 100644 --- a/browser/src/UI/components/QuickInfo.tsx +++ b/browser/src/UI/components/QuickInfo.tsx @@ -2,46 +2,8 @@ import * as os from "os" import * as React from "react" -import * as Colors from "./../Colors" - -import { CursorPositioner } from "./CursorPositioner" - require("./QuickInfo.less") // tslint:disable-line no-var-requires -export interface IQuickInfoProps { - visible: boolean - elements: JSX.Element[] - - backgroundColor: string - foregroundColor: string -} - -export class QuickInfo extends React.PureComponent { - - public render(): null | JSX.Element { - if (!this.props.elements || !this.props.elements.length) { - return null - } - - const borderColorString = Colors.getBorderColor(this.props.backgroundColor, this.props.foregroundColor) - - const quickInfoStyle: React.CSSProperties = { - "opacity": this.props.visible ? 1 : 0, - backgroundColor: this.props.backgroundColor, - border: `1px solid ${borderColorString}`, - color: this.props.foregroundColor, - } - - return -
    -
    - {this.props.elements} -
    -
    -
    - } -} - export interface ITextProps { text: string } diff --git a/browser/src/index.tsx b/browser/src/index.tsx index ae60b40b19..21b71ce886 100644 --- a/browser/src/index.tsx +++ b/browser/src/index.tsx @@ -68,9 +68,16 @@ const start = (args: string[]) => { browserWindow.setFullScreen(configuration.getValue("editor.fullScreenOnStart")) } + configuration.start() configChange(configuration.getValues()) // initialize values configuration.onConfigurationChanged.subscribe(configChange) + performance.mark("NeovimInstance.Plugins.Start") + const api = pluginManager.startPlugins() + performance.mark("NeovimInstance.Plugins.End") + + configuration.activate(api) + UI.init(pluginManager, parsedArgs._) ipcRenderer.on("execute-command", (_evt: any, command: string) => { @@ -79,12 +86,6 @@ const start = (args: string[]) => { createLanguageClientsFromConfiguration(configuration.getValues()) - performance.mark("NeovimInstance.Plugins.Start") - const api = pluginManager.startPlugins() - performance.mark("NeovimInstance.Plugins.End") - - configuration.activate(api) - AutoClosingPairs.activate(configuration, editorManager, inputManager, languageManager) checkForUpdates() diff --git a/browser/test/Services/SyntaxHighlighting/SyntaxHighlightingReducerTests.ts b/browser/test/Services/SyntaxHighlighting/SyntaxHighlightingReducerTests.ts new file mode 100644 index 0000000000..fe0ff2c89b --- /dev/null +++ b/browser/test/Services/SyntaxHighlighting/SyntaxHighlightingReducerTests.ts @@ -0,0 +1,87 @@ +import * as assert from "assert" + +import * as SyntaxHighlighting from "./../../../src/Services/SyntaxHighlighting" + +describe("SyntaxHighlightingReducer", () => { + + describe("linesReducer", () => { + + describe("SYNTAX_UPDATE_BUFFER", () => { + + it("sets buffer lines if they don't exist yet", () => { + const originalState: SyntaxHighlighting.SyntaxHighlightLines = {} + + const updateBufferAction: SyntaxHighlighting.ISyntaxHighlightAction = { + type: "SYNTAX_UPDATE_BUFFER", + extension: "ts", + language: "any", + bufferId: "1", + lines: [ + "line1", + "line2", + ], + } + + const newState = SyntaxHighlighting.linesReducer(originalState, updateBufferAction) + + assert.deepEqual(newState["0"], { + line: "line1", + dirty: true, + ruleStack: null, + tokens: [], + }) + + assert.deepEqual(newState["1"], { + line: "line2", + dirty: true, + ruleStack: null, + tokens: [], + }) + }) + + it("only sets changed lines to dirty", () => { + const originalState: SyntaxHighlighting.SyntaxHighlightLines = { + "0": { + ruleStack: null, + tokens: [], + line: "line1", + dirty: false, + }, + "1": { + ruleStack: null, + tokens: [], + line: "line2", + dirty: false, + }, + } + + const updateBufferAction: SyntaxHighlighting.ISyntaxHighlightAction = { + type: "SYNTAX_UPDATE_BUFFER", + extension: "ts", + language: "any", + bufferId: "1", + lines: [ + "line1", + "line2_update", + ], + } + + const newState = SyntaxHighlighting.linesReducer(originalState, updateBufferAction) + + assert.deepEqual(newState["0"], { + ruleStack: null, + tokens: [], + line: "line1", + dirty: false, + }) + + assert.deepEqual(newState["1"], { + ruleStack: null, + tokens: [], + line: "line2_update", + dirty: true, + }) + }) + }) + }) +}) diff --git a/browser/webpack.debug.config.js b/browser/webpack.debug.config.js index b1234f5599..e24c304259 100644 --- a/browser/webpack.debug.config.js +++ b/browser/webpack.debug.config.js @@ -7,6 +7,7 @@ module.exports = { ], target: "electron-renderer", externals: { + "vscode-textmate": "require('vscode-textmate')", "vscode-languageserver-types": "require('vscode-languageserver-types')", "keyboard-layout": "require('keyboard-layout')", "gifshot": "require('gifshot')" diff --git a/extensions/README.md b/extensions/README.md new file mode 100644 index 0000000000..f78e238354 --- /dev/null +++ b/extensions/README.md @@ -0,0 +1,6 @@ +# NOTE TO CONTRIBUTORS + +- The majority of these syntaxes (and configurations) are brought from the VSCode repository: https://github.com/Microsoft/vscode + +Exceptions: +- reason - brought from the `vscode-reasonml` repository: https://github.com/reasonml-editor/vscode-reasonml diff --git a/extensions/css/syntaxes/css.tmLanguage.json b/extensions/css/syntaxes/css.tmLanguage.json new file mode 100644 index 0000000000..95caf37121 --- /dev/null +++ b/extensions/css/syntaxes/css.tmLanguage.json @@ -0,0 +1,1807 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-css/blob/master/grammars/css.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/atom/language-css/commit/ec289867164a34fce48a69776b7f8dc380e3dc37", + "scopeName": "source.css", + "name": "CSS", + "fileTypes": [ + "css", + "css.erb" + ], + "firstLineMatch": "(?xi)\n# Emacs modeline\n-\\*-(?:\\s*(?=[^:;\\s]+\\s*-\\*-)|(?:.*?[;\\s]|(?<=-\\*-))mode\\s*:\\s*)\n css\n(?=[\\s;]|(?]?\\d+|m)?|\\sex)(?=:(?=\\s*set?\\s[^\\n:]+:)|:(?!\\s*set?\\s))(?:(?:\\s|\\s*:\\s*)\\w*(?:\\s*=(?:[^\\n\\\\\\s]|\\\\.)*)?)*[\\s:](?:filetype|ft|syntax)\\s*=\n css\n(?=\\s|:|$)", + "patterns": [ + { + "include": "#comment-block" + }, + { + "include": "#escapes" + }, + { + "include": "#combinators" + }, + { + "include": "#selector" + }, + { + "include": "#at-rules" + }, + { + "include": "#rule-list" + } + ], + "repository": { + "at-rules": { + "patterns": [ + { + "begin": "\\A(?:\\xEF\\xBB\\xBF)?(?i:(?=\\s*@charset\\b))", + "end": ";|(?=$)", + "endCaptures": { + "0": { + "name": "punctuation.terminator.rule.css" + } + }, + "name": "meta.at-rule.charset.css", + "patterns": [ + { + "captures": { + "1": { + "name": "invalid.illegal.not-lowercase.charset.css" + }, + "2": { + "name": "invalid.illegal.leading-whitespace.charset.css" + }, + "3": { + "name": "invalid.illegal.no-whitespace.charset.css" + }, + "4": { + "name": "invalid.illegal.whitespace.charset.css" + }, + "5": { + "name": "invalid.illegal.not-double-quoted.charset.css" + }, + "6": { + "name": "invalid.illegal.unclosed-string.charset.css" + }, + "7": { + "name": "invalid.illegal.unexpected-characters.charset.css" + } + }, + "match": "(?x) # Possible errors:\n\\G\n((?!@charset)@\\w+) # Not lowercase (@charset is case-sensitive)\n|\n\\G(\\s+) # Preceding whitespace\n|\n(@charset\\S[^;]*) # No whitespace after @charset\n|\n(?<=@charset) # Before quoted charset name\n(\\x20{2,}|\\t+) # More than one space used, or a tab\n|\n(?<=@charset\\x20) # Beginning of charset name\n([^\";]+) # Not double-quoted\n|\n(\"[^\"]+$) # Unclosed quote\n|\n(?<=\") # After charset name\n([^;]+) # Unexpected junk instead of semicolon" + }, + { + "captures": { + "1": { + "name": "keyword.control.at-rule.charset.css" + }, + "2": { + "name": "punctuation.definition.keyword.css" + } + }, + "match": "((@)charset)(?=\\s)" + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.css" + } + }, + "end": "\"|$", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.css" + } + }, + "name": "string.quoted.double.css", + "patterns": [ + { + "begin": "(?:\\G|^)(?=(?:[^\"])+$)", + "end": "$", + "name": "invalid.illegal.unclosed.string.css" + } + ] + } + ] + }, + { + "begin": "(?i)((@)import)(?:\\s+|$|(?=['\"]|/\\*))", + "beginCaptures": { + "1": { + "name": "keyword.control.at-rule.import.css" + }, + "2": { + "name": "punctuation.definition.keyword.css" + } + }, + "end": ";", + "endCaptures": { + "0": { + "name": "punctuation.terminator.rule.css" + } + }, + "name": "meta.at-rule.import.css", + "patterns": [ + { + "begin": "\\G\\s*(?=/\\*)", + "end": "(?<=\\*/)\\s*", + "patterns": [ + { + "include": "#comment-block" + } + ] + }, + { + "include": "#string" + }, + { + "include": "#url" + }, + { + "include": "#media-query-list" + } + ] + }, + { + "begin": "(?i)((@)font-face)(?=\\s*|{|/\\*|$)", + "beginCaptures": { + "1": { + "name": "keyword.control.at-rule.font-face.css" + }, + "2": { + "name": "punctuation.definition.keyword.css" + } + }, + "end": "(?!\\G)", + "name": "meta.at-rule.font-face.css", + "patterns": [ + { + "include": "#comment-block" + }, + { + "include": "#escapes" + }, + { + "include": "#rule-list" + } + ] + }, + { + "begin": "(?i)(@)page(?=[\\s:{]|/\\*|$)", + "captures": { + "0": { + "name": "keyword.control.at-rule.page.css" + }, + "1": { + "name": "punctuation.definition.keyword.css" + } + }, + "end": "(?=\\s*($|[:{;]))", + "name": "meta.at-rule.page.css", + "patterns": [ + { + "include": "#rule-list" + } + ] + }, + { + "begin": "(?i)(?=@media(\\s|\\(|/\\*|$))", + "end": "(?<=})(?!\\G)", + "patterns": [ + { + "begin": "(?i)\\G(@)media", + "beginCaptures": { + "0": { + "name": "keyword.control.at-rule.media.css" + }, + "1": { + "name": "punctuation.definition.keyword.css" + } + }, + "end": "(?=\\s*[{;])", + "name": "meta.at-rule.media.header.css", + "patterns": [ + { + "include": "#media-query-list" + } + ] + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.media.begin.bracket.curly.css" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.media.end.bracket.curly.css" + } + }, + "name": "meta.at-rule.media.body.css", + "patterns": [ + { + "include": "$self" + } + ] + } + ] + }, + { + "begin": "(?i)(?=@counter-style([\\s'\"{;]|/\\*|$))", + "end": "(?<=})(?!\\G)", + "patterns": [ + { + "begin": "(?i)\\G(@)counter-style", + "beginCaptures": { + "0": { + "name": "keyword.control.at-rule.counter-style.css" + }, + "1": { + "name": "punctuation.definition.keyword.css" + } + }, + "end": "(?=\\s*{)", + "name": "meta.at-rule.counter-style.header.css", + "patterns": [ + { + "include": "#comment-block" + }, + { + "include": "#escapes" + }, + { + "captures": { + "0": { + "patterns": [ + { + "include": "#escapes" + } + ] + } + }, + "match": "(?x)\n(?:[-a-zA-Z_] | [^\\x00-\\x7F]) # First letter\n(?:[-a-zA-Z0-9_] | [^\\x00-\\x7F] # Remainder of identifier\n |\\\\(?:[0-9a-fA-F]{1,6}|.)\n)*", + "name": "variable.parameter.style-name.css" + } + ] + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.property-list.begin.bracket.curly.css" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.property-list.end.bracket.curly.css" + } + }, + "name": "meta.at-rule.counter-style.body.css", + "patterns": [ + { + "include": "#comment-block" + }, + { + "include": "#escapes" + }, + { + "include": "#rule-list-innards" + } + ] + } + ] + }, + { + "begin": "(?i)(?=@document([\\s'\"{;]|/\\*|$))", + "end": "(?<=})(?!\\G)", + "patterns": [ + { + "begin": "(?i)\\G(@)document", + "beginCaptures": { + "0": { + "name": "keyword.control.at-rule.document.css" + }, + "1": { + "name": "punctuation.definition.keyword.css" + } + }, + "end": "(?=\\s*[{;])", + "name": "meta.at-rule.document.header.css", + "patterns": [ + { + "begin": "(?i)(?>>", + "name": "invalid.deprecated.combinator.css" + }, + { + "match": ">>|>|\\+|~", + "name": "keyword.operator.combinator.css" + } + ] + }, + "commas": { + "match": ",", + "name": "punctuation.separator.list.comma.css" + }, + "comment-block": { + "begin": "/\\*", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.css" + } + }, + "end": "\\*/", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.css" + } + }, + "name": "comment.block.css" + }, + "escapes": { + "patterns": [ + { + "match": "\\\\[0-9a-fA-F]{1,6}", + "name": "constant.character.escape.codepoint.css" + }, + { + "begin": "\\\\$\\s*", + "end": "^(?<:=]|\\)|/\\*) # Terminates cleanly" + }, + "media-feature-keywords": { + "match": "(?xi)\n(?<=^|\\s|:|\\*/)\n(?: portrait # Orientation\n | landscape\n | progressive # Scan types\n | interlace\n | fullscreen # Display modes\n | standalone\n | minimal-ui\n | browser\n)\n(?=\\s|\\)|$)", + "name": "support.constant.property-value.css" + }, + "media-query": { + "begin": "\\G", + "end": "(?=\\s*[{;])", + "patterns": [ + { + "include": "#comment-block" + }, + { + "include": "#escapes" + }, + { + "include": "#media-types" + }, + { + "match": "(?i)(?<=\\s|^|,|\\*/)(only|not)(?=\\s|{|/\\*|$)", + "name": "keyword.operator.logical.$1.media.css" + }, + { + "match": "(?i)(?<=\\s|^|\\*/|\\))and(?=\\s|/\\*|$)", + "name": "keyword.operator.logical.and.media.css" + }, + { + "match": ",(?:(?:\\s*,)+|(?=\\s*[;){]))", + "name": "invalid.illegal.comma.css" + }, + { + "include": "#commas" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.parameters.begin.bracket.round.css" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.css" + } + }, + "patterns": [ + { + "include": "#media-features" + }, + { + "include": "#media-feature-keywords" + }, + { + "match": ":", + "name": "punctuation.separator.key-value.css" + }, + { + "match": ">=|<=|=|<|>", + "name": "keyword.operator.comparison.css" + }, + { + "captures": { + "1": { + "name": "constant.numeric.css" + }, + "2": { + "name": "keyword.operator.arithmetic.css" + }, + "3": { + "name": "constant.numeric.css" + } + }, + "match": "(\\d+)\\s*(/)\\s*(\\d+)", + "name": "meta.ratio.css" + }, + { + "include": "#numeric-values" + }, + { + "include": "#comment-block" + } + ] + } + ] + }, + "media-query-list": { + "begin": "(?=\\s*[^{;])", + "end": "(?=\\s*[{;])", + "patterns": [ + { + "include": "#media-query" + } + ] + }, + "media-types": { + "captures": { + "1": { + "name": "support.constant.media.css" + }, + "2": { + "name": "invalid.deprecated.constant.media.css" + } + }, + "match": "(?xi)\n(?<=^|\\s|,|\\*/)\n(?:\n # Valid media types\n (all|print|screen|speech)\n |\n # Deprecated in Media Queries 4: http://dev.w3.org/csswg/mediaqueries/#media-types\n (aural|braille|embossed|handheld|projection|tty|tv)\n)\n(?=$|[{,\\s;]|/\\*)" + }, + "numeric-values": { + "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.definition.constant.css" + } + }, + "match": "(#)(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\\b", + "name": "constant.other.color.rgb-value.hex.css" + }, + { + "captures": { + "1": { + "name": "keyword.other.unit.percentage.css" + }, + "2": { + "name": "keyword.other.unit.${2:/downcase}.css" + } + }, + "match": "(?xi) (?+~|] # - Followed by another selector\n | /\\* # - Followed by a block comment\n )\n |\n # Name contains unescaped ASCII symbol\n (?: # Check for acceptable preceding characters\n [-a-zA-Z_0-9]|[^\\x00-\\x7F] # - Valid selector character\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # - Escape sequence\n )*\n (?: # Invalid punctuation\n [!\"'%&(*;+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.class.css" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#escapes" + } + ] + } + }, + "match": "(?x)\n(\\#)\n(\n -?\n (?![0-9])\n (?:[-a-zA-Z0-9_]|[^\\x00-\\x7F]|\\\\(?:[0-9a-fA-F]{1,6}|.))+\n)\n(?=$|[\\s,.\\#)\\[:{>+~|]|/\\*)", + "name": "entity.other.attribute-name.id.css" + }, + { + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "punctuation.definition.entity.begin.bracket.square.css" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "punctuation.definition.entity.end.bracket.square.css" + } + }, + "name": "meta.attribute-selector.css", + "patterns": [ + { + "include": "#comment-block" + }, + { + "include": "#string" + }, + { + "captures": { + "1": { + "name": "storage.modifier.ignore-case.css" + } + }, + "match": "(?<=[\"'\\s]|^|\\*/)\\s*([iI])\\s*(?=[\\s\\]]|/\\*|$)" + }, + { + "captures": { + "1": { + "name": "string.unquoted.attribute-value.css", + "patterns": [ + { + "include": "#escapes" + } + ] + } + }, + "match": "(?x)(?<==)\\s*((?!/\\*)(?:[^\\\\\"'\\s\\]]|\\\\.)+)" + }, + { + "include": "#escapes" + }, + { + "match": "[~|^$*]?=", + "name": "keyword.operator.pattern.css" + }, + { + "match": "\\|", + "name": "punctuation.separator.css" + }, + { + "captures": { + "1": { + "name": "entity.other.namespace-prefix.css", + "patterns": [ + { + "include": "#escapes" + } + ] + } + }, + "match": "(?x)\n# Qualified namespace prefix\n( -?(?!\\d)(?:[\\w-]|[^\\x00-\\x7F]|\\\\(?:[0-9a-fA-F]{1,6}|.))+\n| \\*\n)\n# Lookahead to ensure there's a valid identifier ahead\n(?=\n \\| (?!\\s|=|$|\\])\n (?: -?(?!\\d)\n | [\\\\\\w-]\n | [^\\x00-\\x7F]\n )\n)" + }, + { + "captures": { + "1": { + "name": "entity.other.attribute-name.css", + "patterns": [ + { + "include": "#escapes" + } + ] + } + }, + "match": "(?x)\n(-?(?!\\d)(?>[\\w-]|[^\\x00-\\x7F]|\\\\(?:[0-9a-fA-F]{1,6}|.))+)\n\\s*\n(?=[~|^\\]$*=]|/\\*)" + } + ] + }, + { + "include": "#pseudo-classes" + }, + { + "include": "#pseudo-elements" + }, + { + "include": "#functional-pseudo-classes" + }, + { + "match": "(?x) (?\\s,.\\#|){:\\[]|/\\*|$)", + "name": "entity.name.tag.css" + }, + "unicode-range": { + "captures": { + "0": { + "name": "constant.other.unicode-range.css" + }, + "1": { + "name": "punctuation.separator.dash.unicode-range.css" + } + }, + "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js entity.name.function.js" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js", + "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js variable.other.constant.js" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js variable.other.readwrite.js" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + } + ] + }, + "var-single-variable-type-annotation": { + "patterns": [ + { + "include": "#type-annotation" + }, + { + "include": "#string" + }, + { + "include": "#comment" + } + ] + }, + "destructuring-variable": { + "patterns": [ + { + "name": "meta.object-binding-pattern-variable.js", + "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.js" + }, + "2": { + "name": "keyword.operator.rest.js" + }, + "3": { + "name": "entity.name.function.js variable.language.this.js" + }, + "4": { + "name": "entity.name.function.js" + }, + "5": { + "name": "keyword.operator.optional.js" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.js variable.object.property.js", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.js", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.js" + }, + "2": { + "name": "variable.parameter.js" + } + } + }, + { + "name": "meta.arrow.js", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.js", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.js", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "captures": { + "0": { + "name": "meta.object-literal.key.js" + }, + "1": { + "name": "entity.name.function.js" + } + } + }, + { + "name": "meta.object.member.js", + "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", + "captures": { + "0": { + "name": "meta.object-literal.key.js" + } + } + }, + { + "name": "meta.object.member.js", + "begin": "\\.\\.\\.", + "beginCaptures": { + "0": { + "name": "keyword.operator.spread.js" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", + "captures": { + "1": { + "name": "variable.other.readwrite.js" + } + } + }, + { + "name": "meta.object.member.js", + "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", + "end": "(?=,|\\}|$)", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.js punctuation.separator.key-value.js" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "include": "#punctuation-comma" + } + ] + }, + "ternary-expression": { + "begin": "(\\?)", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.js" + } + }, + "end": "(:)", + "endCaptures": { + "0": { + "name": "keyword.operator.ternary.js" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "function-call": { + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "name": "meta.function-call.js", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", + "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "include": "#literal" + }, + { + "include": "#support-objects" + }, + { + "include": "#object-identifiers" + }, + { + "include": "#punctuation-accessor" + }, + { + "name": "keyword.operator.expression.import.js", + "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" + }, + { + "name": "entity.name.function.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)" + } + ] + }, + { + "include": "#comment" + }, + { + "name": "meta.type.parameters.js", + "begin": "\\<", + "beginCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.begin.js" + } + }, + "end": "\\>", + "endCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.end.js" + } + }, + "patterns": [ + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + { + "include": "#paren-expression" + } + ] + }, + "new-expr": { + "name": "new.expr.js", + "begin": "(?>=|>>>=|\\|=" + }, + { + "name": "keyword.operator.bitwise.shift.js", + "match": "<<|>>>|>>" + }, + { + "name": "keyword.operator.comparison.js", + "match": "===|!==|==|!=" + }, + { + "name": "keyword.operator.relational.js", + "match": "<=|>=|<>|<|>" + }, + { + "name": "keyword.operator.logical.js", + "match": "\\!|&&|\\|\\|" + }, + { + "name": "keyword.operator.bitwise.js", + "match": "\\&|~|\\^|\\|" + }, + { + "name": "keyword.operator.assignment.js", + "match": "\\=" + }, + { + "name": "keyword.operator.decrement.js", + "match": "--" + }, + { + "name": "keyword.operator.increment.js", + "match": "\\+\\+" + }, + { + "name": "keyword.operator.arithmetic.js", + "match": "%|\\*|/|-|\\+" + }, + { + "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", + "captures": { + "1": { + "name": "keyword.operator.arithmetic.js" + } + } + } + ] + }, + "typeof-operator": { + "name": "keyword.operator.expression.typeof.js", + "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "support.constant.dom.js" + }, + "3": { + "name": "support.variable.property.dom.js" + } + } + }, + { + "name": "support.class.node.js", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "entity.name.function.js" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.constant.property.js" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.property.js" + } + } + }, + { + "name": "variable.other.constant.js", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.js", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.constant.object.property.js" + }, + "3": { + "name": "variable.other.object.property.js" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.js" + }, + "2": { + "name": "variable.other.object.js" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.js", + "begin": "(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "meta.type.annotation.js", + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.js", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "begin": "(?<=[:])(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-parameters": { + "name": "meta.type.parameters.js", + "begin": "(<)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.begin.js" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.js" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.js", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] + }, + "type-primitive": { + "name": "support.type.primitive.js", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.js", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.js", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.js", + "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.js" + } + }, + "end": "(/)([gimuy]*)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.js" + }, + "2": { + "name": "keyword.other.js" + } + }, + "patterns": [ + { + "include": "#regexp" + } + ] + }, + { + "name": "string.regexp.js", + "begin": "(?\\s*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.js" + } + }, + "end": "(?=^)", + "patterns": [ + { + "name": "meta.tag.js", + "begin": "(<)(reference|amd-dependency|amd-module)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.directive.js" + }, + "2": { + "name": "entity.name.tag.directive.js" + } + }, + "end": "/>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.directive.js" + } + }, + "patterns": [ + { + "name": "entity.other.attribute-name.directive.js", + "match": "path|types|no-default-lib|name" + }, + { + "name": "keyword.operator.assignment.js", + "match": "=" + }, + { + "include": "#string" + } + ] + } + ] + }, + "docblock": { + "patterns": [ + { + "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.access-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "5": { + "name": "constant.other.email.link.underline.jsdoc" + }, + "6": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "keyword.operator.control.jsdoc" + }, + "5": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "name": "meta.example.jsdoc", + "begin": "((@)example)\\s+", + "end": "(?=@|\\*/)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "patterns": [ + { + "match": "^\\s\\*\\s+" + }, + { + "contentName": "constant.other.description.jsdoc", + "begin": "\\G(<)caption(>)", + "beginCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + }, + "end": "()|(?=\\*/)", + "endCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "[^\\s@*](?:[^*]|\\*[^/])*", + "captures": { + "0": { + "name": "source.embedded.js" + } + } + } + ] + }, + { + "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.symbol-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.link.underline.jsdoc" + }, + "4": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "begin": "((@)typedef)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "entity.name.type.instance.jsdoc", + "match": "(?:[^@\\s*/]|\\*[^/])+" + } + ] + }, + { + "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + }, + { + "name": "variable.other.jsdoc", + "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", + "captures": { + "1": { + "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" + }, + "2": { + "name": "keyword.operator.assignment.jsdoc" + }, + "3": { + "name": "source.embedded.js" + }, + "4": { + "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" + }, + "5": { + "name": "invalid.illegal.syntax.jsdoc" + } + } + } + ] + }, + { + "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + } + ] + }, + { + "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "contentName": "variable.other.jsdoc", + "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + }, + "4": { + "name": "punctuation.definition.string.begin.jsdoc" + } + }, + "end": "(\\3)|(?=$|\\*/)", + "endCaptures": { + "0": { + "name": "variable.other.jsdoc" + }, + "1": { + "name": "punctuation.definition.string.end.jsdoc" + } + } + }, + { + "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "name": "storage.type.class.jsdoc", + "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", + "captures": { + "1": { + "name": "punctuation.definition.block.tag.jsdoc" + } + } + }, + { + "include": "#inline-tags" + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "{", + "end": "}|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\[", + "end": "\\]|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "inline-tags": { + "patterns": [ + { + "name": "constant.other.description.jsdoc", + "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", + "captures": { + "1": { + "name": "punctuation.definition.bracket.square.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.square.end.jsdoc" + } + } + }, + { + "name": "entity.name.type.instance.jsdoc", + "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", + "beginCaptures": { + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + }, + "2": { + "name": "storage.type.class.jsdoc" + }, + "3": { + "name": "punctuation.definition.inline.tag.jsdoc" + } + }, + "end": "}|(?=\\*/)", + "endCaptures": { + "0": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.link.underline.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + }, + { + "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.description.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + } + ] + } + ] + }, + "jsdoctype": { + "patterns": [ + { + "name": "invalid.illegal.type.jsdoc", + "match": "\\G{(?:[^}*]|\\*[^/}])+$" + }, + { + "contentName": "entity.name.type.instance.jsdoc", + "begin": "\\G({)", + "beginCaptures": { + "0": { + "name": "entity.name.type.instance.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + } + }, + "end": "((}))\\s*|(?=\\*/)", + "endCaptures": { + "1": { + "name": "entity.name.type.instance.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "jsx": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes-in-expression" + }, + { + "include": "#jsx-tag-in-expression" + } + ] + }, + "jsx-tag-without-attributes-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + } + ] + }, + "jsx-tag-without-attributes": { + "name": "meta.tag.without-attributes.js", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js" + }, + "2": { + "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" + }, + "4": { + "name": "punctuation.definition.tag.end.js" + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js" + }, + "2": { + "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" + }, + "4": { + "name": "punctuation.definition.tag.end.js" + } + }, + "contentName": "meta.jsx.children.js", + "patterns": [ + { + "include": "#jsx-children" + } + ] + }, + "jsx-tag-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js" + }, + "1": { + "name": "punctuation.definition.tag.end.js" + }, + "2": { + "name": "punctuation.definition.tag.begin.js" + }, + "3": { + "name": "entity.name.tag.js" + }, + "4": { + "name": "support.class.component.js" + }, + "5": { + "name": "punctuation.definition.tag.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-child-tag": { + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js" + }, + "1": { + "name": "punctuation.definition.tag.end.js" + }, + "2": { + "name": "punctuation.definition.tag.begin.js" + }, + "3": { + "name": "entity.name.tag.js" + }, + "4": { + "name": "support.class.component.js" + }, + "5": { + "name": "punctuation.definition.tag.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-tag": { + "name": "meta.tag.js", + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(?=(/>)|(?:()))", + "patterns": [ + { + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js" + }, + "2": { + "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" + } + }, + "end": "(?=[/]?>)", + "contentName": "meta.tag.attributes.js", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#jsx-tag-attributes" + }, + { + "include": "#jsx-tag-attributes-illegal" + } + ] + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.js" + } + }, + "end": "(?=|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.js" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.js", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.js", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.js", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.js", + "match": "\\S+" + } + } +} \ No newline at end of file diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json new file mode 100644 index 0000000000..c72bdbc95f --- /dev/null +++ b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json @@ -0,0 +1,4262 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "name": "JavaScript (with React support)", + "scopeName": "source.js.jsx", + "fileTypes": [ + ".js", + ".jsx", + ".es6", + ".mjs" + ], + "uuid": "805375ec-d614-41f5-8993-5843fe63ea82", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#statements" + }, + { + "name": "comment.line.shebang.ts", + "match": "\\A(#!).*(?=$)", + "captures": { + "1": { + "name": "punctuation.definition.comment.ts" + } + } + } + ], + "repository": { + "statements": { + "patterns": [ + { + "include": "#string" + }, + { + "include": "#template" + }, + { + "include": "#comment" + }, + { + "include": "#declaration" + }, + { + "include": "#control-statement" + }, + { + "include": "#after-operator-block-as-object-literal" + }, + { + "include": "#decl-block" + }, + { + "include": "#expression" + }, + { + "include": "#punctuation-semicolon" + } + ] + }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.js.jsx", + "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js.jsx entity.name.function.js.jsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js.jsx", + "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js.jsx variable.other.constant.js.jsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js.jsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js.jsx variable.other.readwrite.js.jsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + } + ] + }, + "var-single-variable-type-annotation": { + "patterns": [ + { + "include": "#type-annotation" + }, + { + "include": "#string" + }, + { + "include": "#comment" + } + ] + }, + "destructuring-variable": { + "patterns": [ + { + "name": "meta.object-binding-pattern-variable.js.jsx", + "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.js.jsx" + }, + "2": { + "name": "keyword.operator.rest.js.jsx" + }, + "3": { + "name": "entity.name.function.js.jsx variable.language.this.js.jsx" + }, + "4": { + "name": "entity.name.function.js.jsx" + }, + "5": { + "name": "keyword.operator.optional.js.jsx" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.js.jsx variable.object.property.js.jsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.js.jsx", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.js.jsx" + }, + "2": { + "name": "variable.parameter.js.jsx" + } + } + }, + { + "name": "meta.arrow.js.jsx", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js.jsx" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.js.jsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js.jsx" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.js.jsx", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "captures": { + "0": { + "name": "meta.object-literal.key.js.jsx" + }, + "1": { + "name": "entity.name.function.js.jsx" + } + } + }, + { + "name": "meta.object.member.js.jsx", + "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", + "captures": { + "0": { + "name": "meta.object-literal.key.js.jsx" + } + } + }, + { + "name": "meta.object.member.js.jsx", + "begin": "\\.\\.\\.", + "beginCaptures": { + "0": { + "name": "keyword.operator.spread.js.jsx" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js.jsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", + "captures": { + "1": { + "name": "variable.other.readwrite.js.jsx" + } + } + }, + { + "name": "meta.object.member.js.jsx", + "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", + "end": "(?=,|\\}|$)", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js.jsx", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "include": "#punctuation-comma" + } + ] + }, + "ternary-expression": { + "begin": "(\\?)", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.js.jsx" + } + }, + "end": "(:)", + "endCaptures": { + "0": { + "name": "keyword.operator.ternary.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "function-call": { + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "name": "meta.function-call.js.jsx", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", + "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "include": "#literal" + }, + { + "include": "#support-objects" + }, + { + "include": "#object-identifiers" + }, + { + "include": "#punctuation-accessor" + }, + { + "name": "keyword.operator.expression.import.js.jsx", + "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" + }, + { + "name": "entity.name.function.js.jsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)" + } + ] + }, + { + "include": "#comment" + }, + { + "name": "meta.type.parameters.js.jsx", + "begin": "\\<", + "beginCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.begin.js.jsx" + } + }, + "end": "\\>", + "endCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + { + "include": "#paren-expression" + } + ] + }, + "new-expr": { + "name": "new.expr.js.jsx", + "begin": "(?>=|>>>=|\\|=" + }, + { + "name": "keyword.operator.bitwise.shift.js.jsx", + "match": "<<|>>>|>>" + }, + { + "name": "keyword.operator.comparison.js.jsx", + "match": "===|!==|==|!=" + }, + { + "name": "keyword.operator.relational.js.jsx", + "match": "<=|>=|<>|<|>" + }, + { + "name": "keyword.operator.logical.js.jsx", + "match": "\\!|&&|\\|\\|" + }, + { + "name": "keyword.operator.bitwise.js.jsx", + "match": "\\&|~|\\^|\\|" + }, + { + "name": "keyword.operator.assignment.js.jsx", + "match": "\\=" + }, + { + "name": "keyword.operator.decrement.js.jsx", + "match": "--" + }, + { + "name": "keyword.operator.increment.js.jsx", + "match": "\\+\\+" + }, + { + "name": "keyword.operator.arithmetic.js.jsx", + "match": "%|\\*|/|-|\\+" + }, + { + "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", + "captures": { + "1": { + "name": "keyword.operator.arithmetic.js.jsx" + } + } + } + ] + }, + "typeof-operator": { + "name": "keyword.operator.expression.typeof.js.jsx", + "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "support.constant.dom.js.jsx" + }, + "3": { + "name": "support.variable.property.dom.js.jsx" + } + } + }, + { + "name": "support.class.node.js.jsx", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "entity.name.function.js.jsx" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "variable.other.constant.property.js.jsx" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "variable.other.property.js.jsx" + } + } + }, + { + "name": "variable.other.constant.js.jsx", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.js.jsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.js.jsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "variable.other.constant.object.property.js.jsx" + }, + "3": { + "name": "variable.other.object.property.js.jsx" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.js.jsx" + }, + "2": { + "name": "variable.other.object.js.jsx" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.js.jsx", + "begin": "(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js.jsx" + } + }, + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "meta.type.annotation.js.jsx", + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js.jsx" + } + }, + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.js.jsx", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js.jsx" + } + }, + "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "begin": "(?<=[:])(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-parameters": { + "name": "meta.type.parameters.js.jsx", + "begin": "(<)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.begin.js.jsx" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.js.jsx", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] + }, + "type-primitive": { + "name": "support.type.primitive.js.jsx", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.js.jsx", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.js.jsx" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.js.jsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js.jsx" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js.jsx" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js.jsx" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.js.jsx", + "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.js.jsx" + } + }, + "end": "(/)([gimuy]*)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.js.jsx" + }, + "2": { + "name": "keyword.other.js.jsx" + } + }, + "patterns": [ + { + "include": "#regexp" + } + ] + }, + { + "name": "string.regexp.js.jsx", + "begin": "(?\\s*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.js.jsx" + } + }, + "end": "(?=^)", + "patterns": [ + { + "name": "meta.tag.js.jsx", + "begin": "(<)(reference|amd-dependency|amd-module)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.directive.js.jsx" + }, + "2": { + "name": "entity.name.tag.directive.js.jsx" + } + }, + "end": "/>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.directive.js.jsx" + } + }, + "patterns": [ + { + "name": "entity.other.attribute-name.directive.js.jsx", + "match": "path|types|no-default-lib|name" + }, + { + "name": "keyword.operator.assignment.js.jsx", + "match": "=" + }, + { + "include": "#string" + } + ] + } + ] + }, + "docblock": { + "patterns": [ + { + "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.access-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "5": { + "name": "constant.other.email.link.underline.jsdoc" + }, + "6": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "keyword.operator.control.jsdoc" + }, + "5": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "name": "meta.example.jsdoc", + "begin": "((@)example)\\s+", + "end": "(?=@|\\*/)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "patterns": [ + { + "match": "^\\s\\*\\s+" + }, + { + "contentName": "constant.other.description.jsdoc", + "begin": "\\G(<)caption(>)", + "beginCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + }, + "end": "()|(?=\\*/)", + "endCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "[^\\s@*](?:[^*]|\\*[^/])*", + "captures": { + "0": { + "name": "source.embedded.js.jsx" + } + } + } + ] + }, + { + "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.symbol-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.link.underline.jsdoc" + }, + "4": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "begin": "((@)typedef)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "entity.name.type.instance.jsdoc", + "match": "(?:[^@\\s*/]|\\*[^/])+" + } + ] + }, + { + "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + }, + { + "name": "variable.other.jsdoc", + "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", + "captures": { + "1": { + "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" + }, + "2": { + "name": "keyword.operator.assignment.jsdoc" + }, + "3": { + "name": "source.embedded.js.jsx" + }, + "4": { + "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" + }, + "5": { + "name": "invalid.illegal.syntax.jsdoc" + } + } + } + ] + }, + { + "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + } + ] + }, + { + "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "contentName": "variable.other.jsdoc", + "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + }, + "4": { + "name": "punctuation.definition.string.begin.jsdoc" + } + }, + "end": "(\\3)|(?=$|\\*/)", + "endCaptures": { + "0": { + "name": "variable.other.jsdoc" + }, + "1": { + "name": "punctuation.definition.string.end.jsdoc" + } + } + }, + { + "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "name": "storage.type.class.jsdoc", + "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", + "captures": { + "1": { + "name": "punctuation.definition.block.tag.jsdoc" + } + } + }, + { + "include": "#inline-tags" + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "{", + "end": "}|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\[", + "end": "\\]|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "inline-tags": { + "patterns": [ + { + "name": "constant.other.description.jsdoc", + "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", + "captures": { + "1": { + "name": "punctuation.definition.bracket.square.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.square.end.jsdoc" + } + } + }, + { + "name": "entity.name.type.instance.jsdoc", + "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", + "beginCaptures": { + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + }, + "2": { + "name": "storage.type.class.jsdoc" + }, + "3": { + "name": "punctuation.definition.inline.tag.jsdoc" + } + }, + "end": "}|(?=\\*/)", + "endCaptures": { + "0": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.link.underline.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + }, + { + "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.description.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + } + ] + } + ] + }, + "jsdoctype": { + "patterns": [ + { + "name": "invalid.illegal.type.jsdoc", + "match": "\\G{(?:[^}*]|\\*[^/}])+$" + }, + { + "contentName": "entity.name.type.instance.jsdoc", + "begin": "\\G({)", + "beginCaptures": { + "0": { + "name": "entity.name.type.instance.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + } + }, + "end": "((}))\\s*|(?=\\*/)", + "endCaptures": { + "1": { + "name": "entity.name.type.instance.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "jsx": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes-in-expression" + }, + { + "include": "#jsx-tag-in-expression" + } + ] + }, + "jsx-tag-without-attributes-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + } + ] + }, + "jsx-tag-without-attributes": { + "name": "meta.tag.without-attributes.js.jsx", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "2": { + "name": "entity.name.tag.js.jsx" + }, + "3": { + "name": "support.class.component.js.jsx" + }, + "4": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "2": { + "name": "entity.name.tag.js.jsx" + }, + "3": { + "name": "support.class.component.js.jsx" + }, + "4": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "contentName": "meta.jsx.children.js.jsx", + "patterns": [ + { + "include": "#jsx-children" + } + ] + }, + "jsx-tag-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js.jsx" + }, + "1": { + "name": "punctuation.definition.tag.end.js.jsx" + }, + "2": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "3": { + "name": "entity.name.tag.js.jsx" + }, + "4": { + "name": "support.class.component.js.jsx" + }, + "5": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-child-tag": { + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js.jsx" + }, + "1": { + "name": "punctuation.definition.tag.end.js.jsx" + }, + "2": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "3": { + "name": "entity.name.tag.js.jsx" + }, + "4": { + "name": "support.class.component.js.jsx" + }, + "5": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-tag": { + "name": "meta.tag.js.jsx", + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(?=(/>)|(?:()))", + "patterns": [ + { + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "2": { + "name": "entity.name.tag.js.jsx" + }, + "3": { + "name": "support.class.component.js.jsx" + } + }, + "end": "(?=[/]?>)", + "contentName": "meta.tag.attributes.js.jsx", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#jsx-tag-attributes" + }, + { + "include": "#jsx-tag-attributes-illegal" + } + ] + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "end": "(?=|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.js.jsx" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.js.jsx", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.js.jsx", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js.jsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.js.jsx", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js.jsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.js.jsx", + "match": "\\S+" + } + } +} \ No newline at end of file diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json new file mode 100644 index 0000000000..f2265b2922 --- /dev/null +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -0,0 +1,550 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-less/blob/master/grammars/less.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/atom/language-less/commit/b5b3438916bd617fe2b61e090b438c3e27034fc1", + "name": "Less", + "scopeName": "source.css.less", + "fileTypes": [ + "less", + "less.erb", + "rc", + "gtkrc", + "gtkrc-2.0", + "themerc" + ], + "patterns": [ + { + "include": "#strings" + }, + { + "captures": { + "1": { + "name": "entity.other.attribute-name.class.mixin.css" + } + }, + "match": "(\\.[_a-zA-Z][a-zA-Z0-9_-]*(?=\\())" + }, + { + "captures": { + "1": { + "name": "entity.other.attribute-name.class.css" + }, + "2": { + "name": "punctuation.definition.entity.css" + }, + "4": { + "name": "variable.other.interpolation.less" + } + }, + "match": "((\\.)([_a-zA-Z]|(@{[a-zA-Z0-9_-]+}))[a-zA-Z0-9_-]*)" + }, + { + "captures": { + "0": { + "name": "entity.other.attribute-name.parent-selector.css" + }, + "1": { + "name": "punctuation.definition.entity.css" + } + }, + "match": "(&)[a-zA-Z0-9_-]*" + }, + { + "begin": "(format|local|url|attr|counter|counters)\\s*(\\()", + "beginCaptures": { + "1": { + "name": "support.function.misc.css" + }, + "2": { + "name": "punctuation.section.function.css" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.function.css" + } + }, + "patterns": [ + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.css" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.css" + } + }, + "name": "string.quoted.single.css", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.css" + } + ] + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.css" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.css" + } + }, + "name": "string.quoted.double.css", + "patterns": [ + { + "match": "\\\\(\\d{1,6}|.)", + "name": "constant.character.escape.css" + } + ] + }, + { + "match": "[^'\") \\t]+", + "name": "variable.parameter.misc.css" + } + ] + }, + { + "match": "(#)([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\\b(?!.*?(?(['\"])(?:[^\\\\]|\\\\.)*?(\\6)))))?\\s*(\\])", + "name": "meta.attribute-selector.css" + }, + { + "begin": "((@)import\\b)", + "beginCaptures": { + "1": { + "name": "keyword.control.at-rule.import.less" + }, + "2": { + "name": "punctuation.definition.keyword.less" + } + }, + "end": ";", + "endCaptures": { + "0": { + "name": "punctuation.terminator.rule.css" + } + }, + "name": "meta.at-rule.import.css", + "patterns": [ + { + "match": "(?<=\\(|,|\\s)\\b(reference|optional|once|multiple|less|inline)\\b(?=\\)|,)", + "name": "keyword.control.import.option.less" + }, + { + "include": "#brace_round" + }, + { + "include": "source.css#commas" + }, + { + "include": "#strings" + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.control.at-rule.fontface.css" + }, + "2": { + "name": "punctuation.definition.keyword.css" + } + }, + "match": "^\\s*((@)font-face\\b)", + "name": "meta.at-rule.fontface.css" + }, + { + "captures": { + "1": { + "name": "keyword.control.at-rule.media.css" + }, + "2": { + "name": "punctuation.definition.keyword.css" + } + }, + "match": "^\\s*((@)media\\b)", + "name": "meta.at-rule.media.css" + }, + { + "include": "source.css#media-features" + }, + { + "match": "\\b(tv|tty|screen|projection|print|handheld|embossed|braille|aural|all)\\b", + "name": "support.constant.media-type.media.css" + }, + { + "match": "\\b(portrait|landscape)\\b", + "name": "support.constant.property-value.media-property.media.css" + }, + { + "captures": { + "1": { + "name": "support.function.less" + } + }, + "match": "(\\.[a-zA-Z0-9_-]+)\\s*(;|\\()" + }, + { + "begin": "(^[ \\t]+)?(?=//)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.less" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": "//", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.less" + } + }, + "end": "\\n", + "name": "comment.line.double-slash.less" + } + ] + }, + { + "match": "(@|\\-\\-)[\\w-]+(?=\\s*)", + "name": "variable.other.less", + "captures": { + "1": { + "name": "punctuation.definition.variable.less" + } + } + }, + { + "include": "#variable_interpolation" + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.property-list.begin.bracket.curly.css" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.property-list.end.bracket.curly.css" + } + }, + "name": "meta.property-list.css", + "patterns": [ + { + "include": "source.css#pseudo-elements" + }, + { + "include": "source.css#pseudo-classes" + }, + { + "include": "source.css#tag-names" + }, + { + "include": "source.css#commas" + }, + { + "include": "#variable_interpolation" + }, + { + "include": "source.css#property-names" + }, + { + "include": "#property_values" + }, + { + "include": "$self" + } + ] + }, + { + "match": "\\!\\s*important", + "name": "keyword.other.important.css" + }, + { + "match": "\\*|\\/|\\-|\\+|~|=|<=|>=|<|>", + "name": "keyword.operator.less" + }, + { + "match": "\\b(not|and|when)\\b", + "name": "keyword.control.logical.operator.less" + }, + { + "include": "source.css#tag-names" + }, + { + "match": "(?|~$\\\\])([\\?])(?![#\\-:!?.@*/&%^+<=>|~$\\\\])", + "end": "(?=[\\)])", + "beginCaptures": { + "1": { "name": "keyword.control message.error variable.interpolation" } + }, + "patterns": [ + { + "match": "(?:\\b|[[:space:]]+)([?])(?:\\b|[[:space:]]+)", + "name": "keyword.control message.error variable.interpolation" + }, + { "include": "#value-expression" } + ] + }, + "extension-node": { + "begin": "(?=\\[(%{1,3})[[:space:]]*[[:alpha:]])", + "end": "\\]", + "patterns": [ + { + "begin": "\\[(%{1,3})", + "end": "(?=[^_\\.'[:word:]])", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#attribute-identifier" } + ] + }, + { "include": "#attribute-payload" } + ] + }, + "jsx": { + "patterns": [ + { "include": "#jsx-head" }, + { "include": "#jsx-tail" } + ] + }, + "jsx-attributes": { + "patterns": [ + { + "begin": "\\b([[:lower:]][[:word:]]*)\\b[[:space:]]*(=)", + "end": "(?[:lower:]])", + "comment": "meta.separator", + "beginCaptures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" }, + "2": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#value-expression-atomic-with-paths" } + ] + }, + { + "match": "(\\b([[:lower:]][[:word:]]*)\\b[[:space:]]*+)", + "captures": { + "1": { "comment": "meta.separator" }, + "2": { "name": "markup.inserted constant.language support.property-value entity.name.filename" } + } + } + ] + }, + "jsx-body": { + "begin": "((>))", + "end": "(?=))|(?=])[[:space:]]*+", + "comment": "meta.separator", + "patterns": [ + { "include": "#module-path-simple" }, + { + "match": "\\b[[:lower:]][[:word:]]*\\b", + "name": "entity.name.tag.inline.any.html" + } + ] + }, + { "include": "#jsx-attributes" }, + { "include": "#jsx-body" } + ] + }, + "jsx-tail": { + "begin": "\\G(/>)|()", + "applyEndPatternLast": true, + "comment": "meta.separator", + "beginCaptures": { + "1": { "name": "punctuation.definition.tag.end.js" }, + "2": { "name": "punctuation.definition.tag.begin.js" } + }, + "endCaptures": { + "1": { "name": "punctuation.definition.tag.end.js" } + }, + "patterns": [ + { "include": "#module-path-simple" }, + { + "match": "\\b[[:lower:]][[:word:]]*\\b", + "name": "entity.name.tag.inline.any.html" + } + ] + }, + "module-name-extended": { + "patterns": [ + { "include": "#module-name-simple" }, + { + "begin": "([\\(])", + "end": "([\\)])", + "captures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#module-path-extended" } + ] + } + ] + }, + "module-name-simple": { + "match": "\\b[[:upper:]][[:word:]]*\\b", + "name": "support.class entity.name.class" + }, + "module-path-extended": { + "patterns": [ + { "include": "#module-name-extended" }, + { "include": "#comment" }, + { + "comment": "NOTE: end early to avoid too much reparsing", + "begin": "([\\.])", + "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { + "begin": "(?<=[\\.])", + "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])", + "patterns": [ + { "include": "#comment" }, + { "include": "#module-name-extended" } + ] + } + ] + } + ] + }, + "module-path-extended-prefix": { + "begin": "(?=\\b[[:upper:]])", + "end": "([\\.])|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-path-extended" } + ] + }, + "module-path-simple": { + "patterns": [ + { "include": "#module-name-simple" }, + { "include": "#comment" }, + { + "comment": "NOTE: end early to avoid too much reparsing", + "begin": "([\\.])", + "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { + "begin": "(?<=[\\.])", + "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])", + "patterns": [ + { "include": "#comment" }, + { "include": "#module-name-simple" } + ] + } + ] + } + ] + }, + "module-path-simple-prefix": { + "begin": "(?=\\b[[:upper:]])", + "end": "([\\.])|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-path-simple" } + ] + }, + "module-item-class-type": { + "comment": "FIXME: proper parsing", + "begin": "\\b(class)\\b", + "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.other" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { + "begin": "(?:\\G|^)[[:space:]]*\\b(type)\\b", + "end": "(?==)", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#module-item-type-bind-name-tyvars" } + ] + }, + { + "begin": "(=)", + "end": "(?=;)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#attribute" }, + { "include": "#comment" }, + { "include": "#class-item-inherit" }, + { "include": "#class-item-method" } + ] + } + ] + }, + "module-item-exception": { + "begin": "\\b(exception)\\b", + "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.other" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-item-type-bind-body-item" } + ] + }, + "module-item-external": { + "begin": "\\b(external)\\b", + "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "storage.type" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-item-let-value-bind-name-or-pattern" }, + { "include": "#module-item-let-value-bind-type" }, + { + "begin": "(=)", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#attribute" }, + { + "begin": "\"", + "end": "\"", + "name": "string.double string.regexp", + "patterns": [ + { "include": "#value-literal-string-escape" }, + { + "match": "(?:(%)(.*?)|(caml.*?))(?=\"|(?:[^\\\\\\n]$))", + "captures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" }, + "2": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "3": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"} + } + } + ] + } + ] + } + ] + }, + "module-item-include": { + "begin": "\\b(include)\\b", + "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.include" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#signature-expression" } + ] + }, + "module-item-let": { + "begin": "\\b(let)\\b", + "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "storage.type" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-item-let-module" }, + { "include": "#module-item-let-value" } + ] + }, + "module-item-let-module": { + "begin": "(?:\\G|^)[[:space:]]*\\b(module)\\b", + "end": "(?=[;}]|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.control storage.type message.error" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#module-item-let-module-and" }, + { "include": "#module-item-let-module-rec" }, + { "include": "#module-item-let-module-bind-name-params-type-body" } + ] + }, + "module-item-let-module-and": { + "begin": "\\b(and)\\b", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "storage.type" } + }, + "patterns": [ + { "include": "#module-item-let-module-bind-name-params-type-body" } + ] + }, + "module-item-let-module-bind-body": { + "begin": "(=>?)", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#structure-expression" } + ] + }, + "module-item-let-module-bind-name-params": { + "begin": "\\b([[:upper:]][[:word:]]*)\\b", + "end": "(?=[;:}=]|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "support.class entity.name.class" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#module-item-let-module-param" } + ] + }, + "module-item-let-module-bind-name-params-type-body": { + "begin": "(?:\\G|^)", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { "include": "#comment" }, + { "include": "#module-item-let-module-bind-name-params" }, + { "include": "#module-item-let-module-bind-type" }, + { "include": "#module-item-let-module-bind-body" } + ] + }, + "module-item-let-module-bind-type": { + "begin": "(:)", + "end": "(?=[;}=]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#signature-expression" } + ] + }, + "module-item-let-module-param": { + "begin": "(?=\\()", + "end": "\\)", + "patterns": [ + { + "begin": "\\(", + "end": "(?=[:])", + "patterns": [ + { "include": "#comment" }, + { "include": "#module-name-simple" } + ] + }, + { + "begin": "(:)", + "end": "(?=\\))", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#signature-expression" } + ] + } + ] + }, + "module-item-let-module-rec": { + "begin": "(?:\\G|^)[[:space:]]*\\b(rec)\\b", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control storage.modifier.rec" } + }, + "patterns": [ + { "include": "#module-item-let-module-bind-name-params-type-body" } + ] + }, + "module-item-let-value": { + "patterns": [ + { "include": "#module-item-let-value-and" }, + { "include": "#module-item-let-value-rec" }, + { "include": "#module-item-let-value-bind-name-params-type-body" } + ] + }, + "module-item-let-value-and": { + "begin": "\\b(and)\\b", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "storage.type" } + }, + "patterns": [ + { "include": "#module-item-let-value-bind-name-params-type-body" } + ] + }, + "module-item-let-value-bind-body": { + "begin": "(=>?)", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#value-expression" } + ] + }, + "module-item-let-value-bind-name-or-pattern": { + "begin": "(?<=[^[:word:]]and|^and|[^[:word:]]external|^external|[^[:word:]]let|^let|[^[:word:]]method|^method|[^[:word:]]rec|^rec)[[:space:]]*", + "end": "(?<=[^[:space:]])|(?=[[:space:]]|[;:}=]|\\b(and|as|class|constraint|exception|external|for|include|inherit|let|method|module|nonrec|open|private|rec|switch|try|type|val|while|with)\\b)", + "patterns": [ + { "include": "#comment" }, + { + "match": "\\b(?:([_][[:word:]]+)|([[:lower:]][[:word:]]*))\\b", + "captures": { + "1": { "name": "comment" }, + "2": { "name": "entity.name.function" } + } + }, + { "include": "#module-item-let-value-bind-parens-params" }, + { "include": "#pattern" } + ] + }, + "module-item-let-value-bind-name-params-type-body": { + "begin": "(?<=[^[:word:]]and|^and|[^[:word:]]external|^external|[^[:word:]]let|^let|[^[:word:]]method|^method|[^[:word:]]rec|^rec)", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { + "comment": "FIXME; hack for punned arguments", + "begin": "(::)", + "end": "(?<=[[:space:]])", + "beginCaptures": { + "1": { "name": "keyword.control" } + }, + "patterns": [ + { "include": "#pattern" }, + { + "begin": "(=)", + "end": "(\\?)|(?<=[^[:space:]=][[:space:]])(?=[[:space:]]*+[^\\.])", + "beginCaptures": { + "1": { "name": "markup.inserted keyword.control.less message.error" } + }, + "endCaptures": { + "1": { "name": "storage.type" } + }, + "patterns": [ + { "include": "#value-expression-atomic-with-paths" } + ] + } + ] + }, + { "include": "#module-item-let-value-bind-name-or-pattern" }, + { "include": "#module-item-let-value-bind-params-type" }, + { "include": "#module-item-let-value-bind-type" }, + { "include": "#module-item-let-value-bind-body" } + ] + }, + "module-item-let-value-bind-params-type": { + "begin": "(?=[^[:space:]:=])", + "end": "(?=[;}=]|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { "include": "#comment" }, + { "include": "#module-item-let-value-param" }, + { + "begin": "(?]|[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { + "begin": "\\b(type)\\b", + "end": "([\\.])", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "endCaptures": { + "1": { "name": "entity.name.function" } + }, + "patterns": [ + { "include": "#pattern-variable" } + ] + }, + { "include": "#type-expression" } + ] + }, + "module-item-let-value-param": { + "patterns": [ + { "include": "#module-item-let-value-param-label" }, + { "include": "#module-item-let-value-param-type" }, + { "include": "#module-item-let-value-param-module" }, + { "include": "#pattern" } + ] + }, + "module-item-let-value-param-label": { + "patterns": [ + { + "begin": "(\\b[[:lower:]][[:word:]]*\\b)?[[:space:]]*(::)", + "end": "(?<=[[:space:]])", + "beginCaptures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" }, + "2": { "name": "keyword.control" } + }, + "patterns": [ + { "include": "#pattern" }, + { + "begin": "(=)", + "end": "(\\?)|(?<=[^[:space:]=][[:space:]])(?=[[:space:]]*+[^\\.])", + "beginCaptures": { + "1": { "name": "markup.inserted keyword.control.less message.error" } + }, + "endCaptures": { + "1": { "name": "storage.type" } + }, + "patterns": [ + { "include": "#value-expression-atomic-with-paths" } + ] + } + ] + } + ] + }, + "module-item-let-value-param-module": { + "comment": "FIXME: merge with pattern-parens", + "begin": "\\([[:space:]]*(?=\\b(module)\\b)", + "end": "\\)", + "patterns": [ + { + "begin": "\\b(module)\\b", + "end": "(?=\\))", + "beginCaptures": { + "1": { "name": "keyword.other message.error" } + }, + "patterns": [ + { + "match": "\\b[[:upper:]][[:word:]]*\\b", + "name": "support.class entity.name.class" + } + ] + } + ] + }, + "module-item-let-value-param-type": { + "comment": "FIXME: merge with pattern-parens", + "begin": "\\((?=\\b(type)\\b)", + "end": "\\)", + "patterns": [ + { + "begin": "\\b(type)\\b", + "end": "(?=\\))", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#pattern-variable" } + ] + } + ] + }, + "module-item-let-value-rec": { + "begin": "(?:\\G|^)[[:space:]]*\\b(rec)\\b", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control storage.modifier message.error" } + }, + "patterns": [ + { "include": "#module-item-let-value-bind-name-params-type-body" } + ] + }, + "module-item-module": { + "comment": "NOTE: this is to support the let-module case without the let prefix", + "begin": "\\b(module)\\b[[:space:]]*(?!\\b(type)\\b|$)", + "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "storage.type message.error" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-item-let-module-and" }, + { "include": "#module-item-let-module-rec" }, + { "include": "#module-item-let-module-bind-name-params-type-body" } + ] + }, + "module-item-module-type": { + "begin": "\\b(module)\\b[[:space:]]*(?=\\b(type)\\b|$)", + "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control message.error" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { + "begin": "(?:\\G|^)[[:space:]]*\\b(type)\\b", + "end": "(?==)", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#comment" }, + { + "match": "([[:upper:]][[:word:]]*)", + "captures": { + "1": { "name": "support.class entity.name.class" } + } + } + ] + }, + { + "begin": "(=)", + "end": "(?=;)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#signature-expression" } + ] + } + ] + }, + "module-item-open": { + "begin": "\\b(open)\\b", + "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.open" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#module-path-simple" } + ] + }, + "module-item-type": { + "comment": "FIXME: the semi-colon is optional so we can re-use this for hover, which does not print the trailing ;", + "begin": "\\b(type)\\b", + "end": "(;)|(?=[\\)}]|\\b(class|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.other" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-item-type-and" }, + { "include": "#module-item-type-constraint" }, + { "include": "#module-item-type-bind" } + ] + }, + "module-item-type-and": { + "comment": "FIXME: the optional `type` is for module constraints", + "begin": "\\b(and)\\b([[:space:]]*type)?", + "end": "(?=[;\\)}]|\\b(class|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.other" }, + "2": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#module-item-type-bind-name-tyvars-body" } + ] + }, + "module-item-type-bind": { + "comment": "FIXME: only allow module paths before type variables", + "patterns": [ + { "include": "#module-item-type-bind-nonrec" }, + { "include": "#module-item-type-bind-name-tyvars-body" } + ] + }, + "module-item-type-bind-body": { + "comment": "FIXME: parsing", + "begin": "(\\+?=)", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#module-item-type-bind-body-item" } + ] + }, + "module-item-type-bind-body-item": { + "patterns": [ + { + "match": "(=)(?!>)|\\b(private)\\b", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "variable.other.class.js variable.interpolation storage.modifier message.error" } + } + }, + { + "comment": "FIXME: specialized version of variant rule that also scans for (", + "match": "\\b([[:upper:]][[:word:]]*)\\b(?![[:space:]]*[\\.\\(])", + "captures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + } + }, + { + "begin": "(\\.\\.)", + "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + } + }, + { + "begin": "(\\|)(?![#\\-:!?.@*/&%^+<=>|~$\\\\])[[:space:]]*", + "end": "(?=[;\\)}]|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\])|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#value-expression-constructor" }, + { + "match": "([:])|\\b(of)\\b", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "keyword.other" } + } + }, + { "include": "#type-expression" } + ] + }, + { + "comment": "FIXME: remove this once the pretty printer no longer outputs 'of'", + "match": "(:)|(\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|\\b(of)\\b", + "captures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "2": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "3": { "name": "keyword.other" } + } + }, + { "include": "#type-expression" } + ] + }, + "module-item-type-bind-name-tyvars": { + "begin": "(?<=\\G|^|\\.)[[:space:]]*\\b([[:lower:]][[:word:]]*)\\b", + "end": "(?=\\+?=|[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "entity.name.function" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#attribute" }, + { + "match": "_", + "name": "comment" + }, + { + "comment": "FIXME: add separate type-variable rule", + "match": "([+\\-])?(?:(_)|(')([[:lower:]][[:word:]]*)\\b)(?!\\.[[:upper:]])", + "captures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "2": { "name": "comment" }, + "3": { "name": "comment" }, + "4": { "name": "variable.parameter string.other.link variable.language" } + } + } + ] + }, + "module-item-type-bind-name-tyvars-body": { + "begin": "(?=(\\G|^)[[:space:]]*\\b[[:alpha:]])", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { "include": "#module-path-simple-prefix" }, + { "include": "#module-item-type-bind-name-tyvars" }, + { "include": "#module-item-type-bind-body" } + ] + }, + "module-item-type-bind-nonrec": { + "begin": "(?:\\G|^)[[:space:]]*\\b(nonrec)\\b", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control storage.modifier message.error" } + }, + "patterns": [ + { "include": "#module-item-type-bind-name-tyvars-body" } + ] + }, + "module-item-type-constraint": { + "comment": "FIXME: proper parsing", + "begin": "\\b(constraint)\\b", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation storage.modifier message.error" } + }, + "patterns": [ + { + "comment": "FIXME: add separate type-variable rule", + "match": "([+\\-])?(')([_[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])", + "captures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "2": { "name": "comment" }, + "3": { "name": "variable.parameter string.other.link variable.language" } + } + }, + { + "match": "=", + "name": "keyword.control.less" + }, + { "include": "#type-expression" } + ] + }, + "object-item": { + "begin": "\\G|(;)", + "end": "(?=[;}]|\\b(class|constraint|exception|external|include|let|module|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#class-item-method" } + ] + }, + "operator": { + "patterns": [ + { "include": "#operator-infix" }, + { "include": "#operator-prefix" } + ] + }, + "operator-infix": { + "patterns": [ + { + "match": ";", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" + }, + { "include": "#operator-infix-assign" }, + { "include": "#operator-infix-builtin" }, + { "include": "#operator-infix-custom" }, + { "comment": "#operator-infix-custom-hash" } + ] + }, + "operator-infix-assign": { + "match": "(?|~$\\\\])(=)(?![#\\-:!?.@*/&%^+<=>|~$\\\\])", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control.less message.error" + }, + "operator-infix-builtin": { + "match": ":=", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control.less message.error" + }, + "operator-infix-custom": { + "match": "(?:(?|~$\\\\])((<>))(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|([#\\-@*/&%^+<=>$\\\\][#\\-:!?.@*/&%^+<=>|~$\\\\]*|[|][#\\-:!?.@*/&%^+<=>|~$\\\\]+)", + "captures": { + "1": { "comment": "meta.separator" }, + "2": { "name": "punctuation.definition.tag.begin.js" }, + "3": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + } + }, + "operator-infix-custom-hash": { + "match": "#[\\-:!?.@*/&%^+<=>|~$]+", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" + }, + "operator-prefix": { + "patterns": [ + { "include": "#operator-prefix-bang" }, + { "include": "#operator-prefix-label-token" } + ] + }, + "operator-prefix-bang": { + "match": "![\\-:!?.@*/&%^+<=>|~$]*", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" + }, + "operator-prefix-label-token": { + "match": "[?~][\\-:!?.@*/&%^+<=>|~$]+", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" + }, + "pattern": { + "patterns": [ + { "include": "#attribute" }, + { "include": "#comment" }, + { "include": "#pattern-atomic" }, + { + "match": "[[:space:]]*+(?:(\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|\\b(as)\\b|(\\.\\.\\.?))[[:space:]]*+", + "captures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "2": { "name": "keyword.other" }, + "3": { "name": "keyword.control" } + } + } + ] + }, + "pattern-atomic": { + "patterns": [ + { + "match": "\\b(exception)\\b", + "name": "keyword.other" + }, + { "include": "#value-expression-literal" }, + { "include": "#module-path-simple-prefix" }, + { "include": "#pattern-list-or-array" }, + { "include": "#pattern-record" }, + { "include": "#pattern-variable" }, + { "include": "#pattern-parens" } + ] + }, + "pattern-guard": { + "begin": "\\b(when)\\b", + "end": "(?==>)", + "beginCaptures": { + "1": { "name": "keyword.other" } + }, + "patterns": [ + { "include": "#value-expression" } + ] + }, + "pattern-list-or-array": { + "begin": "(\\[\\|?)(?![@%])", + "end": "(\\|?\\])", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "endCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#value-expression-literal-list-or-array-separator" }, + { "include": "#pattern" } + ] + }, + "pattern-parens": { + "begin": "(?=\\()", + "end": "\\)|(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { "include": "#pattern-parens-lhs" }, + { "include": "#type-annotation-rhs" } + ] + }, + "pattern-parens-lhs": { + "begin": "\\(|(,)", + "end": "(?=(?:[,:\\)]))|(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#pattern" } + ] + }, + "record-path": { + "begin": "\\b[[:lower:]][[:word:]]*\\b", + "end": "(?=[^[:space:]\\.])(?!/\\*)", + "patterns": [ + { "include": "#comment" }, + { "include": "#record-path-suffix" } + ] + }, + "record-path-suffix": { + "begin": "(\\.)", + "end": "(\\))|\\b([[:upper:]][[:word:]]*)\\b|\\b([[:lower:]][[:word:]]*)\\b|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "endCaptures": { + "1": { "name": "keyword.control" }, + "2": { "name": "support.class entity.name.class" }, + "3": { "name": "markup.inserted constant.language support.property-value entity.name.filename" } + }, + "patterns": [ + { "include": "#comment" }, + { + "begin": "([\\(])", + "end": "(?=[\\)])", + "beginCaptures": { + "1": { "name": "keyword.control" } + }, + "patterns": [ + { "include": "#comment" }, + { + "match": "\\b([[:lower:]][[:word:]]*)\\b(?=[^\\)]*([\\.]))", + "captures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" }, + "2": { "name": "keyword.other" } + } + }, + { + "match": "([\\.])", + "name": "keyword.control.less" + }, + { + "match": "\\b([[:lower:]][[:word:]]*)\\b[[:space:]]*", + "captures": { + "1": { "name": "variable.parameter string.other.link variable.language" } + } + }, + { "include": "#value-expression" } + ] + } + ] + }, + "pattern-record": { + "begin": "{", + "end": "}", + "patterns": [ + { "include": "#comment" }, + { "include": "#pattern-record-item" } + ] + }, + "pattern-record-field": { + "begin": "\\b([_][[:word:]]*)\\b|\\b([[:lower:]][[:word:]]*)\\b", + "end": "(,)|(?=})", + "beginCaptures": { + "1": { "name": "comment" }, + "2": { "name": "markup.inserted constant.language support.property-value entity.name.filename" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#comment" }, + { + "begin": "\\G(:)", + "end": "(?=[,}])", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#pattern" } + ] + } + ] + }, + "pattern-record-item": { + "patterns": [ + { "include": "#module-path-simple-prefix" }, + { "include": "#pattern-record-field" } + ] + }, + "pattern-variable": { + "patterns": [ + { + "match": "\\b(_(?:[[:lower:]][[:word:]]*)?)\\b(?!\\.[[:upper:]])", + "captures": { + "1": { "name": "comment" } + } + }, + { + "match": "\\b([[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])", + "captures": { + "1": { "name": "variable.language string.other.link" } + } + } + ] + }, + "signature-expression": { + "patterns": [ + { + "comment": "FIXME: scan for :upper: to disambiguate type/signature in hover", + "begin": "(?=\\([[:space:]]*[[:upper:]][[:word:]]*[[:space:]]*:)", + "end": "(?=[;])", + "patterns": [ + { + "begin": "(?=\\()", + "end": "(?=[;]|=>)", + "patterns": [ + { "include": "#module-item-let-module-param" } + ] + }, + { + "begin": "(=>)", + "end": "(?=[;\\(])", + "beginCaptures": { + "1": { "name": "markup.inserted keyword.control.less" } + }, + "patterns": [ + { "include": "#structure-expression" } + ] + } + ] + }, + { + "begin": "\\b(module)\\b[[:space:]]*\\b(type)\\b([[:space:]]*\\b(of)\\b)?", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "markup.inserted keyword.other variable.other.readwrite.instance" }, + "2": { "name": "entity.other.attribute-name.css constant.language constant.numeric" }, + "3": { "name": "markup.inserted keyword.other variable.other.readwrite.instance" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#module-path-simple" }, + { + "match": "\\b([[:upper:]][[:word:]]*)\\b", + "name": "support.class entity.name.class" + } + ] + }, + { "include": "#signature-expression-constraints" }, + { "include": "#structure-expression" } + ] + }, + "signature-expression-constraints": { + "begin": "(?=\\b(with))", + "end": "(?=[;\\)}]|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val)\\b)", + "patterns": [ + { + "begin": "\\b(and|with)\\b", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation storage.modifier message.error" } + }, + "patterns": [ + { "include": "#comment" }, + { + "comment": "FIXME: special version of #module-item-type with non-consuming `;`. Atom seems to need this to work.", + "begin": "\\b(type)\\b", + "end": "(?=[;\\)}]|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val|with)\\b)", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + }, + "patterns": [ + { "include": "#module-item-type-and" }, + { "include": "#module-item-type-constraint" }, + { "include": "#module-item-type-bind" } + ] + }, + { + "begin": "(?=\\b(module)\\b)", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val|with)\\b)", + "patterns": [ + { + "begin": "\\b(module)\\b", + "end": "(?=:?=|[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "markup.inserted keyword.control storage.type variable.other.readwrite.instance" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#module-path-simple" }, + { + "match": "[[:upper:]][[:word:]]*", + "name": "support.class entity.name.class" + } + ] + }, + { + "begin": "(:=)|(=)", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "markup.inserted keyword.control.less message.error" }, + "2": { "name": "markup.inserted keyword.control.less" } + }, + "patterns": [ + { "include": "#structure-expression" } + ] + } + ] + } + ] + } + ] + }, + "structure-expression": { + "patterns": [ + { "include": "#comment" }, + { + "comment": "FIXME: scan for :upper: or `val` to disambiguate types from signatures for hover", + "begin": "\\((?=[[:space:]]*(\\b(val)\\b|[^'\\[<[:lower:]]))", + "end": "\\)|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|with)\\b)", + "patterns": [ + { "include": "#comment" }, + { + "comment": "FIXME: might need to refactor this or include more expressions", + "include": "#structure-expression-block" + }, + { + "begin": "\\b(val)\\b", + "end": "(?=\\))|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.other" } + }, + "patterns": [ + { "include": "#comment" }, + { + "match": "\\b([[:lower:]][[:word:]]*)\\b", + "name": "support.class entity.name.class" + } + ] + }, + { "include": "#module-path-simple" }, + { + "begin": "(:)", + "end": "(?=[\\)])|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#signature-expression" } + ] + } + ] + }, + { "include": "#module-path-simple" }, + { "include": "#structure-expression-block" } + ] + }, + "structure-expression-block": { + "begin": "{", + "end": "}", + "patterns": [ + { "include": "#structure-expression-block-item" } + ] + }, + "structure-expression-block-item": { + "patterns": [ + { "include": "#attribute" }, + { "include": "#comment" }, + { "include": "#module-item-exception" }, + { "include": "#module-item-external" }, + { "include": "#module-item-include" }, + { "include": "#module-item-let" }, + { "include": "#module-item-class-type" }, + { "include": "#module-item-module-type" }, + { "include": "#module-item-module" }, + { "include": "#module-item-open" }, + { "include": "#module-item-type" } + ] + }, + "type-annotation-rhs": { + "begin": "(?|~$\\\\])([:])(?![#\\-:!?.@*/&%^+<=>|~$\\\\])", + "end": "(?=\\))|(?=[,;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#type-expression" } + ] + }, + "type-expression": { + "patterns": [ + { + "match": "([\\.])", + "name": "entity.name.function" + }, + { "include": "#type-expression-atomic" }, + { "include": "#type-expression-arrow" } + ] + }, + "type-expression-atomic": { + "patterns": [ + { "include": "#attribute" }, + { "include": "#comment" }, + { "include": "#module-path-extended-prefix" }, + { "include": "#type-expression-label" }, + { + "match": "\\b(as)\\b", + "name": "variable.other.class.js variable.interpolation storage.modifier message.error" + }, + { "include": "#type-expression-constructor" }, + { "include": "#type-expression-object" }, + { "include": "#type-expression-parens" }, + { "include": "#type-expression-polymorphic-variant" }, + { "include": "#type-expression-record" }, + { "include": "#type-expression-variable" } + ] + }, + "type-expression-arrow": { + "match": "=>", + "name": "markup.inserted keyword.control.less" + }, + "type-expression-constructor": { + "match": "(_)(?![[:alnum:]])|\\b([_[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])", + "captures": { + "1": { "name": "comment" }, + "2": { "name": "support.type string.regexp" } + } + }, + "type-expression-label": { + "begin": "\\b([_[:lower:]][[:word:]]*)\\b(::)", + "end": "(?<==>)", + "beginCaptures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" }, + "2": { "name": "keyword.control" } + }, + "patterns": [ + { "include": "#type-expression" }, + { + "match": "(\\?)", + "captures": { + "1": { "name": "keyword.control.less" } + } + } + ] + }, + "type-expression-object": { + "comment": "FIXME: separate sub-rules", + "begin": "(<)", + "end": "(>)", + "captures": { + "1": { "name": "entity.name.function" } + }, + "patterns": [ + { + "begin": "(\\.\\.)", + "end": "(?=>)", + "beginCaptures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + } + }, + { + "comment": "FIXME: method item", + "begin": "(?=[_[:lower:]])", + "end": "(,)|(?=>)", + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { + "comment": "FIXME: method name", + "begin": "(?=[_[:lower:]])", + "end": "(?=:)", + "patterns": [ + { + "match": "\\b([_[:lower:]][[:word:]]*)\\b", + "captures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" } + } + } + ] + }, + { + "comment": "FIXME: method type", + "begin": "(:)", + "end": "(?=[,>])", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#type-expression" } + ] + } + ] + } + ] + }, + "type-expression-parens": { + "comment": "FIXME: proper tuple types", + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "begin": "\\b(module)\\b", + "end": "(?=[\\)])", + "beginCaptures": { + "1": { "name": "keyword.other message.error" } + }, + "patterns": [ + { "include": "#module-path-extended" }, + { "include": "#signature-expression-constraints" } + ] + }, + { + "match": ",", + "name": "keyword.control.less" + }, + { "include": "#type-expression" } + ] + }, + "type-expression-polymorphic-variant": { + "comment": "FIXME: proper parsing", + "begin": "(\\[)([<>])?", + "end": "(\\])", + "captures": { + "1": { "name": "entity.name.function" }, + "2": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { + "begin": "(\\|)?(?![#\\-:!?.@*/&%^+<=>|~$\\\\])[[:space:]]*", + "end": "(?=[;)}\\]]|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\])|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#value-expression-constructor" }, + { + "match": "([:])|\\b(of)\\b|([&])", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "keyword.other" }, + "3": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + } + }, + { "include": "#value-expression-constructor-polymorphic" }, + { "include": "#type-expression" } + ] + } + ] + }, + "type-expression-record": { + "begin": "{", + "end": "}", + "patterns": [ + { "include": "#type-expression-record-item" } + ] + }, + "type-expression-record-field-sans-modifier": { + "begin": "\\b([_[:lower:]][[:word:]]*)\\b", + "end": "(,)|(?=[,}])", + "beginCaptures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#comment" }, + { + "begin": "(:)", + "end": "(?=[,}])", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#type-expression" } + ] + } + ] + }, + "type-expression-record-field": { + "patterns": [ + { + "begin": "\\b(mutable)\\b", + "end": "(?<=[,])|(?=})", + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation storage.modifier message.error" } + }, + "patterns": [ + { "include": "#type-expression-record-field-sans-modifier" } + ] + }, + { "include": "#type-expression-record-field-sans-modifier" } + ] + }, + "type-expression-record-item": { + "patterns": [ + { "include": "#comment" }, + { "include": "#module-path-simple-prefix" }, + { "include": "#type-expression-record-field" } + ] + }, + "type-expression-variable": { + "match": "(')([_[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])", + "captures": { + "1": { "name": "comment" }, + "2": { "name": "variable.parameter string.other.link variable.language" } + } + }, + "value-expression": { + "patterns": [ + { "include": "#attribute" }, + { "include": "#comment" }, + { "include": "#extension-node" }, + { "include": "#jsx" }, + { "include": "#operator" }, + { "include": "#value-expression-builtin" }, + { "include": "#value-expression-if-then-else" }, + { "include": "#value-expression-atomic" }, + { "include": "#module-path-simple-prefix" }, + { + "match": "[:?]", + "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" + }, + { "include": "#record-path" } + ] + }, + "value-expression-atomic": { + "patterns": [ + { "include": "#value-expression-literal" }, + { "include": "#value-expression-literal-list-or-array" }, + { "include": "#value-expression-for" }, + { "include": "#value-expression-fun" }, + { "include": "#value-expression-block-or-record-or-object" }, + { "include": "#value-expression-label" }, + { "include": "#value-expression-parens" }, + { "include": "#value-expression-switch" }, + { "include": "#value-expression-try" }, + { "include": "#value-expression-while" } + ] + }, + "value-expression-atomic-with-paths": { + "patterns": [ + { "include": "#value-expression-atomic" }, + { "include": "#module-path-simple-prefix" }, + { "include": "#record-path-suffix" } + ] + }, + "value-expression-block": { + "begin": "{", + "end": "}", + "patterns": [ + { "include": "#value-expression-block-item" } + ] + }, + "value-expression-block-item": { + "patterns": [ + { "include": "#module-item-let" }, + { "include": "#module-item-open" }, + { "include": "#value-expression" } + ] + }, + "value-expression-block-look": { + "begin": "(?![[:space:]]*($|\\.\\.\\.|([[:upper:]][[:word:]]*\\.)*([[:lower:]][[:word:]]*)[[:space:]]*(?:,|:(?![=]))))", + "end": "(?=})", + "patterns": [ + { "include": "#value-expression-block-item" } + ] + }, + "value-expression-block-or-record-or-object": { + "begin": "{", + "end": "}", + "patterns": [ + { "include": "#comment" }, + { "include": "#module-path-simple-prefix" }, + { "include": "#value-expression-object-look" }, + { "include": "#value-expression-record-look" }, + { "include": "#value-expression-block-look" } + ] + }, + "value-expression-builtin": { + "match": "\\b(assert|decr|failwith|fprintf|ignore|incr|land|lazy|lor|lsl|lsr|lxor|mod|new|not|printf|ref)\\b|\\b(raise)\\b", + "captures": { + "1": { "name": "keyword.control message.error" }, + "2": { "name": "keyword.control.trycatch" } + } + }, + "value-expression-constructor": { + "match": "\\b([[:upper:]][[:word:]]*)\\b(?![[:space:]]*[\\.])", + "captures": { + "1": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + } + }, + "value-expression-constructor-polymorphic": { + "match": "(`)([[:alpha:]][[:word:]]*)\\b(?!\\.)", + "captures": { + "1": { "name": "constant.other.symbol keyword.control.less variable.parameter" }, + "2": { "name": "entity.other.attribute-name.css constant.language constant.numeric" } + } + }, + "value-expression-for": { + "begin": "(?=\\b(for)\\b)", + "end": "(?<=})|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { "include": "#value-expression-for-head" }, + { "include": "#value-expression-block" } + ] + }, + "value-expression-for-head": { + "begin": "(?=\\b(for)\\b)", + "end": "(?={)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)", + "patterns": [ + { + "begin": "\\b(for)\\b", + "end": "(?=\\b(in)\\b)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.loop" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#pattern-variable" } + ] + }, + { + "begin": "\\b(in)\\b", + "end": "(?=\\b(to)\\b)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.loop" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#value-expression-atomic-with-paths" } + ] + }, + { + "begin": "\\b(to)\\b", + "end": "(?={)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.loop" } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#value-expression-atomic-with-paths" } + ] + }, + { "include": "#value-expression-block" } + ] + }, + "value-expression-fun": { + "begin": "\\b(fun)\\b", + "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control" } + }, + "patterns": [ + { "include": "#value-expression-fun-pattern-match-rule-lhs" }, + { "include": "#value-expression-fun-pattern-match-rule-rhs" } + ] + }, + "value-expression-fun-pattern-match-rule-lhs": { + "begin": "(?=\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|(?<=fun)", + "end": "(\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|(?==>)|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)", + "applyEndPatternLast": true, + "beginCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "endCaptures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" } + }, + "patterns": [ + { "include": "#module-item-let-value-param" } + ] + }, + "value-expression-fun-pattern-match-rule-rhs": { + "begin": "(=>)", + "end": "(?=[;\\)}]|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\])|\\b(and)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#value-expression" } + ] + }, + "value-expression-if-then-else": { + "begin": "\\b(if)\\b", + "end": "(?=[;\\)\\]}])", + "applyEndPatternLast": true, + "beginCaptures": { + "1": { "name": "keyword.control.conditional" } + }, + "patterns": [ + { "include": "#comment" }, + { + "begin": "\\b(else)\\b", + "end": "(?=[;\\)\\]}])", + "beginCaptures": { + "1": { "name": "keyword.control.conditional" } + }, + "patterns": [ + { "include": "#value-expression" } + ] + }, + { "include": "#value-expression-atomic-with-paths" } + ] + }, + "value-expression-lazy": { + "comment": "FIXME", + "match": "\\b(lazy)\\b", + "captures": { + "1": { "name": "keyword.other" } + } + }, + "value-expression-label": { + "begin": "\\b([_[:lower:]][[:word:]]*)\\b[[:space:]]*(::)(\\?)?", + "end": "(?![[:space:]])", + "beginCaptures": { + "1": { "name": "markup.inserted constant.language support.property-value entity.name.filename" }, + "2": { "name": "keyword.control" }, + "3": { "name": "storage.type" } + }, + "patterns": [ + { "include": "#value-expression" } + ] + }, + "value-expression-literal": { + "patterns": [ + { "include": "#value-expression-literal-boolean" }, + { "include": "#value-expression-literal-character" }, + { "include": "#value-expression-constructor" }, + { "include": "#value-expression-constructor-polymorphic" }, + { "include": "#value-expression-lazy" }, + { "include": "#value-expression-literal-numeric" }, + { "include": "#value-expression-literal-string" }, + { "include": "#value-expression-literal-unit" } + ] + }, + "value-expression-literal-boolean": { + "match": "\\b(false|true)\\b", + "name": "entity.other.attribute-name.css constant.language constant.numeric" + }, + "value-expression-literal-character": { + "match": "(')([[:space:]]|[[:graph:]]|\\\\[\\\\\"'ntbr]|\\\\[[:digit:]][[:digit:]][[:digit:]]|\\\\x[[:xdigit:]][[:xdigit:]]|\\\\o[0-3][0-7][0-7])(')", + "name": "constant.character" + }, + "value-expression-literal-list-or-array": { + "begin": "(\\[\\|?)(?![@%])", + "end": "(\\|?\\])", + "beginCaptures": { + "1": { "name": "constant.language.list" } + }, + "endCaptures": { + "1": { "name": "constant.language.list" } + }, + "patterns": [ + { "include": "#value-expression-literal-list-or-array-separator" }, + { "include": "#value-expression" }, + { "include": "#value-expression-literal-list-or-array" } + ] + }, + "value-expression-literal-list-or-array-separator": { + "match": "(,)|(\\.\\.\\.)", + "captures": { + "1": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "2": { "name": "keyword.control" } + } + }, + "value-expression-literal-numeric": { + "patterns": [ + { + "match": "([-])?([[:digit:]][_[:digit:]]*)(?:(\\.)([_[:digit:]]*))?(?:([eE])([\\-\\+])?([[:digit:]][_[:digit:]]*))?(?![bBoOxX])", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "constant.numeric" }, + "3": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "4": { "name": "constant.numeric" }, + "5": { "name": "keyword.control.less" }, + "6": { "name": "keyword.control.less" }, + "7": { "name": "constant.numeric" } + } + }, + { + "match": "([-])?(0[xX])([[:xdigit:]][_[:xdigit:]]*)(?:(\\.)([_[:xdigit:]]*))?(?:([pP])([\\-\\+])?([[:digit:]][_[:digit:]]*))?", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "keyword.control.less" }, + "3": { "name": "constant.numeric" }, + "4": { "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error" }, + "5": { "name": "constant.numeric" }, + "6": { "name": "keyword.control.less" }, + "7": { "name": "keyword.control.less" }, + "8": { "name": "constant.numeric" } + } + }, + { + "match": "([-])?(0[oO])([0-7][_0-7]*)", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "keyword.control.less" }, + "3": { "name": "constant.numeric" } + } + }, + { + "match": "([-])?(0[bB])([0-1][_0-1]*)", + "captures": { + "1": { "name": "keyword.control.less" }, + "2": { "name": "keyword.control.less" }, + "3": { "name": "constant.numeric" } + } + } + ] + }, + "value-expression-literal-string": { + "patterns": [ + { + "begin": "(?|~$\\\\]))", + "end": "(?==>|[;\\)}])", + "patterns": [ + { "include": "#pattern-guard" }, + { "include": "#pattern" } + ] + }, + "value-expression-switch-pattern-match-rule-rhs": { + "begin": "(=>)", + "end": "(?=}|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))", + "beginCaptures": { + "1": { "name": "keyword.control.less" } + }, + "patterns": [ + { "include": "#value-expression-block-item" } + ] + }, + "value-expression-try": { + "begin": "\\b(try)\\b", + "end": "(?<=})|(?=[;\\)]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)", + "beginCaptures": { + "1": { "name": "keyword.control.trycatch" } + }, + "patterns": [ + { "include": "#value-expression-try-head" }, + { "include": "#value-expression-switch-body" } + ] + }, + "value-expression-try-head": { + "begin": "(?<=try)", + "end": "(?=|<|>|from|to|through)", + "name": "keyword.control.operator" + }, + { + "include": "#variable" + }, + { + "include": "#property_values" + }, + { + "include": "$self" + } + ] + }, + "at_rule_function": { + "patterns": [ + { + "begin": "\\s*((@)function\\b)\\s*", + "captures": { + "1": { + "name": "keyword.control.at-rule.function.scss" + }, + "2": { + "name": "punctuation.definition.keyword.scss" + }, + "3": { + "name": "entity.name.function.scss" + } + }, + "end": "\\s*(?={)", + "name": "meta.at-rule.function.scss", + "patterns": [ + { + "include": "#function_attributes" + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.control.at-rule.function.scss" + }, + "2": { + "name": "punctuation.definition.keyword.scss" + }, + "3": { + "name": "entity.name.function.scss" + } + }, + "match": "\\s*((@)function\\b)\\s*", + "name": "meta.at-rule.function.scss" + } + ] + }, + "at_rule_if": { + "begin": "\\s*((@)if\\b)\\s*", + "captures": { + "1": { + "name": "keyword.control.if.scss" + }, + "2": { + "name": "punctuation.definition.keyword.scss" + } + }, + "end": "\\s*(?={)", + "name": "meta.at-rule.if.scss", + "patterns": [ + { + "include": "#conditional_operators" + }, + { + "include": "#variable" + }, + { + "include": "#property_values" + } + ] + }, + "at_rule_import": { + "begin": "\\s*((@)import\\b)\\s*", + "captures": { + "1": { + "name": "keyword.control.at-rule.import.scss" + }, + "2": { + "name": "punctuation.definition.keyword.scss" + } + }, + "end": "\\s*((?=;)|(?=}))", + "name": "meta.at-rule.import.scss", + "patterns": [ + { + "include": "#variable" + }, + { + "include": "#string_single" + }, + { + "include": "#string_double" + }, + { + "include": "#functions" + }, + { + "include": "#comment_line" + } + ] + }, + "at_rule_include": { + "patterns": [ + { + "begin": "(?<=@include)\\s+([\\w-]+)\\s*(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.scss" + }, + "2": { + "name": "punctuation.definition.parameters.begin.bracket.round.scss" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.scss" + } + }, + "name": "meta.at-rule.include.scss", + "patterns": [ + { + "include": "#function_attributes" + } + ] + }, + { + "match": "(?<=@include)\\s+([\\w-]+)", + "captures": { + "0": { + "name": "meta.at-rule.include.scss" + }, + "1": { + "name": "entity.name.function.scss" + } + } + }, + { + "match": "((@)include)\\b", + "captures": { + "0": { + "name": "meta.at-rule.include.scss" + }, + "1": { + "name": "keyword.control.at-rule.include.scss" + }, + "2": { + "name": "punctuation.definition.keyword.scss" + } + } + } + ] + }, + "at_rule_keyframes": { + "begin": "(?<=^|\\s)(@)(?:-(?:webkit|moz)-)?keyframes\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.at-rule.keyframes.scss" + }, + "1": { + "name": "punctuation.definition.keyword.scss" + } + }, + "end": "(?<=})", + "name": "meta.at-rule.keyframes.scss", + "patterns": [ + { + "match": "(?<=@keyframes)\\s+((?:[_A-Za-z][-\\w]|-[_A-Za-z])[-\\w]*)", + "captures": { + "1": { + "name": "entity.name.function.scss" + } + } + }, + { + "begin": "(?<=@keyframes)\\s+(\")", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.scss" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.scss" + } + }, + "name": "string.quoted.double.scss", + "contentName": "entity.name.function.scss", + "patterns": [ + { + "match": "\\\\(\\h{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "include": "#interpolation" + } + ] + }, + { + "begin": "(?<=@keyframes)\\s+(')", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.scss" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.scss" + } + }, + "name": "string.quoted.single.scss", + "contentName": "entity.name.function.scss", + "patterns": [ + { + "match": "\\\\(\\h{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "include": "#interpolation" + } + ] + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.keyframes.begin.scss" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.keyframes.end.scss" + } + }, + "patterns": [ + { + "match": "\\b(?:(?:100|[1-9]\\d|\\d)%|from|to)(?=\\s*{)", + "name": "entity.other.attribute-name.scss" + }, + { + "include": "#flow_control" + }, + { + "include": "#interpolation" + }, + { + "include": "#property_list" + }, + { + "include": "#rules" + } + ] + } + ] + }, + "at_rule_media": { + "patterns": [ + { + "begin": "^\\s*((@)media)\\b", + "beginCaptures": { + "1": { + "name": "keyword.control.at-rule.media.scss" + }, + "2": { + "name": "punctuation.definition.keyword.scss" + } + }, + "end": "\\s*(?={)", + "name": "meta.at-rule.media.scss", + "patterns": [ + { + "include": "#comment_block" + }, + { + "include": "#comment_line" + }, + { + "match": "\\b(only)\\b", + "name": "keyword.control.operator.css.scss" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.media-query.begin.bracket.round.scss" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.media-query.end.bracket.round.scss" + } + }, + "name": "meta.property-list.media-query.scss", + "patterns": [ + { + "begin": "(?=|<|>", + "name": "keyword.operator.comparison.scss" + }, + "logical_operators": { + "match": "\\b(not|or|and)\\b", + "name": "keyword.operator.logical.scss" + }, + "map": { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.begin.bracket.round.scss" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.map.end.bracket.round.scss" + } + }, + "name": "meta.definition.variable.map.scss", + "patterns": [ + { + "include": "#comment_block" + }, + { + "include": "#comment_line" + }, + { + "match": "\\b([\\w-]+)\\s*(:)", + "captures": { + "1": { + "name": "support.type.map.key.scss" + }, + "2": { + "name": "punctuation.separator.key-value.scss" + } + } + }, + { + "match": ",", + "name": "punctuation.separator.delimiter.scss" + }, + { + "include": "#map" + }, + { + "include": "#property_values" + }, + { + "include": "#variable" + } + ] + }, + "operators": { + "match": "[-+*/](?!\\s*[-+*/])", + "name": "keyword.operator.css" + }, + "parameters": { + "patterns": [ + { + "include": "#variable" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.begin.bracket.round.scss" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.end.bracket.round.scss" + } + }, + "patterns": [ + { + "include": "#function_attributes" + } + ] + }, + { + "include": "#property_values" + }, + { + "include": "#comment_block" + }, + { + "match": "[^'\",) \\t]+", + "name": "variable.parameter.url.scss" + }, + { + "match": ",", + "name": "punctuation.separator.delimiter.scss" + } + ] + }, + "properties": { + "patterns": [ + { + "begin": "(?+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.class.css", + "captures": { + "1": { + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.scss" + } + ] + } + } + }, + "selector_custom": { + "match": "\\b([a-zA-Z0-9]+(-[a-zA-Z0-9]+)+)(?=\\.|\\s++[^:]|\\s*[,\\[{]|:(link|visited|hover|active|focus|target|lang|disabled|enabled|checked|indeterminate|root|nth-(child|last-child|of-type|last-of-type)|first-child|last-child|first-of-type|last-of-type|only-child|only-of-type|empty|not|valid|invalid)(\\([0-9A-Za-z]*\\))?)", + "name": "entity.name.tag.custom.scss" + }, + "selector_id": { + "match": "(?x)\n(\\#) # Valid id-name\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.id.css", + "captures": { + "1": { + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.identifier.scss" + } + ] + } + } + }, + "selector_placeholder": { + "match": "(?x)\n(%) # Valid placeholder-name\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= ; # - End of statement\n | $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.placeholder.css", + "captures": { + "1": { + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.identifier.scss" + } + ] + } + } + }, + "parent_selector_suffix": { + "match": "(?x)\n(?<=&)\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.parent-selector-suffix.css", + "captures": { + "1": { + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.identifier.scss" + } + ] + } + } + }, + "selector_pseudo_class": { + "patterns": [ + { + "begin": "((:)\\bnth-(?:child|last-child|of-type|last-of-type))(\\()", + "beginCaptures": { + "1": { + "name": "entity.other.attribute-name.pseudo-class.css" + }, + "2": { + "name": "punctuation.definition.entity.css" + }, + "3": { + "name": "punctuation.definition.pseudo-class.begin.bracket.round.css" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.pseudo-class.end.bracket.round.css" + } + }, + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\d+", + "name": "constant.numeric.css" + }, + { + "match": "(?<=\\d)n\\b|\\b(n|even|odd)\\b", + "name": "constant.other.scss" + }, + { + "match": "\\w+", + "name": "invalid.illegal.scss" + } + ] + }, + { + "include": "source.css#pseudo-classes" + }, + { + "include": "source.css#pseudo-elements" + }, + { + "include": "source.css#functional-pseudo-classes" + } + ] + }, + "selectors": { + "patterns": [ + { + "include": "source.css#tag-names" + }, + { + "include": "#selector_custom" + }, + { + "include": "#selector_class" + }, + { + "include": "#selector_id" + }, + { + "include": "#selector_pseudo_class" + }, + { + "include": "#tag_wildcard" + }, + { + "include": "#tag_parent_reference" + }, + { + "include": "source.css#pseudo-elements" + }, + { + "include": "#selector_attribute" + }, + { + "include": "#selector_placeholder" + }, + { + "include": "#parent_selector_suffix" + } + ] + }, + "string_double": { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.scss" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.scss" + } + }, + "name": "string.quoted.double.scss", + "patterns": [ + { + "match": "\\\\(\\h{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "include": "#interpolation" + } + ] + }, + "string_single": { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.scss" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.scss" + } + }, + "name": "string.quoted.single.scss", + "patterns": [ + { + "match": "\\\\(\\h{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "include": "#interpolation" + } + ] + }, + "tag_parent_reference": { + "match": "&", + "name": "entity.name.tag.reference.scss" + }, + "tag_wildcard": { + "match": "\\*", + "name": "entity.name.tag.wildcard.scss" + }, + "variable": { + "patterns": [ + { + "include": "#variables" + }, + { + "include": "#interpolation" + } + ] + }, + "variable_setting": { + "begin": "(?=\\$[\\w-]+\\s*:)", + "end": ";", + "endCaptures": { + "0": { + "name": "punctuation.terminator.rule.scss" + } + }, + "contentName": "meta.definition.variable.scss", + "patterns": [ + { + "match": "\\$[\\w-]+(?=\\s*:)", + "name": "variable.scss" + }, + { + "begin": ":", + "beginCaptures": { + "0": { + "name": "punctuation.separator.key-value.scss" + } + }, + "end": "(?=;)", + "patterns": [ + { + "include": "#comment_block" + }, + { + "include": "#comment_line" + }, + { + "include": "#map" + }, + { + "include": "#property_values" + }, + { + "include": "#variable" + }, + { + "match": ",", + "name": "punctuation.separator.delimiter.scss" + } + ] + } + ] + }, + "variables": { + "match": "(\\$|\\-\\-)[A-Za-z0-9_-]+\\b", + "name": "variable.scss" + } + } +} \ No newline at end of file diff --git a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json new file mode 100644 index 0000000000..70717a1ef0 --- /dev/null +++ b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json @@ -0,0 +1,3997 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScript.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "name": "TypeScript", + "scopeName": "source.ts", + "fileTypes": [ + "ts" + ], + "uuid": "ef98eb90-bf9b-11e4-bb52-0800200c9a66", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#statements" + }, + { + "name": "comment.line.shebang.ts", + "match": "\\A(#!).*(?=$)", + "captures": { + "1": { + "name": "punctuation.definition.comment.ts" + } + } + } + ], + "repository": { + "statements": { + "patterns": [ + { + "include": "#string" + }, + { + "include": "#template" + }, + { + "include": "#comment" + }, + { + "include": "#declaration" + }, + { + "include": "#control-statement" + }, + { + "include": "#after-operator-block-as-object-literal" + }, + { + "include": "#decl-block" + }, + { + "include": "#expression" + }, + { + "include": "#punctuation-semicolon" + } + ] + }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.ts", + "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.ts entity.name.function.ts" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.ts", + "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.ts variable.other.constant.ts" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.ts", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.ts variable.other.readwrite.ts" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + } + ] + }, + "var-single-variable-type-annotation": { + "patterns": [ + { + "include": "#type-annotation" + }, + { + "include": "#string" + }, + { + "include": "#comment" + } + ] + }, + "destructuring-variable": { + "patterns": [ + { + "name": "meta.object-binding-pattern-variable.ts", + "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.ts" + }, + "2": { + "name": "keyword.operator.rest.ts" + }, + "3": { + "name": "entity.name.function.ts variable.language.this.ts" + }, + "4": { + "name": "entity.name.function.ts" + }, + "5": { + "name": "keyword.operator.optional.ts" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.ts variable.object.property.ts", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.ts", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.ts" + }, + "2": { + "name": "variable.parameter.ts" + } + } + }, + { + "name": "meta.arrow.ts", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.ts" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.ts", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.ts" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.ts", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "captures": { + "0": { + "name": "meta.object-literal.key.ts" + }, + "1": { + "name": "entity.name.function.ts" + } + } + }, + { + "name": "meta.object.member.ts", + "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", + "captures": { + "0": { + "name": "meta.object-literal.key.ts" + } + } + }, + { + "name": "meta.object.member.ts", + "begin": "\\.\\.\\.", + "beginCaptures": { + "0": { + "name": "keyword.operator.spread.ts" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.ts", + "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", + "captures": { + "1": { + "name": "variable.other.readwrite.ts" + } + } + }, + { + "name": "meta.object.member.ts", + "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", + "end": "(?=,|\\}|$)", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.ts", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.ts punctuation.separator.key-value.ts" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "include": "#punctuation-comma" + } + ] + }, + "ternary-expression": { + "begin": "(\\?)", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.ts" + } + }, + "end": "(:)", + "endCaptures": { + "0": { + "name": "keyword.operator.ternary.ts" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "function-call": { + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "name": "meta.function-call.ts", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", + "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "include": "#literal" + }, + { + "include": "#support-objects" + }, + { + "include": "#object-identifiers" + }, + { + "include": "#punctuation-accessor" + }, + { + "name": "keyword.operator.expression.import.ts", + "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" + }, + { + "name": "entity.name.function.ts", + "match": "([_$[:alpha:]][_$[:alnum:]]*)" + } + ] + }, + { + "include": "#comment" + }, + { + "name": "meta.type.parameters.ts", + "begin": "\\<", + "beginCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.begin.ts" + } + }, + "end": "\\>", + "endCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.end.ts" + } + }, + "patterns": [ + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + { + "include": "#paren-expression" + } + ] + }, + "new-expr": { + "name": "new.expr.ts", + "begin": "(?*?]|[^+]\\+))\\s*(<)(?!)\\s*", + "endCaptures": { + "1": { + "name": "meta.brace.angle.ts" + } + }, + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "cast.expr.ts", + "begin": "(?:(?<=^))\\s*(<)(?=[_$[:alpha:]][_$[:alnum:]]*\\s*>)", + "beginCaptures": { + "1": { + "name": "meta.brace.angle.ts" + } + }, + "end": "(\\>)\\s*", + "endCaptures": { + "1": { + "name": "meta.brace.angle.ts" + } + }, + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "expression-operators": { + "patterns": [ + { + "name": "keyword.control.flow.ts", + "match": "(?>=|>>>=|\\|=" + }, + { + "name": "keyword.operator.bitwise.shift.ts", + "match": "<<|>>>|>>" + }, + { + "name": "keyword.operator.comparison.ts", + "match": "===|!==|==|!=" + }, + { + "name": "keyword.operator.relational.ts", + "match": "<=|>=|<>|<|>" + }, + { + "name": "keyword.operator.logical.ts", + "match": "\\!|&&|\\|\\|" + }, + { + "name": "keyword.operator.bitwise.ts", + "match": "\\&|~|\\^|\\|" + }, + { + "name": "keyword.operator.assignment.ts", + "match": "\\=" + }, + { + "name": "keyword.operator.decrement.ts", + "match": "--" + }, + { + "name": "keyword.operator.increment.ts", + "match": "\\+\\+" + }, + { + "name": "keyword.operator.arithmetic.ts", + "match": "%|\\*|/|-|\\+" + }, + { + "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", + "captures": { + "1": { + "name": "keyword.operator.arithmetic.ts" + } + } + } + ] + }, + "typeof-operator": { + "name": "keyword.operator.expression.typeof.ts", + "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "support.constant.dom.ts" + }, + "3": { + "name": "support.variable.property.dom.ts" + } + } + }, + { + "name": "support.class.node.ts", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "entity.name.function.ts" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "variable.other.constant.property.ts" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "variable.other.property.ts" + } + } + }, + { + "name": "variable.other.constant.ts", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.ts", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.ts", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "variable.other.constant.object.property.ts" + }, + "3": { + "name": "variable.other.object.property.ts" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.ts" + }, + "2": { + "name": "variable.other.object.ts" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.ts", + "begin": "(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.ts" + } + }, + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "meta.type.annotation.ts", + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.ts" + } + }, + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.ts", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.ts" + } + }, + "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "begin": "(?<=[:])(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-parameters": { + "name": "meta.type.parameters.ts", + "begin": "(<)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.begin.ts" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.ts" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.ts", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] + }, + "type-primitive": { + "name": "support.type.primitive.ts", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.ts", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.ts" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.ts", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.ts" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.ts" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.ts" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.ts", + "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.ts" + } + }, + "end": "(/)([gimuy]*)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.ts" + }, + "2": { + "name": "keyword.other.ts" + } + }, + "patterns": [ + { + "include": "#regexp" + } + ] + }, + { + "name": "string.regexp.ts", + "begin": "(?\\s*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.ts" + } + }, + "end": "(?=^)", + "patterns": [ + { + "name": "meta.tag.ts", + "begin": "(<)(reference|amd-dependency|amd-module)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.directive.ts" + }, + "2": { + "name": "entity.name.tag.directive.ts" + } + }, + "end": "/>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.directive.ts" + } + }, + "patterns": [ + { + "name": "entity.other.attribute-name.directive.ts", + "match": "path|types|no-default-lib|name" + }, + { + "name": "keyword.operator.assignment.ts", + "match": "=" + }, + { + "include": "#string" + } + ] + } + ] + }, + "docblock": { + "patterns": [ + { + "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.access-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "5": { + "name": "constant.other.email.link.underline.jsdoc" + }, + "6": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "keyword.operator.control.jsdoc" + }, + "5": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "name": "meta.example.jsdoc", + "begin": "((@)example)\\s+", + "end": "(?=@|\\*/)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "patterns": [ + { + "match": "^\\s\\*\\s+" + }, + { + "contentName": "constant.other.description.jsdoc", + "begin": "\\G(<)caption(>)", + "beginCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + }, + "end": "()|(?=\\*/)", + "endCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "[^\\s@*](?:[^*]|\\*[^/])*", + "captures": { + "0": { + "name": "source.embedded.ts" + } + } + } + ] + }, + { + "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.symbol-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.link.underline.jsdoc" + }, + "4": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "begin": "((@)typedef)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "entity.name.type.instance.jsdoc", + "match": "(?:[^@\\s*/]|\\*[^/])+" + } + ] + }, + { + "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + }, + { + "name": "variable.other.jsdoc", + "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", + "captures": { + "1": { + "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" + }, + "2": { + "name": "keyword.operator.assignment.jsdoc" + }, + "3": { + "name": "source.embedded.ts" + }, + "4": { + "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" + }, + "5": { + "name": "invalid.illegal.syntax.jsdoc" + } + } + } + ] + }, + { + "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + } + ] + }, + { + "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "contentName": "variable.other.jsdoc", + "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + }, + "4": { + "name": "punctuation.definition.string.begin.jsdoc" + } + }, + "end": "(\\3)|(?=$|\\*/)", + "endCaptures": { + "0": { + "name": "variable.other.jsdoc" + }, + "1": { + "name": "punctuation.definition.string.end.jsdoc" + } + } + }, + { + "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "name": "storage.type.class.jsdoc", + "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", + "captures": { + "1": { + "name": "punctuation.definition.block.tag.jsdoc" + } + } + }, + { + "include": "#inline-tags" + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "{", + "end": "}|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\[", + "end": "\\]|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "inline-tags": { + "patterns": [ + { + "name": "constant.other.description.jsdoc", + "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", + "captures": { + "1": { + "name": "punctuation.definition.bracket.square.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.square.end.jsdoc" + } + } + }, + { + "name": "entity.name.type.instance.jsdoc", + "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", + "beginCaptures": { + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + }, + "2": { + "name": "storage.type.class.jsdoc" + }, + "3": { + "name": "punctuation.definition.inline.tag.jsdoc" + } + }, + "end": "}|(?=\\*/)", + "endCaptures": { + "0": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.link.underline.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + }, + { + "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.description.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + } + ] + } + ] + }, + "jsdoctype": { + "patterns": [ + { + "name": "invalid.illegal.type.jsdoc", + "match": "\\G{(?:[^}*]|\\*[^/}])+$" + }, + { + "contentName": "entity.name.type.instance.jsdoc", + "begin": "\\G({)", + "beginCaptures": { + "0": { + "name": "entity.name.type.instance.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + } + }, + "end": "((}))\\s*|(?=\\*/)", + "endCaptures": { + "1": { + "name": "entity.name.type.instance.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json new file mode 100644 index 0000000000..477576d481 --- /dev/null +++ b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json @@ -0,0 +1,4259 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8361b1a232501c67911c81a4664a9460d7922c6b", + "name": "TypeScriptReact", + "scopeName": "source.tsx", + "fileTypes": [ + "tsx" + ], + "uuid": "805375ec-d614-41f5-8993-5843fe63ea82", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#statements" + }, + { + "name": "comment.line.shebang.ts", + "match": "\\A(#!).*(?=$)", + "captures": { + "1": { + "name": "punctuation.definition.comment.ts" + } + } + } + ], + "repository": { + "statements": { + "patterns": [ + { + "include": "#string" + }, + { + "include": "#template" + }, + { + "include": "#comment" + }, + { + "include": "#declaration" + }, + { + "include": "#control-statement" + }, + { + "include": "#after-operator-block-as-object-literal" + }, + { + "include": "#decl-block" + }, + { + "include": "#expression" + }, + { + "include": "#punctuation-semicolon" + } + ] + }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.tsx", + "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.tsx entity.name.function.tsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.tsx", + "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.tsx variable.other.constant.tsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.tsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.tsx variable.other.readwrite.tsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + } + ] + }, + "var-single-variable-type-annotation": { + "patterns": [ + { + "include": "#type-annotation" + }, + { + "include": "#string" + }, + { + "include": "#comment" + } + ] + }, + "destructuring-variable": { + "patterns": [ + { + "name": "meta.object-binding-pattern-variable.tsx", + "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.tsx" + }, + "2": { + "name": "keyword.operator.rest.tsx" + }, + "3": { + "name": "entity.name.function.tsx variable.language.this.tsx" + }, + "4": { + "name": "entity.name.function.tsx" + }, + "5": { + "name": "keyword.operator.optional.tsx" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.tsx variable.object.property.tsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.tsx", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.tsx" + }, + "2": { + "name": "variable.parameter.tsx" + } + } + }, + { + "name": "meta.arrow.tsx", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.tsx" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.tsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.tsx" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.tsx", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "captures": { + "0": { + "name": "meta.object-literal.key.tsx" + }, + "1": { + "name": "entity.name.function.tsx" + } + } + }, + { + "name": "meta.object.member.tsx", + "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", + "captures": { + "0": { + "name": "meta.object-literal.key.tsx" + } + } + }, + { + "name": "meta.object.member.tsx", + "begin": "\\.\\.\\.", + "beginCaptures": { + "0": { + "name": "keyword.operator.spread.tsx" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.tsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", + "captures": { + "1": { + "name": "variable.other.readwrite.tsx" + } + } + }, + { + "name": "meta.object.member.tsx", + "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", + "end": "(?=,|\\}|$)", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.tsx", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.tsx punctuation.separator.key-value.tsx" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "include": "#punctuation-comma" + } + ] + }, + "ternary-expression": { + "begin": "(\\?)", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.tsx" + } + }, + "end": "(:)", + "endCaptures": { + "0": { + "name": "keyword.operator.ternary.tsx" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "function-call": { + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "name": "meta.function-call.tsx", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", + "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`]([^<>]|\\<\\s*[_$[:alpha:]\\{\\(\\[\\\"\\'\\`][^<>]+\\>)+>\\s*)?\\()", + "patterns": [ + { + "include": "#literal" + }, + { + "include": "#support-objects" + }, + { + "include": "#object-identifiers" + }, + { + "include": "#punctuation-accessor" + }, + { + "name": "keyword.operator.expression.import.tsx", + "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" + }, + { + "name": "entity.name.function.tsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)" + } + ] + }, + { + "include": "#comment" + }, + { + "name": "meta.type.parameters.tsx", + "begin": "\\<", + "beginCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.begin.tsx" + } + }, + "end": "\\>", + "endCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.end.tsx" + } + }, + "patterns": [ + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + { + "include": "#paren-expression" + } + ] + }, + "new-expr": { + "name": "new.expr.tsx", + "begin": "(?>=|>>>=|\\|=" + }, + { + "name": "keyword.operator.bitwise.shift.tsx", + "match": "<<|>>>|>>" + }, + { + "name": "keyword.operator.comparison.tsx", + "match": "===|!==|==|!=" + }, + { + "name": "keyword.operator.relational.tsx", + "match": "<=|>=|<>|<|>" + }, + { + "name": "keyword.operator.logical.tsx", + "match": "\\!|&&|\\|\\|" + }, + { + "name": "keyword.operator.bitwise.tsx", + "match": "\\&|~|\\^|\\|" + }, + { + "name": "keyword.operator.assignment.tsx", + "match": "\\=" + }, + { + "name": "keyword.operator.decrement.tsx", + "match": "--" + }, + { + "name": "keyword.operator.increment.tsx", + "match": "\\+\\+" + }, + { + "name": "keyword.operator.arithmetic.tsx", + "match": "%|\\*|/|-|\\+" + }, + { + "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", + "captures": { + "1": { + "name": "keyword.operator.arithmetic.tsx" + } + } + } + ] + }, + "typeof-operator": { + "name": "keyword.operator.expression.typeof.tsx", + "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "support.constant.dom.tsx" + }, + "3": { + "name": "support.variable.property.dom.tsx" + } + } + }, + { + "name": "support.class.node.tsx", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(\\s*([_$[:alpha:]\\{\\[]([^()]|\\((\\s*[^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "entity.name.function.tsx" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "variable.other.constant.property.tsx" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "variable.other.property.tsx" + } + } + }, + { + "name": "variable.other.constant.tsx", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.tsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.tsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "variable.other.constant.object.property.tsx" + }, + "3": { + "name": "variable.other.object.property.tsx" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.tsx" + }, + "2": { + "name": "variable.other.object.tsx" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.tsx", + "begin": "(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.tsx" + } + }, + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "meta.type.annotation.tsx", + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.tsx" + } + }, + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.tsx", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.tsx" + } + }, + "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "begin": "(?<=[:])(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-parameters": { + "name": "meta.type.parameters.tsx", + "begin": "(<)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.begin.tsx" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.tsx" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.tsx", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] + }, + "type-primitive": { + "name": "support.type.primitive.tsx", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.tsx", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.tsx" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.tsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.tsx" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.tsx" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.tsx" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.tsx", + "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.tsx" + } + }, + "end": "(/)([gimuy]*)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.tsx" + }, + "2": { + "name": "keyword.other.tsx" + } + }, + "patterns": [ + { + "include": "#regexp" + } + ] + }, + { + "name": "string.regexp.tsx", + "begin": "(?\\s*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.tsx" + } + }, + "end": "(?=^)", + "patterns": [ + { + "name": "meta.tag.tsx", + "begin": "(<)(reference|amd-dependency|amd-module)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.directive.tsx" + }, + "2": { + "name": "entity.name.tag.directive.tsx" + } + }, + "end": "/>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.directive.tsx" + } + }, + "patterns": [ + { + "name": "entity.other.attribute-name.directive.tsx", + "match": "path|types|no-default-lib|name" + }, + { + "name": "keyword.operator.assignment.tsx", + "match": "=" + }, + { + "include": "#string" + } + ] + } + ] + }, + "docblock": { + "patterns": [ + { + "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.access-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "5": { + "name": "constant.other.email.link.underline.jsdoc" + }, + "6": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "keyword.operator.control.jsdoc" + }, + "5": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "name": "meta.example.jsdoc", + "begin": "((@)example)\\s+", + "end": "(?=@|\\*/)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "patterns": [ + { + "match": "^\\s\\*\\s+" + }, + { + "contentName": "constant.other.description.jsdoc", + "begin": "\\G(<)caption(>)", + "beginCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + }, + "end": "()|(?=\\*/)", + "endCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "[^\\s@*](?:[^*]|\\*[^/])*", + "captures": { + "0": { + "name": "source.embedded.tsx" + } + } + } + ] + }, + { + "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.symbol-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.link.underline.jsdoc" + }, + "4": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "begin": "((@)typedef)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "entity.name.type.instance.jsdoc", + "match": "(?:[^@\\s*/]|\\*[^/])+" + } + ] + }, + { + "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + }, + { + "name": "variable.other.jsdoc", + "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", + "captures": { + "1": { + "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" + }, + "2": { + "name": "keyword.operator.assignment.jsdoc" + }, + "3": { + "name": "source.embedded.tsx" + }, + "4": { + "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" + }, + "5": { + "name": "invalid.illegal.syntax.jsdoc" + } + } + } + ] + }, + { + "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + } + ] + }, + { + "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "contentName": "variable.other.jsdoc", + "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + }, + "4": { + "name": "punctuation.definition.string.begin.jsdoc" + } + }, + "end": "(\\3)|(?=$|\\*/)", + "endCaptures": { + "0": { + "name": "variable.other.jsdoc" + }, + "1": { + "name": "punctuation.definition.string.end.jsdoc" + } + } + }, + { + "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "name": "storage.type.class.jsdoc", + "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", + "captures": { + "1": { + "name": "punctuation.definition.block.tag.jsdoc" + } + } + }, + { + "include": "#inline-tags" + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "{", + "end": "}|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\[", + "end": "\\]|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "inline-tags": { + "patterns": [ + { + "name": "constant.other.description.jsdoc", + "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", + "captures": { + "1": { + "name": "punctuation.definition.bracket.square.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.square.end.jsdoc" + } + } + }, + { + "name": "entity.name.type.instance.jsdoc", + "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", + "beginCaptures": { + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + }, + "2": { + "name": "storage.type.class.jsdoc" + }, + "3": { + "name": "punctuation.definition.inline.tag.jsdoc" + } + }, + "end": "}|(?=\\*/)", + "endCaptures": { + "0": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.link.underline.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + }, + { + "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.description.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + } + ] + } + ] + }, + "jsdoctype": { + "patterns": [ + { + "name": "invalid.illegal.type.jsdoc", + "match": "\\G{(?:[^}*]|\\*[^/}])+$" + }, + { + "contentName": "entity.name.type.instance.jsdoc", + "begin": "\\G({)", + "beginCaptures": { + "0": { + "name": "entity.name.type.instance.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + } + }, + "end": "((}))\\s*|(?=\\*/)", + "endCaptures": { + "1": { + "name": "entity.name.type.instance.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "jsx": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes-in-expression" + }, + { + "include": "#jsx-tag-in-expression" + } + ] + }, + "jsx-tag-without-attributes-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + } + ] + }, + "jsx-tag-without-attributes": { + "name": "meta.tag.without-attributes.tsx", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.tsx" + }, + "2": { + "name": "entity.name.tag.tsx" + }, + "3": { + "name": "support.class.component.tsx" + }, + "4": { + "name": "punctuation.definition.tag.end.tsx" + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.tsx" + }, + "2": { + "name": "entity.name.tag.tsx" + }, + "3": { + "name": "support.class.component.tsx" + }, + "4": { + "name": "punctuation.definition.tag.end.tsx" + } + }, + "contentName": "meta.jsx.children.tsx", + "patterns": [ + { + "include": "#jsx-children" + } + ] + }, + "jsx-tag-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.tsx" + }, + "1": { + "name": "punctuation.definition.tag.end.tsx" + }, + "2": { + "name": "punctuation.definition.tag.begin.tsx" + }, + "3": { + "name": "entity.name.tag.tsx" + }, + "4": { + "name": "support.class.component.tsx" + }, + "5": { + "name": "punctuation.definition.tag.end.tsx" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-child-tag": { + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.tsx" + }, + "1": { + "name": "punctuation.definition.tag.end.tsx" + }, + "2": { + "name": "punctuation.definition.tag.begin.tsx" + }, + "3": { + "name": "entity.name.tag.tsx" + }, + "4": { + "name": "support.class.component.tsx" + }, + "5": { + "name": "punctuation.definition.tag.end.tsx" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-tag": { + "name": "meta.tag.tsx", + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(?=(/>)|(?:()))", + "patterns": [ + { + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.tsx" + }, + "2": { + "name": "entity.name.tag.tsx" + }, + "3": { + "name": "support.class.component.tsx" + } + }, + "end": "(?=[/]?>)", + "contentName": "meta.tag.attributes.tsx", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#jsx-tag-attributes" + }, + { + "include": "#jsx-tag-attributes-illegal" + } + ] + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.tsx" + } + }, + "end": "(?=|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.tsx" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.tsx", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.tsx", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.tsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.tsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.tsx", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.tsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.tsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.tsx", + "match": "\\S+" + } + } +} \ No newline at end of file diff --git a/languages/javascript/syntaxes/JavaScript.tmLanguage.json b/languages/javascript/syntaxes/JavaScript.tmLanguage.json new file mode 100644 index 0000000000..7b1ec3d76c --- /dev/null +++ b/languages/javascript/syntaxes/JavaScript.tmLanguage.json @@ -0,0 +1,4272 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/824f47ea6e98590ac2e75db5bebdf6eff71421ad", + "name": "JavaScript (with React support)", + "scopeName": "source.js", + "fileTypes": [ + ".js", + ".jsx", + ".es6", + ".mjs" + ], + "uuid": "805375ec-d614-41f5-8993-5843fe63ea82", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#statements" + }, + { + "name": "comment.line.shebang.ts", + "match": "\\A(#!).*(?=$)", + "captures": { + "1": { + "name": "punctuation.definition.comment.ts" + } + } + } + ], + "repository": { + "statements": { + "patterns": [ + { + "include": "#string" + }, + { + "include": "#template" + }, + { + "include": "#comment" + }, + { + "include": "#declaration" + }, + { + "include": "#control-statement" + }, + { + "include": "#after-operator-block-as-object-literal" + }, + { + "include": "#decl-block" + }, + { + "include": "#expression" + }, + { + "include": "#punctuation-semicolon" + } + ] + }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.js", + "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js entity.name.function.js" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js", + "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js variable.other.constant.js" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js variable.other.readwrite.js" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + } + ] + }, + "var-single-variable-type-annotation": { + "patterns": [ + { + "include": "#type-annotation" + }, + { + "include": "#string" + }, + { + "include": "#comment" + } + ] + }, + "destructuring-variable": { + "patterns": [ + { + "name": "meta.object-binding-pattern-variable.js", + "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.js" + }, + "2": { + "name": "keyword.operator.rest.js" + }, + "3": { + "name": "entity.name.function.js variable.language.this.js" + }, + "4": { + "name": "entity.name.function.js" + }, + "5": { + "name": "keyword.operator.optional.js" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.js variable.object.property.js", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.js", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.js" + }, + "2": { + "name": "variable.parameter.js" + } + } + }, + { + "name": "meta.arrow.js", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.js", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.js", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "captures": { + "0": { + "name": "meta.object-literal.key.js" + }, + "1": { + "name": "entity.name.function.js" + } + } + }, + { + "name": "meta.object.member.js", + "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", + "captures": { + "0": { + "name": "meta.object-literal.key.js" + } + } + }, + { + "name": "meta.object.member.js", + "begin": "\\.\\.\\.", + "beginCaptures": { + "0": { + "name": "keyword.operator.spread.js" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", + "captures": { + "1": { + "name": "variable.other.readwrite.js" + } + } + }, + { + "name": "meta.object.member.js", + "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", + "end": "(?=,|\\}|$)", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.js punctuation.separator.key-value.js" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "include": "#punctuation-comma" + } + ] + }, + "ternary-expression": { + "begin": "(\\?)", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.js" + } + }, + "end": "(:)", + "endCaptures": { + "0": { + "name": "keyword.operator.ternary.js" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "function-call": { + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "patterns": [ + { + "name": "meta.function-call.js", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", + "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "patterns": [ + { + "include": "#literal" + }, + { + "include": "#support-objects" + }, + { + "include": "#object-identifiers" + }, + { + "include": "#punctuation-accessor" + }, + { + "name": "keyword.operator.expression.import.js", + "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" + }, + { + "name": "entity.name.function.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)" + } + ] + }, + { + "include": "#comment" + }, + { + "name": "meta.type.parameters.js", + "begin": "\\<", + "beginCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.begin.js" + } + }, + "end": "\\>", + "endCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.end.js" + } + }, + "patterns": [ + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + { + "include": "#paren-expression" + } + ] + }, + "new-expr": { + "name": "new.expr.js", + "begin": "(?>=|>>>=|\\|=" + }, + { + "name": "keyword.operator.bitwise.shift.js", + "match": "<<|>>>|>>" + }, + { + "name": "keyword.operator.comparison.js", + "match": "===|!==|==|!=" + }, + { + "name": "keyword.operator.relational.js", + "match": "<=|>=|<>|<|>" + }, + { + "name": "keyword.operator.logical.js", + "match": "\\!|&&|\\|\\|" + }, + { + "name": "keyword.operator.bitwise.js", + "match": "\\&|~|\\^|\\|" + }, + { + "name": "keyword.operator.assignment.js", + "match": "\\=" + }, + { + "name": "keyword.operator.decrement.js", + "match": "--" + }, + { + "name": "keyword.operator.increment.js", + "match": "\\+\\+" + }, + { + "name": "keyword.operator.arithmetic.js", + "match": "%|\\*|/|-|\\+" + }, + { + "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", + "captures": { + "1": { + "name": "keyword.operator.arithmetic.js" + } + } + } + ] + }, + "typeof-operator": { + "name": "keyword.operator.expression.typeof.js", + "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "support.constant.dom.js" + }, + "3": { + "name": "support.variable.property.dom.js" + } + } + }, + { + "name": "support.class.node.js", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "entity.name.function.js" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.constant.property.js" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.property.js" + } + } + }, + { + "name": "variable.other.constant.js", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.js", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.constant.object.property.js" + }, + "3": { + "name": "variable.other.object.property.js" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.js" + }, + "2": { + "name": "variable.other.object.js" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.js", + "begin": "(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "meta.type.annotation.js", + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.js", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "begin": "(?<=[:])(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-parameters": { + "name": "meta.type.parameters.js", + "begin": "(<)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.begin.js" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.js" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.js", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] + }, + "type-primitive": { + "name": "support.type.primitive.js", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.js", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.js", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.js", + "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.js" + } + }, + "end": "(/)([gimuy]*)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.js" + }, + "2": { + "name": "keyword.other.js" + } + }, + "patterns": [ + { + "include": "#regexp" + } + ] + }, + { + "name": "string.regexp.js", + "begin": "(?\\s*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.js" + } + }, + "end": "(?=^)", + "patterns": [ + { + "name": "meta.tag.js", + "begin": "(<)(reference|amd-dependency|amd-module)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.directive.js" + }, + "2": { + "name": "entity.name.tag.directive.js" + } + }, + "end": "/>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.directive.js" + } + }, + "patterns": [ + { + "name": "entity.other.attribute-name.directive.js", + "match": "path|types|no-default-lib|name" + }, + { + "name": "keyword.operator.assignment.js", + "match": "=" + }, + { + "include": "#string" + } + ] + } + ] + }, + "docblock": { + "patterns": [ + { + "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.access-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "5": { + "name": "constant.other.email.link.underline.jsdoc" + }, + "6": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "keyword.operator.control.jsdoc" + }, + "5": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "name": "meta.example.jsdoc", + "begin": "((@)example)\\s+", + "end": "(?=@|\\*/)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "patterns": [ + { + "match": "^\\s\\*\\s+" + }, + { + "contentName": "constant.other.description.jsdoc", + "begin": "\\G(<)caption(>)", + "beginCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + }, + "end": "()|(?=\\*/)", + "endCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "[^\\s@*](?:[^*]|\\*[^/])*", + "captures": { + "0": { + "name": "source.embedded.js" + } + } + } + ] + }, + { + "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.symbol-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.link.underline.jsdoc" + }, + "4": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "begin": "((@)typedef)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "entity.name.type.instance.jsdoc", + "match": "(?:[^@\\s*/]|\\*[^/])+" + } + ] + }, + { + "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + }, + { + "name": "variable.other.jsdoc", + "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", + "captures": { + "1": { + "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" + }, + "2": { + "name": "keyword.operator.assignment.jsdoc" + }, + "3": { + "name": "source.embedded.js" + }, + "4": { + "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" + }, + "5": { + "name": "invalid.illegal.syntax.jsdoc" + } + } + } + ] + }, + { + "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + } + ] + }, + { + "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "contentName": "variable.other.jsdoc", + "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + }, + "4": { + "name": "punctuation.definition.string.begin.jsdoc" + } + }, + "end": "(\\3)|(?=$|\\*/)", + "endCaptures": { + "0": { + "name": "variable.other.jsdoc" + }, + "1": { + "name": "punctuation.definition.string.end.jsdoc" + } + } + }, + { + "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "name": "storage.type.class.jsdoc", + "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", + "captures": { + "1": { + "name": "punctuation.definition.block.tag.jsdoc" + } + } + }, + { + "include": "#inline-tags" + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "{", + "end": "}|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\[", + "end": "\\]|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "inline-tags": { + "patterns": [ + { + "name": "constant.other.description.jsdoc", + "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", + "captures": { + "1": { + "name": "punctuation.definition.bracket.square.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.square.end.jsdoc" + } + } + }, + { + "name": "entity.name.type.instance.jsdoc", + "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", + "beginCaptures": { + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + }, + "2": { + "name": "storage.type.class.jsdoc" + }, + "3": { + "name": "punctuation.definition.inline.tag.jsdoc" + } + }, + "end": "}|(?=\\*/)", + "endCaptures": { + "0": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.link.underline.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + }, + { + "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.description.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + } + ] + } + ] + }, + "jsdoctype": { + "patterns": [ + { + "name": "invalid.illegal.type.jsdoc", + "match": "\\G{(?:[^}*]|\\*[^/}])+$" + }, + { + "contentName": "entity.name.type.instance.jsdoc", + "begin": "\\G({)", + "beginCaptures": { + "0": { + "name": "entity.name.type.instance.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + } + }, + "end": "((}))\\s*|(?=\\*/)", + "endCaptures": { + "1": { + "name": "entity.name.type.instance.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "jsx": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes-in-expression" + }, + { + "include": "#jsx-tag-in-expression" + }, + { + "include": "#jsx-tag-invalid" + } + ] + }, + "jsx-tag-without-attributes-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + } + ] + }, + "jsx-tag-without-attributes": { + "name": "meta.tag.without-attributes.js", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js" + }, + "2": { + "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" + }, + "4": { + "name": "punctuation.definition.tag.end.js" + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js" + }, + "2": { + "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" + }, + "4": { + "name": "punctuation.definition.tag.end.js" + } + }, + "contentName": "meta.jsx.children.js", + "patterns": [ + { + "include": "#jsx-children" + } + ] + }, + "jsx-tag-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js" + }, + "1": { + "name": "punctuation.definition.tag.end.js" + }, + "2": { + "name": "punctuation.definition.tag.begin.js" + }, + "3": { + "name": "entity.name.tag.js" + }, + "4": { + "name": "support.class.component.js" + }, + "5": { + "name": "punctuation.definition.tag.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-child-tag": { + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js" + }, + "1": { + "name": "punctuation.definition.tag.end.js" + }, + "2": { + "name": "punctuation.definition.tag.begin.js" + }, + "3": { + "name": "entity.name.tag.js" + }, + "4": { + "name": "support.class.component.js" + }, + "5": { + "name": "punctuation.definition.tag.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-tag": { + "name": "meta.tag.js", + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(?=(/>)|(?:()))", + "patterns": [ + { + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js" + }, + "2": { + "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" + } + }, + "end": "(?=[/]?>)", + "contentName": "meta.tag.attributes.js", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#jsx-tag-attributes" + }, + { + "include": "#jsx-tag-attributes-illegal" + } + ] + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.js" + } + }, + "end": "(?=" + }, + "jsx-children": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + }, + { + "include": "#jsx-child-tag" + }, + { + "include": "#jsx-tag-invalid" + }, + { + "include": "#jsx-evaluated-code" + }, + { + "include": "#jsx-entities" + } + ] + }, + "jsx-evaluated-code": { + "name": "meta.embedded.expression.js", + "begin": "\\{", + "end": "\\}", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.js" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "jsx-entities": { + "patterns": [ + { + "name": "constant.character.entity.js", + "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", + "captures": { + "1": { + "name": "punctuation.definition.entity.js" + }, + "3": { + "name": "punctuation.definition.entity.js" + } + } + }, + { + "name": "invalid.illegal.bad-ampersand.js", + "match": "&" + } + ] + }, + "jsx-tag-attributes": { + "patterns": [ + { + "include": "#jsx-tag-attribute-name" + }, + { + "include": "#jsx-tag-attribute-assignment" + }, + { + "include": "#jsx-string-double-quoted" + }, + { + "include": "#jsx-string-single-quoted" + }, + { + "include": "#jsx-evaluated-code" + } + ] + }, + "jsx-tag-attribute-name": { + "match": "(?x)\n \\s*\n ([_$a-zA-Z][-$\\w]*)\n (?=\\s|=|/?>|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.js" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.js", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.js", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.js", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.js", + "match": "\\S+" + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 2d3b5dbb8a..2f59755d05 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,8 @@ "typescript": "2.6.1", "vscode-jsonrpc": "3.5.0", "vscode-languageserver": "3.5.0", - "vscode-languageserver-types": "3.5.0" + "vscode-languageserver-types": "3.5.0", + "vscode-textmate": "3.2.0" }, "devDependencies": { "@types/classnames": "0.0.32", @@ -174,6 +175,7 @@ "react-redux": "5.0.6", "react-transition-group": "2.2.1", "redux": "3.7.2", + "redux-observable": "^0.17.0", "redux-thunk": "2.2.0", "reselect": "3.0.1", "rxjs": "5.5.0", diff --git a/vim/core/colors/onedark.vim b/vim/core/colors/onedark.vim index 936e40bb14..3ef7d831dd 100644 --- a/vim/core/colors/onedark.vim +++ b/vim/core/colors/onedark.vim @@ -147,7 +147,7 @@ call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc. call s:h("Label", { "fg": s:purple }) " case, default, etc. call s:h("Operator", { "fg": s:purple }) " sizeof", "+", "*", etc. -call s:h("Keyword", { "fg": s:red }) " any other keyword +call s:h("Keyword", { "fg": s:purple }) " any other keyword call s:h("Exception", { "fg": s:purple }) " try, catch, throw call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor call s:h("Include", { "fg": s:blue }) " preprocessor #include diff --git a/yarn.lock b/yarn.lock index f45fcdcfe4..81513761fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2357,6 +2357,10 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" +fast-plist@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/fast-plist/-/fast-plist-0.1.2.tgz#a45aff345196006d406ca6cdcd05f69051ef35b8" + fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" @@ -4104,6 +4108,12 @@ oni-types@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/oni-types/-/oni-types-0.0.4.tgz#97bc435565d5f4c3bdc50bd1700fd24dd5b6704b" +oniguruma@^6.0.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/oniguruma/-/oniguruma-6.2.1.tgz#a50ee69642844ad1d252685aab187171b06ece04" + dependencies: + nan "^2.0.9" + opencollective@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" @@ -5015,6 +5025,10 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" +redux-observable@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-0.17.0.tgz#23e29e3f3c39204b7ed6a14b67a29e317c03106b" + redux-batched-subscribe@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/redux-batched-subscribe/-/redux-batched-subscribe-0.1.6.tgz#de928602708df7198b4d0c98c7119df993780d59" @@ -6223,6 +6237,13 @@ vscode-nls@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-2.0.2.tgz#808522380844b8ad153499af5c3b03921aea02da" +vscode-textmate@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-3.2.0.tgz#87e5ab1ed30463291a73fe28b37a58590a7777dc" + dependencies: + fast-plist "^0.1.2" + oniguruma "^6.0.1" + vscode-uri@1.0.1, vscode-uri@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.1.tgz#11a86befeac3c4aa3ec08623651a3c81a6d0bbc8" From fbea2e38ad804e797172e0a27df2e1816290c67f Mon Sep 17 00:00:00 2001 From: Ryan C Date: Mon, 27 Nov 2017 16:53:06 +0000 Subject: [PATCH 34/63] Tidy up the remaining parts that were pointing at the old repo. (#1021) --- README.md | 2 +- browser/src/UI/components/StatusBar.tsx | 2 +- configuration/config.default.js | 2 +- test/ci/NoInstalledNeovim.config.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5afd7e390e..c28c4cf1ab 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### IDE powered by Neovim + React + Electron [![Build Status](https://travis-ci.org/onivim/oni.svg?branch=master)](https://travis-ci.org/onivim/oni) [![Build Status](https://ci.appveyor.com/api/projects/status/gum9hty9hm65o7ae/branch/master?svg=true)](https://ci.appveyor.com/project/onivim/oni/branch/master) -[![Join the chat at https://gitter.im/extr0py/Lobby](https://badges.gitter.im/onivim/Lobby.svg)](https://gitter.im/onivim/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Backers on Open Collective](https://opencollective.com/oni/backers/badge.svg)](https://opencollective.com/oni#backer) [![Sponsors on Open Collective](https://opencollective.com/oni/sponsors/badge.svg)](https://opencollective.com/oni#sponsor) [![BountySource Active Bounties](https://api.bountysource.com/badge/tracker?tracker_id=48462304)](https://www.bountysource.com/teams/oni) +[![Join the chat at https://gitter.im/onivim/Lobby](https://badges.gitter.im/onivim/Lobby.svg)](https://gitter.im/onivim/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Backers on Open Collective](https://opencollective.com/oni/backers/badge.svg)](https://opencollective.com/oni#backer) [![Sponsors on Open Collective](https://opencollective.com/oni/sponsors/badge.svg)](https://opencollective.com/oni#sponsor) [![BountySource Active Bounties](https://api.bountysource.com/badge/tracker?tracker_id=48462304)](https://www.bountysource.com/teams/oni) [![Total Downloads](https://img.shields.io/github/downloads/onivim/oni/total.svg)](https://github.com/onivim/oni/releases)

    Supporting Oni

    diff --git a/browser/src/UI/components/StatusBar.tsx b/browser/src/UI/components/StatusBar.tsx index 998c4a615b..8fd997c084 100644 --- a/browser/src/UI/components/StatusBar.tsx +++ b/browser/src/UI/components/StatusBar.tsx @@ -64,7 +64,7 @@ export class StatusBar extends React.PureComponent { private _openGithub(): void { // TODO: Open this in an internal window once that capability is available - electron.shell.openExternal("https://www.github.com/extr0py/oni") + electron.shell.openExternal("https://www.github.com/onivim/oni") } } diff --git a/configuration/config.default.js b/configuration/config.default.js index 56edea4873..b7a8feef21 100644 --- a/configuration/config.default.js +++ b/configuration/config.default.js @@ -1,6 +1,6 @@ // For more information on customizing Oni, // check out our wiki page: -// https://github.com/extr0py/oni/wiki/Configuration +// https://github.com/onivim/oni/wiki/Configuration const activate = (oni) => { console.log("config activated") diff --git a/test/ci/NoInstalledNeovim.config.js b/test/ci/NoInstalledNeovim.config.js index 5437d91d8e..7d8111071e 100644 --- a/test/ci/NoInstalledNeovim.config.js +++ b/test/ci/NoInstalledNeovim.config.js @@ -1,6 +1,6 @@ // For more information on customizing Oni, // check out our wiki page: -// https://github.com/extr0py/oni/wiki/Configuration +// https://github.com/onivim/oni/wiki/Configuration module.exports = { "debug.neovimPath": "/derp/not-a-valid-neovim-binary", From b29079ca2cc11e0f9d36d3b71dcb089baff6811d Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 27 Nov 2017 13:09:34 -0800 Subject: [PATCH 35/63] Fix #1015 - Add ability to capture logs and output for test result (#1023) * Add ability to capture logs and output for test result * Clean up lint issues, and re-enable old tests * Add additional logging in getting the element * Try re-ordering the tests * Add some additional logging --- browser/src/Services/Automation.ts | 64 +++++++++++++++++++++++++++--- test/CiTests.ts | 29 +++++++++++--- yarn.lock | 12 +++--- 3 files changed, 89 insertions(+), 16 deletions(-) diff --git a/browser/src/Services/Automation.ts b/browser/src/Services/Automation.ts index 905504500b..fd29115354 100644 --- a/browser/src/Services/Automation.ts +++ b/browser/src/Services/Automation.ts @@ -11,6 +11,8 @@ import * as Utility from "./../Utility" import { editorManager } from "./EditorManager" import { inputManager } from "./InputManager" +import * as Log from "./../Log" + export interface ITestResult { passed: boolean exception?: any @@ -48,33 +50,43 @@ export class Automation implements OniApi.Automation.Api { } public async runTest(testPath: string): Promise { - const containerElement = this._getOrCreateTestContainer() + const containerElement = this._getOrCreateTestContainer("automated-test-container") containerElement.innerHTML = "" const testPath2 = testPath + const loggingRedirector = new LoggingRedirector() + Log.enableDebugLogging() try { const testCase: any = Utility.nodeRequire(testPath2) await testCase.test(new Oni()) this._reportResult(true) } catch (ex) { this._reportResult(false, ex) + } finally { + const logs = loggingRedirector.getAllLogs() + + const logsElement = this._createElement("automated-test-logs", this._getOrCreateTestContainer("automated-test-container")) + + logsElement.textContent = JSON.stringify(logs) + + loggingRedirector.dispose() } } - private _getOrCreateTestContainer(): HTMLDivElement { - const containerElement = document.body.getElementsByClassName("automated-test-container") + private _getOrCreateTestContainer(className: string): HTMLDivElement { + const containerElement = document.body.getElementsByClassName(className) if (containerElement && containerElement.length > 0) { return containerElement[0] as HTMLDivElement } - const container = this._createElement("automated-test-container", document.body) + const container = this._createElement(className, document.body) return container } private _reportResult(passed: boolean, exception?: any): void { - const resultElement = this._createElement("automated-test-result", this._getOrCreateTestContainer()) + const resultElement = this._createElement("automated-test-result", this._getOrCreateTestContainer("automated-test-container")) resultElement.textContent = JSON.stringify({ passed, @@ -91,3 +103,45 @@ export class Automation implements OniApi.Automation.Api { } export const automation = new Automation() + +class LoggingRedirector { + + private _logs: string[] = [] + + private _oldInfo: any + private _oldWarn: any + private _oldError: any + + constructor() { + this._oldInfo = console.log + this._oldWarn = console.warn + this._oldError = console.error + + console.log = this._redirect("INFO", this._oldInfo) + console.warn = this._redirect("WARN", this._oldWarn) + console.error = this._redirect("ERROR", this._oldError) + } + + public getAllLogs(): string[] { + return this._logs + } + + public dispose(): void { + this._logs = null + + console.log = this._oldInfo + console.warn = this._oldWarn + console.error = this._oldError + + this._oldInfo = null + this._oldWarn = null + this._oldError = null + } + + private _redirect(type: string, oldFunction: any): any { + return (...args: any[]) => { + this._logs.push("[" + type + "][" + new Date().getTime() + "]: " + JSON.stringify(args)) + oldFunction(args) + } + } +} diff --git a/test/CiTests.ts b/test/CiTests.ts index 377e8e407d..f7791f39c3 100644 --- a/test/CiTests.ts +++ b/test/CiTests.ts @@ -10,8 +10,8 @@ import { Oni } from "./common" const LongTimeout = 5000 const CiTests = [ - "AutoCompletionTest", "BasicEditingTest", + "AutoCompletionTest", "QuickOpenTest", "NoInstalledNeovim", ] @@ -45,8 +45,6 @@ const loadTest = (testName: string): ITestCase => { } describe("ci tests", function() { // tslint:disable-line only-arrow-functions - // Retry up to two times - this.retries(2) const configFolder = Platform.isWindows() ? path.join(Platform.getUserHome(), "oni") : path.join(Platform.getUserHome(), ".oni") @@ -89,12 +87,16 @@ describe("ci tests", function() { // tslint:disable-line only-arrow-functions describe(test, () => { + // Retry up to two times + this.retries(2) + const testCase = loadTest(test) let oni: Oni beforeEach(async () => { + console.log("[BEFORE EACH]: " + test) if (testCase.configPath) { console.log("Writing config from: " + testCase.configPath) const configContents = fs.readFileSync(testCase.configPath) @@ -107,6 +109,7 @@ describe("ci tests", function() { // tslint:disable-line only-arrow-functions }) afterEach(async () => { + console.log("[AFTER EACH]: " + test) await oni.close() if (fs.existsSync(configPath)) { @@ -116,9 +119,12 @@ describe("ci tests", function() { // tslint:disable-line only-arrow-functions }) it("ci test: " + test, async () => { + console.log("[TEST]: " + test) + console.log("Waiting for editor element...") await oni.client.waitForExist(".editor", LongTimeout) + console.log("Found editor element. Getting editor element text: ") const text = await oni.client.getText(".editor") - assert(text && text.length > 0, "Validate editor element is present") + console.log("Editor element text: " + text) console.log("Test path: " + testCase.testPath) // tslint:disable-line @@ -127,7 +133,20 @@ describe("ci tests", function() { // tslint:disable-line only-arrow-functions console.log("Waiting for result...") // tslint:disable-line await oni.client.waitForExist(".automated-test-result", 30000) const resultText = await oni.client.getText(".automated-test-result") - console.log("Got result: " + resultText) // tslint:disable-line + console.log("---RESULT") + console.log(resultText) // tslint:disable-line + console.log("---") + console.log("") + + console.log("Retrieving logs...") + + await oni.client.waitForExist(".automated-test-logs") + const clientLogs = await oni.client.getText(".automated-test-logs") + console.log("---LOGS (During run): ") + + const logs = JSON.parse(clientLogs).forEach((log) => console.log(log)) + + console.log("---") const result = JSON.parse(resultText) assert.ok(result.passed) diff --git a/yarn.lock b/yarn.lock index 81513761fd..79763d1bc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1920,7 +1920,7 @@ electron-builder-lib@19.46.4: semver "^5.4.1" temp-file "^2.1.1" -electron-builder@^19.46.4: +electron-builder@19.46.4: version "19.46.4" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.46.4.tgz#d69ac60b78778258ab5cba0a9fb94963563e903b" dependencies: @@ -3834,7 +3834,7 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.0.0, nan@^2.3.0, nan@^2.7.0: +nan@^2.0.0, nan@^2.0.9, nan@^2.3.0, nan@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -5025,14 +5025,14 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" -redux-observable@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-0.17.0.tgz#23e29e3f3c39204b7ed6a14b67a29e317c03106b" - redux-batched-subscribe@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/redux-batched-subscribe/-/redux-batched-subscribe-0.1.6.tgz#de928602708df7198b4d0c98c7119df993780d59" +redux-observable@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-0.17.0.tgz#23e29e3f3c39204b7ed6a14b67a29e317c03106b" + redux-thunk@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" From d2e270091702184ae733227bf2c04c8eb2ba9058 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 27 Nov 2017 13:09:59 -0800 Subject: [PATCH 36/63] Remove languages folder (#1024) Accidentally introduced 'languages' folder for the TextMate changes, but all the grammars / syntaxes are actually in 'extensions'. --- .../syntaxes/JavaScript.tmLanguage.json | 4272 ----------------- 1 file changed, 4272 deletions(-) delete mode 100644 languages/javascript/syntaxes/JavaScript.tmLanguage.json diff --git a/languages/javascript/syntaxes/JavaScript.tmLanguage.json b/languages/javascript/syntaxes/JavaScript.tmLanguage.json deleted file mode 100644 index 7b1ec3d76c..0000000000 --- a/languages/javascript/syntaxes/JavaScript.tmLanguage.json +++ /dev/null @@ -1,4272 +0,0 @@ -{ - "information_for_contributors": [ - "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", - "If you want to provide a fix or improvement, please create a pull request against the original repository.", - "Once accepted there, we are happy to receive an update request." - ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/824f47ea6e98590ac2e75db5bebdf6eff71421ad", - "name": "JavaScript (with React support)", - "scopeName": "source.js", - "fileTypes": [ - ".js", - ".jsx", - ".es6", - ".mjs" - ], - "uuid": "805375ec-d614-41f5-8993-5843fe63ea82", - "patterns": [ - { - "include": "#directives" - }, - { - "include": "#statements" - }, - { - "name": "comment.line.shebang.ts", - "match": "\\A(#!).*(?=$)", - "captures": { - "1": { - "name": "punctuation.definition.comment.ts" - } - } - } - ], - "repository": { - "statements": { - "patterns": [ - { - "include": "#string" - }, - { - "include": "#template" - }, - { - "include": "#comment" - }, - { - "include": "#declaration" - }, - { - "include": "#control-statement" - }, - { - "include": "#after-operator-block-as-object-literal" - }, - { - "include": "#decl-block" - }, - { - "include": "#expression" - }, - { - "include": "#punctuation-semicolon" - } - ] - }, - "declaration": { - "patterns": [ - { - "include": "#decorator" - }, - { - "include": "#var-expr" - }, - { - "include": "#function-declaration" - }, - { - "include": "#class-declaration" - }, - { - "include": "#interface-declaration" - }, - { - "include": "#enum-declaration" - }, - { - "include": "#namespace-declaration" - }, - { - "include": "#type-alias-declaration" - }, - { - "include": "#import-equals-declaration" - }, - { - "include": "#import-declaration" - }, - { - "include": "#export-declaration" - } - ] - }, - "control-statement": { - "patterns": [ - { - "include": "#switch-statement" - }, - { - "include": "#for-loop" - }, - { - "name": "keyword.control.trycatch.js", - "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.js entity.name.function.js" - } - }, - "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", - "patterns": [ - { - "include": "#var-single-variable-type-annotation" - } - ] - }, - { - "name": "meta.var-single-variable.expr.js", - "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.js variable.other.constant.js" - } - }, - "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", - "patterns": [ - { - "include": "#var-single-variable-type-annotation" - } - ] - }, - { - "name": "meta.var-single-variable.expr.js", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.js variable.other.readwrite.js" - } - }, - "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", - "patterns": [ - { - "include": "#var-single-variable-type-annotation" - } - ] - } - ] - }, - "var-single-variable-type-annotation": { - "patterns": [ - { - "include": "#type-annotation" - }, - { - "include": "#string" - }, - { - "include": "#comment" - } - ] - }, - "destructuring-variable": { - "patterns": [ - { - "name": "meta.object-binding-pattern-variable.js", - "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", - "captures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "keyword.operator.rest.js" - }, - "3": { - "name": "entity.name.function.js variable.language.this.js" - }, - "4": { - "name": "entity.name.function.js" - }, - "5": { - "name": "keyword.operator.optional.js" - } - } - }, - { - "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" - }, - { - "name": "meta.definition.property.js variable.object.property.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - }, - { - "name": "keyword.operator.optional.js", - "match": "\\?" - } - ] - } - ] - }, - "variable-initializer": { - "patterns": [ - { - "begin": "(?)", - "captures": { - "1": { - "name": "storage.modifier.async.js" - }, - "2": { - "name": "variable.parameter.js" - } - } - }, - { - "name": "meta.arrow.js", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.js" - } - }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#type-parameters" - }, - { - "include": "#function-parameters" - }, - { - "include": "#arrow-return-type" - } - ] - }, - { - "name": "meta.arrow.js", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", - "patterns": [ - { - "include": "#decl-block" - }, - { - "include": "#expression" - } - ] - } - ] - }, - "indexer-declaration": { - "name": "meta.indexer.declaration.js", - "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "0": { - "name": "meta.object-literal.key.js" - }, - "1": { - "name": "entity.name.function.js" - } - } - }, - { - "name": "meta.object.member.js", - "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", - "captures": { - "0": { - "name": "meta.object-literal.key.js" - } - } - }, - { - "name": "meta.object.member.js", - "begin": "\\.\\.\\.", - "beginCaptures": { - "0": { - "name": "keyword.operator.spread.js" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", - "captures": { - "1": { - "name": "variable.other.readwrite.js" - } - } - }, - { - "name": "meta.object.member.js", - "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", - "end": "(?=,|\\}|$)", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.js", - "begin": ":", - "beginCaptures": { - "0": { - "name": "meta.object-literal.key.js punctuation.separator.key-value.js" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "include": "#punctuation-comma" - } - ] - }, - "ternary-expression": { - "begin": "(\\?)", - "beginCaptures": { - "0": { - "name": "keyword.operator.ternary.js" - } - }, - "end": "(:)", - "endCaptures": { - "0": { - "name": "keyword.operator.ternary.js" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "patterns": [ - { - "name": "meta.function-call.js", - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "patterns": [ - { - "include": "#literal" - }, - { - "include": "#support-objects" - }, - { - "include": "#object-identifiers" - }, - { - "include": "#punctuation-accessor" - }, - { - "name": "keyword.operator.expression.import.js", - "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" - }, - { - "name": "entity.name.function.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)" - } - ] - }, - { - "include": "#comment" - }, - { - "name": "meta.type.parameters.js", - "begin": "\\<", - "beginCaptures": { - "0": { - "name": "punctuation.definition.typeparameters.begin.js" - } - }, - "end": "\\>", - "endCaptures": { - "0": { - "name": "punctuation.definition.typeparameters.end.js" - } - }, - "patterns": [ - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - { - "include": "#paren-expression" - } - ] - }, - "new-expr": { - "name": "new.expr.js", - "begin": "(?>=|>>>=|\\|=" - }, - { - "name": "keyword.operator.bitwise.shift.js", - "match": "<<|>>>|>>" - }, - { - "name": "keyword.operator.comparison.js", - "match": "===|!==|==|!=" - }, - { - "name": "keyword.operator.relational.js", - "match": "<=|>=|<>|<|>" - }, - { - "name": "keyword.operator.logical.js", - "match": "\\!|&&|\\|\\|" - }, - { - "name": "keyword.operator.bitwise.js", - "match": "\\&|~|\\^|\\|" - }, - { - "name": "keyword.operator.assignment.js", - "match": "\\=" - }, - { - "name": "keyword.operator.decrement.js", - "match": "--" - }, - { - "name": "keyword.operator.increment.js", - "match": "\\+\\+" - }, - { - "name": "keyword.operator.arithmetic.js", - "match": "%|\\*|/|-|\\+" - }, - { - "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", - "captures": { - "1": { - "name": "keyword.operator.arithmetic.js" - } - } - } - ] - }, - "typeof-operator": { - "name": "keyword.operator.expression.typeof.js", - "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "support.constant.dom.js" - }, - "3": { - "name": "support.variable.property.dom.js" - } - } - }, - { - "name": "support.class.node.js", - "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(\\[]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(\\[]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "entity.name.function.js" - } - } - }, - { - "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "variable.other.constant.property.js" - } - } - }, - { - "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "variable.other.property.js" - } - } - }, - { - "name": "variable.other.constant.js", - "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" - }, - { - "name": "variable.other.readwrite.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "object-identifiers": { - "patterns": [ - { - "name": "support.class.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" - }, - { - "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "variable.other.constant.object.property.js" - }, - "3": { - "name": "variable.other.object.property.js" - } - } - }, - { - "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "variable.other.constant.object.js" - }, - "2": { - "name": "variable.other.object.js" - } - } - } - ] - }, - "type-annotation": { - "patterns": [ - { - "name": "meta.type.annotation.js", - "begin": "(:)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "meta.type.annotation.js", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "return-type": { - "patterns": [ - { - "name": "meta.return.type.js", - "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "patterns": [ - { - "begin": "(?<=[:])(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-parameters": { - "name": "meta.type.parameters.js", - "begin": "(<)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.begin.js" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.end.js" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "name": "storage.modifier.js", - "match": "(?)" - }, - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "type": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#string" - }, - { - "include": "#numeric-literal" - }, - { - "include": "#type-primitive" - }, - { - "include": "#type-builtin-literals" - }, - { - "include": "#type-parameters" - }, - { - "include": "#type-tuple" - }, - { - "include": "#type-object" - }, - { - "include": "#type-operators" - }, - { - "include": "#type-fn-type-parameters" - }, - { - "include": "#type-paren-or-function-parameters" - }, - { - "include": "#type-function-return-type" - }, - { - "include": "#type-name" - } - ] - }, - "type-primitive": { - "name": "support.type.primitive.js", - "match": "(?)\n ))\n )\n )\n)", - "end": "(?<=\\))", - "patterns": [ - { - "include": "#function-parameters" - } - ] - } - ] - }, - "type-function-return-type": { - "patterns": [ - { - "name": "meta.type.function.return.js", - "begin": "(=>)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?)(?]|//|$)", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - }, - { - "name": "meta.type.function.return.js", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - } - ] - }, - "type-function-return-type-core": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?<==>)(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-operators": { - "patterns": [ - { - "include": "#typeof-operator" - }, - { - "begin": "([&|])(?=\\s*\\{)", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.js" - } - }, - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "begin": "[&|]", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.js" - } - }, - "end": "(?=\\S)" - }, - { - "name": "keyword.operator.expression.keyof.js", - "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.js" - } - }, - "end": "(/)([gimuy]*)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.js" - }, - "2": { - "name": "keyword.other.js" - } - }, - "patterns": [ - { - "include": "#regexp" - } - ] - }, - { - "name": "string.regexp.js", - "begin": "(?\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.js" - } - }, - "end": "(?=^)", - "patterns": [ - { - "name": "meta.tag.js", - "begin": "(<)(reference|amd-dependency|amd-module)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.directive.js" - }, - "2": { - "name": "entity.name.tag.directive.js" - } - }, - "end": "/>", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.directive.js" - } - }, - "patterns": [ - { - "name": "entity.other.attribute-name.directive.js", - "match": "path|types|no-default-lib|name" - }, - { - "name": "keyword.operator.assignment.js", - "match": "=" - }, - { - "include": "#string" - } - ] - } - ] - }, - "docblock": { - "patterns": [ - { - "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "constant.language.access-type.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - }, - "4": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "5": { - "name": "constant.other.email.link.underline.jsdoc" - }, - "6": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - }, - "4": { - "name": "keyword.operator.control.jsdoc" - }, - "5": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "name": "meta.example.jsdoc", - "begin": "((@)example)\\s+", - "end": "(?=@|\\*/)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "patterns": [ - { - "match": "^\\s\\*\\s+" - }, - { - "contentName": "constant.other.description.jsdoc", - "begin": "\\G(<)caption(>)", - "beginCaptures": { - "0": { - "name": "entity.name.tag.inline.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - }, - "end": "()|(?=\\*/)", - "endCaptures": { - "0": { - "name": "entity.name.tag.inline.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - } - }, - { - "match": "[^\\s@*](?:[^*]|\\*[^/])*", - "captures": { - "0": { - "name": "source.embedded.js" - } - } - } - ] - }, - { - "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "constant.language.symbol-type.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.link.underline.jsdoc" - }, - "4": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "begin": "((@)typedef)\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - }, - { - "name": "entity.name.type.instance.jsdoc", - "match": "(?:[^@\\s*/]|\\*[^/])+" - } - ] - }, - { - "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - }, - { - "name": "variable.other.jsdoc", - "match": "([A-Za-z_$][\\w$.\\[\\]]*)" - }, - { - "name": "variable.other.jsdoc", - "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", - "captures": { - "1": { - "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" - }, - "2": { - "name": "keyword.operator.assignment.jsdoc" - }, - "3": { - "name": "source.embedded.js" - }, - "4": { - "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" - }, - "5": { - "name": "invalid.illegal.syntax.jsdoc" - } - } - } - ] - }, - { - "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - } - ] - }, - { - "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "contentName": "variable.other.jsdoc", - "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - }, - "4": { - "name": "punctuation.definition.string.begin.jsdoc" - } - }, - "end": "(\\3)|(?=$|\\*/)", - "endCaptures": { - "0": { - "name": "variable.other.jsdoc" - }, - "1": { - "name": "punctuation.definition.string.end.jsdoc" - } - } - }, - { - "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "name": "storage.type.class.jsdoc", - "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", - "captures": { - "1": { - "name": "punctuation.definition.block.tag.jsdoc" - } - } - }, - { - "include": "#inline-tags" - } - ] - }, - "brackets": { - "patterns": [ - { - "begin": "{", - "end": "}|(?=\\*/)", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\[", - "end": "\\]|(?=\\*/)", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "inline-tags": { - "patterns": [ - { - "name": "constant.other.description.jsdoc", - "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", - "captures": { - "1": { - "name": "punctuation.definition.bracket.square.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.square.end.jsdoc" - } - } - }, - { - "name": "entity.name.type.instance.jsdoc", - "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", - "beginCaptures": { - "1": { - "name": "punctuation.definition.bracket.curly.begin.jsdoc" - }, - "2": { - "name": "storage.type.class.jsdoc" - }, - "3": { - "name": "punctuation.definition.inline.tag.jsdoc" - } - }, - "end": "}|(?=\\*/)", - "endCaptures": { - "0": { - "name": "punctuation.definition.bracket.curly.end.jsdoc" - } - }, - "patterns": [ - { - "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", - "captures": { - "1": { - "name": "variable.other.link.underline.jsdoc" - }, - "2": { - "name": "punctuation.separator.pipe.jsdoc" - } - } - }, - { - "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", - "captures": { - "1": { - "name": "variable.other.description.jsdoc" - }, - "2": { - "name": "punctuation.separator.pipe.jsdoc" - } - } - } - ] - } - ] - }, - "jsdoctype": { - "patterns": [ - { - "name": "invalid.illegal.type.jsdoc", - "match": "\\G{(?:[^}*]|\\*[^/}])+$" - }, - { - "contentName": "entity.name.type.instance.jsdoc", - "begin": "\\G({)", - "beginCaptures": { - "0": { - "name": "entity.name.type.instance.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.curly.begin.jsdoc" - } - }, - "end": "((}))\\s*|(?=\\*/)", - "endCaptures": { - "1": { - "name": "entity.name.type.instance.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.curly.end.jsdoc" - } - }, - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "jsx": { - "patterns": [ - { - "include": "#jsx-tag-without-attributes-in-expression" - }, - { - "include": "#jsx-tag-in-expression" - }, - { - "include": "#jsx-tag-invalid" - } - ] - }, - "jsx-tag-without-attributes-in-expression": { - "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", - "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", - "patterns": [ - { - "include": "#jsx-tag-without-attributes" - } - ] - }, - "jsx-tag-without-attributes": { - "name": "meta.tag.without-attributes.js", - "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", - "end": "()", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.js" - }, - "2": { - "name": "entity.name.tag.js" - }, - "3": { - "name": "support.class.component.js" - }, - "4": { - "name": "punctuation.definition.tag.end.js" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.js" - }, - "2": { - "name": "entity.name.tag.js" - }, - "3": { - "name": "support.class.component.js" - }, - "4": { - "name": "punctuation.definition.tag.end.js" - } - }, - "contentName": "meta.jsx.children.js", - "patterns": [ - { - "include": "#jsx-children" - } - ] - }, - "jsx-tag-in-expression": { - "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(/>)|(?:())", - "endCaptures": { - "0": { - "name": "meta.tag.js" - }, - "1": { - "name": "punctuation.definition.tag.end.js" - }, - "2": { - "name": "punctuation.definition.tag.begin.js" - }, - "3": { - "name": "entity.name.tag.js" - }, - "4": { - "name": "support.class.component.js" - }, - "5": { - "name": "punctuation.definition.tag.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-tag" - } - ] - }, - "jsx-child-tag": { - "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(/>)|(?:())", - "endCaptures": { - "0": { - "name": "meta.tag.js" - }, - "1": { - "name": "punctuation.definition.tag.end.js" - }, - "2": { - "name": "punctuation.definition.tag.begin.js" - }, - "3": { - "name": "entity.name.tag.js" - }, - "4": { - "name": "support.class.component.js" - }, - "5": { - "name": "punctuation.definition.tag.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-tag" - } - ] - }, - "jsx-tag": { - "name": "meta.tag.js", - "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(?=(/>)|(?:()))", - "patterns": [ - { - "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.js" - }, - "2": { - "name": "entity.name.tag.js" - }, - "3": { - "name": "support.class.component.js" - } - }, - "end": "(?=[/]?>)", - "contentName": "meta.tag.attributes.js", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#jsx-tag-attributes" - }, - { - "include": "#jsx-tag-attributes-illegal" - } - ] - }, - { - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.js" - } - }, - "end": "(?=" - }, - "jsx-children": { - "patterns": [ - { - "include": "#jsx-tag-without-attributes" - }, - { - "include": "#jsx-child-tag" - }, - { - "include": "#jsx-tag-invalid" - }, - { - "include": "#jsx-evaluated-code" - }, - { - "include": "#jsx-entities" - } - ] - }, - "jsx-evaluated-code": { - "name": "meta.embedded.expression.js", - "begin": "\\{", - "end": "\\}", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.js" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "jsx-entities": { - "patterns": [ - { - "name": "constant.character.entity.js", - "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", - "captures": { - "1": { - "name": "punctuation.definition.entity.js" - }, - "3": { - "name": "punctuation.definition.entity.js" - } - } - }, - { - "name": "invalid.illegal.bad-ampersand.js", - "match": "&" - } - ] - }, - "jsx-tag-attributes": { - "patterns": [ - { - "include": "#jsx-tag-attribute-name" - }, - { - "include": "#jsx-tag-attribute-assignment" - }, - { - "include": "#jsx-string-double-quoted" - }, - { - "include": "#jsx-string-single-quoted" - }, - { - "include": "#jsx-evaluated-code" - } - ] - }, - "jsx-tag-attribute-name": { - "match": "(?x)\n \\s*\n ([_$a-zA-Z][-$\\w]*)\n (?=\\s|=|/?>|/\\*|//)", - "captures": { - "1": { - "name": "entity.other.attribute-name.js" - } - } - }, - "jsx-tag-attribute-assignment": { - "name": "keyword.operator.assignment.js", - "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" - }, - "jsx-string-double-quoted": { - "name": "string.quoted.double.js", - "begin": "\"", - "end": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-string-single-quoted": { - "name": "string.quoted.single.js", - "begin": "'", - "end": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-tag-attributes-illegal": { - "name": "invalid.illegal.attribute.js", - "match": "\\S+" - } - } -} \ No newline at end of file From e2dc9bcbfc11b2d73061deaada865fda26bed9ef Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 27 Nov 2017 17:27:55 -0800 Subject: [PATCH 37/63] Fix #956 - Fix autocompletion oddities (#972) * Refactor Completion logic to use redux-observable + epics * Split out completion functionality into store/reducers/epics/selectors * Continue refactoring, hook up commit completion * Get first round of selection working * Fix selecting item * Remove now-unused code * First round of lint fixes * Restore vim folder * Clean up code after merge, get building and running * Move Completion up a level, since it is not only applicable to language services * Move CompletionUtilityTest to mirror src * Complete move of Completion upward from Language folder * Fix some logging issues * Fix lint issues * Add failing unit tests for getCompletionMeet * Add unit test that exercises broken case in #956 * Get unit test green * Start factoring 'createStore' to common location * Refactor to use common createStore * Add RAFNotifyBatcher * Move RAFNotifyBatcher * Rename RAFNotifyBatcher * Refactor completion logic out to handle the transitional cases * Refactor logic to handle the cases in #956 * Some lint cleanups * Fix lint issue * Fix lint issue and refactoring issue * Fix rendering issue with context menu * Add CSS / TypeScript tests * Fix lint issue --- .gitignore | 2 + browser/src/Editor/NeovimEditor.tsx | 10 +- browser/src/Redux/LoggingMiddleware.ts | 26 ++ browser/src/Redux/ReduxLogger.ts | 24 ++ .../RequestAnimationFrameNotifyBatcher.ts | 25 ++ browser/src/Redux/createStore.ts | 31 ++ browser/src/Redux/index.ts | 1 + browser/src/Services/Completion/Completion.ts | 122 +++++++ .../src/Services/Completion/CompletionMenu.ts | 57 +++ .../Services/Completion/CompletionProvider.ts | 123 +++++++ .../Completion/CompletionSelectors.ts | 82 +++++ .../Services/Completion/CompletionState.ts | 85 +++++ .../Services/Completion/CompletionStore.ts | 338 ++++++++++++++++++ .../Completion/CompletionUtility.ts | 280 ++++++++------- .../{Language => }/Completion/index.ts | 0 .../src/Services/ContextMenu/ContextMenu.less | 3 +- .../src/Services/ContextMenu/ContextMenu.tsx | 13 +- .../Language/Completion/Completion.ts | 252 ------------- .../Language/Completion/CompletionMenu.ts | 133 ------- .../Language/LanguageEditorIntegration.ts | 3 - browser/src/Services/Language/index.ts | 1 - .../Completion/CompletionUtilityTests.ts | 55 +++ .../Completion/CompletionUtilityTests.ts | 17 - package.json | 2 +- test/CiTests.ts | 3 +- test/ci/AutoCompletionTest-CSS.ts | 29 ++ test/ci/AutoCompletionTest-TypeScript.ts | 29 ++ test/ci/AutoCompletionTest.ts | 11 +- test/ci/Common.ts | 14 + tslint.json | 1 + 30 files changed, 1210 insertions(+), 562 deletions(-) create mode 100644 browser/src/Redux/LoggingMiddleware.ts create mode 100644 browser/src/Redux/ReduxLogger.ts create mode 100644 browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts create mode 100644 browser/src/Redux/createStore.ts create mode 100644 browser/src/Redux/index.ts create mode 100644 browser/src/Services/Completion/Completion.ts create mode 100644 browser/src/Services/Completion/CompletionMenu.ts create mode 100644 browser/src/Services/Completion/CompletionProvider.ts create mode 100644 browser/src/Services/Completion/CompletionSelectors.ts create mode 100644 browser/src/Services/Completion/CompletionState.ts create mode 100644 browser/src/Services/Completion/CompletionStore.ts rename browser/src/Services/{Language => }/Completion/CompletionUtility.ts (93%) rename browser/src/Services/{Language => }/Completion/index.ts (100%) delete mode 100644 browser/src/Services/Language/Completion/Completion.ts delete mode 100644 browser/src/Services/Language/Completion/CompletionMenu.ts create mode 100644 browser/test/Services/Completion/CompletionUtilityTests.ts delete mode 100644 browser/test/Services/Language/Completion/CompletionUtilityTests.ts create mode 100644 test/ci/AutoCompletionTest-CSS.ts create mode 100644 test/ci/AutoCompletionTest-TypeScript.ts create mode 100644 test/ci/Common.ts diff --git a/.gitignore b/.gitignore index 2e6098b709..26f781575b 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,5 @@ $RECYCLE.BIN/ # OCaml / Reason .merlin + +yarn.lock diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 6ff9a670e5..340a2fe82e 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -25,6 +25,7 @@ import { pluginManager } from "./../Plugins/PluginManager" import { commandManager } from "./../Services/CommandManager" import { registerBuiltInCommands } from "./../Services/Commands" +import { Completion } from "./../Services/Completion" import { configuration, IConfigurationValues } from "./../Services/Configuration" import { Errors } from "./../Services/Errors" import { addInsertModeLanguageFunctionality, addNormalModeLanguageFunctionality } from "./../Services/Language" @@ -78,6 +79,7 @@ export class NeovimEditor implements IEditor { private _typingPredictionManager: TypingPredictionManager = new TypingPredictionManager() private _syntaxHighlighter: ISyntaxHighlighter + private _completion: Completion public get mode(): string { return this._currentMode @@ -234,6 +236,8 @@ export class NeovimEditor implements IEditor { const textMateHighlightingEnabled = this._config.getValue("experimental.editor.textMateHighlighting.enabled") this._syntaxHighlighter = textMateHighlightingEnabled ? new SyntaxHighlighter() : new NullSyntaxHighlighter() + this._completion = new Completion(this) + this._render() const browserWindow = remote.getCurrentWindow() @@ -293,6 +297,11 @@ export class NeovimEditor implements IEditor { this._syntaxHighlighter = null } + if (this._completion) { + this._completion.dispose() + this._completion = null + } + // TODO: Implement full disposal logic this._popupMenu.dispose() this._popupMenu = null @@ -375,7 +384,6 @@ export class NeovimEditor implements IEditor { } else { this._syntaxHighlighter.notifyEndInsertMode(this.activeBuffer) } - } private _onVimEvent(eventName: string, evt: EventContext): void { diff --git a/browser/src/Redux/LoggingMiddleware.ts b/browser/src/Redux/LoggingMiddleware.ts new file mode 100644 index 0000000000..85102702af --- /dev/null +++ b/browser/src/Redux/LoggingMiddleware.ts @@ -0,0 +1,26 @@ +/* + * LoggingMiddleware + * + * Logging strategy for Redux, specific to Oni + */ + +import { Store } from "redux" + +import * as Log from "./../Log" + +export const createLoggingMiddleware = (storeName: string) => (store: Store) => (next: any) => (action: any): any => { + Log.verbose("[REDUX - " + storeName + "] Applying action - " + action.type + ":") + + if (Log.isDebugLoggingEnabled()) { + console.dir(action) // tslint:disable-line + } + + const result = next(action) + + if (Log.isDebugLoggingEnabled()) { + Log.debug("[REDUX - " + storeName + "] New State: ") + console.dir(store.getState()) // tslint:disable-line + } + + return result +} diff --git a/browser/src/Redux/ReduxLogger.ts b/browser/src/Redux/ReduxLogger.ts new file mode 100644 index 0000000000..4771814e4d --- /dev/null +++ b/browser/src/Redux/ReduxLogger.ts @@ -0,0 +1,24 @@ +/* + * createStore + * + * Common utilities for creating a redux store with Oni + * + * Implementations some common functionality, like: + * - Logging + * - Throttled subscriptions + */ + +import { applyMiddleware, compose, createStore as reduxCreateStore, Middleware, Reducer, Store } from "redux" +import { batchedSubscribe } from "redux-batched-subscribe" + +import { RequestAnimationFrameNotifyBatcher } from "./RequestAnimationFrameNotifyBatcher" + +export const createStore = (name: string, reducer: Reducer, defaultState: TState, optionalMiddleware: Middleware[] = []): Store => { + + const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"] || compose // tslint:disable-line no-string-literal + const enhancer = composeEnhancers( + applyMiddleware(...optionalMiddleware), + batchedSubscribe(RequestAnimationFrameNotifyBatcher), + ) + return reduxCreateStore(reducer, defaultState, enhancer) +} diff --git a/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts b/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts new file mode 100644 index 0000000000..7e761f03a9 --- /dev/null +++ b/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts @@ -0,0 +1,25 @@ +/* + * RAFNotifyBatcher + * + * Helper method to 'batch' dispatches to redux store + * subscriptions, based on animation frames. + * + * This helps 'debounce' the rendering logic - + * otherwise we'd be re-rendering the UI every time + * an action is dispatched. + */ + +import { NotifyFunction } from "redux-batched-subscribe" + +let rafId: number = null + +export const RequestAnimationFrameNotifyBatcher = (notify: NotifyFunction) => { + if (rafId) { + return + } + + rafId = window.requestAnimationFrame(() => { + rafId = null + notify() + }) +} diff --git a/browser/src/Redux/createStore.ts b/browser/src/Redux/createStore.ts new file mode 100644 index 0000000000..d2338df866 --- /dev/null +++ b/browser/src/Redux/createStore.ts @@ -0,0 +1,31 @@ +/* + * createStore + * + * Common utilities for creating a redux store with Oni + * + * Implementations some common functionality, like: + * - Logging + * - Throttled subscriptions + */ + +import { applyMiddleware, compose, createStore as reduxCreateStore, Middleware, Reducer, Store } from "redux" +import { batchedSubscribe } from "redux-batched-subscribe" + +import { createLoggingMiddleware } from "./LoggingMiddleware" + +import { RequestAnimationFrameNotifyBatcher } from "./RequestAnimationFrameNotifyBatcher" + +export const createStore = (name: string, reducer: Reducer, defaultState: TState, optionalMiddleware: Middleware[] = []): Store => { + + const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"] || compose // tslint:disable-line no-string-literal + + const loggingMiddleware: Middleware = createLoggingMiddleware(name) + + const middleware = [loggingMiddleware, ...optionalMiddleware] + + const enhancer = composeEnhancers( + applyMiddleware(...middleware), + batchedSubscribe(RequestAnimationFrameNotifyBatcher), + ) + return reduxCreateStore(reducer, defaultState, enhancer) +} diff --git a/browser/src/Redux/index.ts b/browser/src/Redux/index.ts new file mode 100644 index 0000000000..c86f9183c0 --- /dev/null +++ b/browser/src/Redux/index.ts @@ -0,0 +1 @@ +export * from "./createStore" diff --git a/browser/src/Services/Completion/Completion.ts b/browser/src/Services/Completion/Completion.ts new file mode 100644 index 0000000000..ae68c66852 --- /dev/null +++ b/browser/src/Services/Completion/Completion.ts @@ -0,0 +1,122 @@ +/** + * Completion.ts + */ + +import * as Oni from "oni-api" +import { IDisposable } from "oni-types" +import { Store } from "redux" +import { Subject } from "rxjs/Subject" + +import { createContextMenu } from "./CompletionMenu" + +import { ICompletionState } from "./CompletionState" + +import { CompletionAction, createStore } from "./CompletionStore" + +export class Completion implements IDisposable { + + private _lastCursorPosition: Oni.Cursor + private _store: Store + private _subscriptions: IDisposable[] + + private _throttledCursorUpdates: Subject = new Subject() + + constructor( + private _editor: Oni.Editor, + ) { + this._store = createStore() + this._throttledCursorUpdates + .auditTime(10) + .subscribe((update: CompletionAction) => { + this._store.dispatch(update) + }) + + const sub1 = this._editor.onBufferEnter.subscribe((buf: Oni.Buffer) => { + this._onBufferEnter(buf) + }) + + const sub2 = this._editor.onBufferChanged.subscribe((buf: Oni.EditorBufferChangedEventArgs) => { + this._onBufferUpdate(buf) + }) + + const sub3 = this._editor.onModeChanged.subscribe((newMode: string) => { + this._onModeChanged(newMode) + }) + + const sub4 = (this._editor as any).onCursorMoved.subscribe((cursor: Oni.Cursor) => { + this._onCursorMoved(cursor) + }) + + this._subscriptions = [sub1, sub2, sub3, sub4] + + createContextMenu(this._store) + } + + public dispose(): void { + if (this._subscriptions) { + this._subscriptions.forEach((disposable) => disposable.dispose()) + this._subscriptions = null + } + } + + private _onCursorMoved(cursor: Oni.Cursor): void { + this._lastCursorPosition = cursor + } + + private _onBufferEnter(buffer: Oni.Buffer): void { + this._store.dispatch({ + type: "BUFFER_ENTER", + language: buffer.language, + filePath: buffer.filePath, + }) + } + + private _onBufferUpdate(bufferUpdate: Oni.EditorBufferChangedEventArgs): void { + + // Ignore if this is a full update + const firstChange = bufferUpdate.contentChanges[0] + + if (!firstChange || !firstChange.range) { + return + } + + const range = firstChange.range + + // We only work with single line changes, for now. + // Perhaps we could get the latest line by querying the activeBuffer + // from cursorMoved, but right now, the update comes _after_ + // the cursorMoved event - so this is the most reliable way. + if (range.start.line + 1 !== range.end.line) { + return + } + + const newLine = firstChange.text + + if (range.start.line === this._lastCursorPosition.line) { + this._throttledCursorUpdates.next({ + type: "CURSOR_MOVED", + line: this._lastCursorPosition.line, + column: this._lastCursorPosition.column, + lineContents: newLine, + }) + } + } + + private async _onModeChanged(newMode: string): Promise { + if (newMode === "insert" && this._lastCursorPosition) { + + const [latestLine] = await this._editor.activeBuffer.getLines(this._lastCursorPosition.line, this._lastCursorPosition.line + 1) + this._throttledCursorUpdates.next({ + type: "CURSOR_MOVED", + line: this._lastCursorPosition.line, + column: this._lastCursorPosition.column, + lineContents: latestLine, + }) + } + + this._store.dispatch({ + type: "MODE_CHANGED", + mode: newMode, + }) + } +} diff --git a/browser/src/Services/Completion/CompletionMenu.ts b/browser/src/Services/Completion/CompletionMenu.ts new file mode 100644 index 0000000000..22c5b8e3a4 --- /dev/null +++ b/browser/src/Services/Completion/CompletionMenu.ts @@ -0,0 +1,57 @@ +/** + * Completion.ts + */ + +import { Store } from "redux" +import * as types from "vscode-languageserver-types" + +import { ContextMenu, contextMenuManager } from "./../ContextMenu" + +import { getFilteredCompletions } from "./CompletionSelectors" +import { ICompletionState } from "./CompletionState" +import * as CompletionUtility from "./CompletionUtility" + +export const createContextMenu = (store: Store) => { + + const contextMenu = contextMenuManager.create() + + store.subscribe(() => { + render(contextMenu, store.getState()) + }) + + contextMenu.onSelectedItemChanged.subscribe((completionItem: types.Command) => { + + store.dispatch({ + type: "SELECT_ITEM", + completionItem, + }) + }) + + contextMenu.onItemSelected.subscribe((completionItem: types.CompletionItem) => { + + const state = store.getState() + + store.dispatch({ + type: "COMMIT_COMPLETION", + meetLine: state.meetInfo.meetLine, + meetPosition: state.meetInfo.meetPosition, + completionText: CompletionUtility.getInsertText(completionItem), + }) + + }) +} + +export const render = (contextMenu: ContextMenu, state: ICompletionState): void => { + const filteredCompletions = getFilteredCompletions(state) + + if (filteredCompletions && filteredCompletions.length) { + if (contextMenu.isOpen()) { + contextMenu.setItems(filteredCompletions) + contextMenu.setFilter(state.meetInfo.meetBase) + } else { + contextMenu.show(filteredCompletions, state.meetInfo.meetBase) + } + } else { + contextMenu.hide() + } +} diff --git a/browser/src/Services/Completion/CompletionProvider.ts b/browser/src/Services/Completion/CompletionProvider.ts new file mode 100644 index 0000000000..a1e0d63c18 --- /dev/null +++ b/browser/src/Services/Completion/CompletionProvider.ts @@ -0,0 +1,123 @@ +/** + * Completion.ts + */ + +import { editorManager } from "./../EditorManager" + +import * as types from "vscode-languageserver-types" + +import * as Log from "./../../Log" +import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" +import { configuration } from "./../Configuration" +import { languageManager } from "./../Language" + +import * as CompletionUtility from "./CompletionUtility" + +export const getCompletions = async (language: string, filePath: string, line: number, character: number): Promise => { + + if (!configuration.getValue("editor.completions.enabled")) { + return null + } + + if (Log.isDebugLoggingEnabled()) { + Log.debug(`[COMPLETION] Requesting completions at line ${line} and character ${character}`) + } + + const args = { + textDocument: { + uri: Helpers.wrapPathInFileUri(filePath), + }, + position: { + line, + character, + }, + } + let result = null + try { + result = await languageManager.sendLanguageServerRequest(language, filePath, "textDocument/completion", args) + } catch (ex) { + Log.verbose(ex) + } + + if (!result) { + return null + } + + const items = getCompletionItems(result) + + if (!items) { + return null + } + + if (Log.isDebugLoggingEnabled()) { + Log.debug(`[COMPLETION] Got completions: ${items.length}`) + } + + const completions = items.map((i) => _convertCompletionForContextMenu(i)) + + return completions +} + +export const resolveCompletionItem = async (language: string, filePath: string, completionItem: types.CompletionItem): Promise => { + let result + try { + result = await languageManager.sendLanguageServerRequest(language, filePath, "completionItem/resolve", completionItem) + } catch (ex) { + Log.verbose(ex) + } + + if (!result) { + return null + } + + return _convertCompletionForContextMenu(result) +} + +export const commitCompletion = async (line: number, base: number, completion: string) => { + const buffer = editorManager.activeEditor.activeBuffer + const currentLines = await buffer.getLines(line, line + 1) + + const column = buffer.cursor.column + + if (!currentLines || !currentLines.length) { + return + } + + const originalLine = currentLines[0] + + const newLine = CompletionUtility.replacePrefixWithCompletion(originalLine, base, column, completion) + await buffer.setLines(line, line + 1, [newLine]) + const cursorOffset = newLine.length - originalLine.length + await buffer.setCursorPosition(line, column + cursorOffset) +} + +const getCompletionItems = (items: types.CompletionItem[] | types.CompletionList): types.CompletionItem[] => { + if (!items) { + return [] + } + + if (Array.isArray(items)) { + return items + } else { + return items.items || [] + } +} + +const getCompletionDocumentation = (item: types.CompletionItem): string | null => { + if (item.documentation) { + return item.documentation + } else if (item.data && item.data.documentation) { + return item.data.documentation + } else { + return null + } +} + +const _convertCompletionForContextMenu = (completion: types.CompletionItem): any => ({ + label: completion.label, + detail: completion.detail, + documentation: getCompletionDocumentation(completion), + icon: CompletionUtility.convertKindToIconName(completion.kind), + insertText: completion.insertText, + rawCompletion: completion, +}) diff --git a/browser/src/Services/Completion/CompletionSelectors.ts b/browser/src/Services/Completion/CompletionSelectors.ts new file mode 100644 index 0000000000..7724d03590 --- /dev/null +++ b/browser/src/Services/Completion/CompletionSelectors.ts @@ -0,0 +1,82 @@ +/** + * CompletionSelectors.ts + * + * Selectors are functions that take a state and derive a value from it. + */ + +import { ICompletionState } from "./CompletionState" + +import * as types from "vscode-languageserver-types" + +const EmptyCompletions: types.CompletionItem[] = [] + +import * as CompletionUtility from "./CompletionUtility" + +export const getFilteredCompletions = (state: ICompletionState): types.CompletionItem[] => { + + if (!state.completionResults.completions || !state.completionResults.completions.length) { + return EmptyCompletions + } + + if (!state.meetInfo.shouldExpand) { + return EmptyCompletions + } + + // If the completions were for a different meet line/position, we probably + // shouldn't show them... + if (state.meetInfo.meetLine !== state.completionResults.meetLine + || state.meetInfo.meetPosition !== state.completionResults.meetPosition) { + return EmptyCompletions + } + + // If we had previously accepted this completion, don't show it either + if (state.meetInfo.meetLine === state.lastCompletionInfo.meetLine + && state.meetInfo.meetPosition === state.lastCompletionInfo.meetPosition + && state.meetInfo.meetBase === state.lastCompletionInfo.completedText) { + return EmptyCompletions + } + + const completions = state.completionResults.completions + + const filteredCompletions = filterCompletionOptions(completions, state.meetInfo.meetBase) + + if (!filteredCompletions || !filteredCompletions.length) { + return EmptyCompletions + } + + // If there is only one element, and it matches our base, + // don't bother showing it.. + if (CompletionUtility.getInsertText(filteredCompletions[0]) === state.meetInfo.meetBase) { + return EmptyCompletions + } + + return filteredCompletions +} + +export const filterCompletionOptions = (items: types.CompletionItem[], searchText: string): types.CompletionItem[] => { + if (!searchText) { + return items + } + + if (!items || !items.length) { + return null + } + + const filterRegEx = new RegExp("^" + searchText.split("").join(".*") + ".*") + + const filteredOptions = items.filter((f) => { + const textToFilterOn = f.filterText || f.label + return textToFilterOn.match(filterRegEx) + }) + + return filteredOptions.sort((itemA, itemB) => { + + const itemAFilterText = itemA.filterText || itemA.label + const itemBFilterText = itemB.filterText || itemB.label + + const indexOfA = itemAFilterText.indexOf((searchText)) + const indexOfB = itemBFilterText.indexOf((searchText)) + + return indexOfB - indexOfA + }) +} diff --git a/browser/src/Services/Completion/CompletionState.ts b/browser/src/Services/Completion/CompletionState.ts new file mode 100644 index 0000000000..6136794516 --- /dev/null +++ b/browser/src/Services/Completion/CompletionState.ts @@ -0,0 +1,85 @@ +/** + * CompletionStore.ts + */ + +import * as types from "vscode-languageserver-types" + +export interface ICompletionState { + enabled: boolean + cursorInfo: ICursorInfo + bufferInfo: ICompletionBufferInfo + meetInfo: ICompletionMeetInfo + completionResults: ICompletionResults + lastCompletionInfo: ILastCompletionInfo +} + +export interface ICompletionMeetInfo { + meetLine: number + meetPosition: number + queryPosition: number + meetBase: string + shouldExpand: boolean +} + +export const DefaultMeetInfo: ICompletionMeetInfo = { + meetLine: -1, + meetPosition: -1, + queryPosition: -1, + meetBase: "", + shouldExpand: false, +} + +export interface ICompletionBufferInfo { + language: string + filePath: string +} + +export const DefaultCompletionBufferInfo: ICompletionBufferInfo = { + language: null, + filePath: null, +} + +export interface ILastCompletionInfo { + meetLine: number + meetPosition: number + completedText: string +} + +export const DefaultLastCompletionInfo: ILastCompletionInfo = { + meetLine: -1, + meetPosition: -1, + completedText: "", +} + +export interface ICompletionResults { + completions: types.CompletionItem[] + meetLine: number + meetPosition: number +} + +export const DefaultCompletionResults: ICompletionResults = { + completions: [], + meetLine: -1, + meetPosition: -1, +} + +export interface ICursorInfo { + line: number + column: number + lineContents: string +} + +export const DefaultCursorInfo: ICursorInfo = { + line: -1, + column: -1, + lineContents: "", +} + +export const DefaultCompletionState: ICompletionState = { + enabled: false, + cursorInfo: DefaultCursorInfo, + bufferInfo: DefaultCompletionBufferInfo, + meetInfo: DefaultMeetInfo, + completionResults: DefaultCompletionResults, + lastCompletionInfo: DefaultLastCompletionInfo, +} diff --git a/browser/src/Services/Completion/CompletionStore.ts b/browser/src/Services/Completion/CompletionStore.ts new file mode 100644 index 0000000000..9a228eb683 --- /dev/null +++ b/browser/src/Services/Completion/CompletionStore.ts @@ -0,0 +1,338 @@ +/** + * CompletionStore.ts + */ + +import * as types from "vscode-languageserver-types" + +import "rxjs/add/operator/mergeMap" +import { Observable } from "rxjs/Observable" + +import { combineReducers, Reducer, Store } from "redux" +import { combineEpics, createEpicMiddleware, Epic } from "redux-observable" + +import { createStore as oniCreateStore } from "./../../Redux" + +import { languageManager } from "./../Language" +import * as CompletionSelects from "./CompletionSelectors" +import * as CompletionUtility from "./CompletionUtility" + +import { commitCompletion, getCompletions, resolveCompletionItem } from "./CompletionProvider" + +import { DefaultCompletionResults, DefaultCompletionState, DefaultCursorInfo, DefaultLastCompletionInfo, DefaultMeetInfo, ICompletionBufferInfo, ICompletionMeetInfo, ICompletionResults, ICompletionState, ICursorInfo, ILastCompletionInfo } from "./CompletionState" + +export type CompletionAction = { + type: "CURSOR_MOVED", + line: number, + column: number + lineContents: string, +} | { + type: "MODE_CHANGED", + mode: string, + } | { + type: "BUFFER_ENTER", + language: string + filePath: string, + } | { + type: "COMMIT_COMPLETION" + meetBase: string + meetLine: number + meetPosition: number + completionText: string, + } | { + type: "MEET_CHANGED", + currentMeet: ICompletionMeetInfo, + } | { + type: "GET_COMPLETIONS_RESULT" + meetLine: number + meetPosition: number + completions: types.CompletionItem[], + } | { + type: "SELECT_ITEM", + completionItem: types.CompletionItem, + } | { + type: "GET_COMPLETION_ITEM_DETAILS_RESULT" + completionItemWithDetails: types.CompletionItem, + } + +const bufferInfoReducer: Reducer = ( + state: ICompletionBufferInfo = { + language: null, + filePath: null, + }, + action: CompletionAction, +) => { + switch (action.type) { + case "BUFFER_ENTER": + return { + language: action.language, + filePath: action.filePath, + } + default: + return state + } +} + +const meetInfoReducer: Reducer = ( + state: ICompletionMeetInfo = DefaultMeetInfo, + action: CompletionAction, +) => { + switch (action.type) { + case "MODE_CHANGED": + return DefaultMeetInfo + case "MEET_CHANGED": + return { + ...action.currentMeet, + } + default: + return state + } +} + +export const completionResultsReducer: Reducer = ( + state: ICompletionResults = DefaultCompletionResults, + action: CompletionAction, +) => { + switch (action.type) { + case "MODE_CHANGED": + case "BUFFER_ENTER": + return DefaultCompletionResults + case "GET_COMPLETIONS_RESULT": + return { + meetLine: action.meetLine, + meetPosition: action.meetPosition, + completions: action.completions, + } + case "GET_COMPLETION_ITEM_DETAILS_RESULT": + return { + ...state, + completions: state.completions.map((completion) => { + if (completion.label === action.completionItemWithDetails.label) { + return action.completionItemWithDetails + } else { + return completion + } + }), + } + default: + return state + } +} + +export const cursorInfoReducer: Reducer = ( + state: ICursorInfo = DefaultCursorInfo, + action: CompletionAction, +) => { + switch (action.type) { + case "CURSOR_MOVED": + return { + line: action.line, + lineContents: action.lineContents, + column: action.column, + } + default: + return state + } +} + +export const enabledReducer: Reducer = ( + state: boolean = false, + action: CompletionAction, +) => { + switch (action.type) { + case "MODE_CHANGED": + return action.mode === "insert" + default: + return state + } +} + +export const lastCompletionInfoReducer: Reducer = ( + state: ILastCompletionInfo = DefaultLastCompletionInfo, + action: CompletionAction, +) => { + switch (action.type) { + case "MODE_CHANGED": + case "BUFFER_ENTER": + return DefaultLastCompletionInfo + case "COMMIT_COMPLETION": + return { + meetLine: action.meetLine, + meetPosition: action.meetPosition, + completedText: action.completionText, + } + default: + return state + } +} + +const nullAction: CompletionAction = { type: null } as CompletionAction + +const getCompletionMeetEpic: Epic = (action$, store) => + action$.ofType("CURSOR_MOVED", "MODE_CHANGED") + .map((action: CompletionAction) => { + const currentState: ICompletionState = store.getState() + + if (!currentState.enabled) { + return nullAction + } + + if (!currentState.bufferInfo || !currentState.bufferInfo.language) { + return nullAction + } + + if (!currentState.cursorInfo || !currentState.cursorInfo.lineContents) { + return nullAction + } + + const { bufferInfo } = currentState + + const token = languageManager.getTokenRegex(bufferInfo.language) + const completionCharacters = languageManager.getCompletionTriggerCharacters(bufferInfo.language) + + const meet = CompletionUtility.getCompletionMeet(currentState.cursorInfo.lineContents, currentState.cursorInfo.column, token, completionCharacters) + + const meetForAction: ICompletionMeetInfo = { + meetPosition: meet.position, + meetLine: currentState.cursorInfo.line, + queryPosition: meet.positionToQuery, + meetBase: meet.base, + shouldExpand: meet.shouldExpandCompletions, + } + + return { + type: "MEET_CHANGED", + currentMeet: meetForAction, + } as CompletionAction + }) + +const commitCompletionEpic: Epic = (action$, store) => + action$.ofType("COMMIT_COMPLETION") + .do(async (action) => { + if (action.type !== "COMMIT_COMPLETION") { + return + } + + await commitCompletion(action.meetLine, action.meetPosition, action.completionText) + }).map(_ => nullAction) + +const getCompletionsEpic: Epic = (action$, store) => + action$.ofType("MEET_CHANGED") + .filter(() => store.getState().enabled) + .filter((action) => { + const state = store.getState() + + if (action.type !== "MEET_CHANGED") { + return false + } + + if (!action.currentMeet.shouldExpand) { + return false + } + + if (action.currentMeet.meetLine === state.completionResults.meetLine + && action.currentMeet.meetPosition === state.completionResults.meetPosition) { + return false + } + + return true + }) + .mergeMap((action: CompletionAction): Observable => { + + const state = store.getState() + + // Helper to let TypeScript know that we can assume this is 'MEET_CHANGED'... + if (action.type !== "MEET_CHANGED") { + return Observable.of(nullAction) + } + + if (!state.enabled) { + return Observable.of(nullAction) + } + + // Check if the meet is different from the last meet we queried + const requestResult: Observable = Observable.defer(async () => { + const results = await getCompletions(state.bufferInfo.language, state.bufferInfo.filePath, action.currentMeet.meetLine, action.currentMeet.queryPosition) + const completions = results || [] + return completions + + }) + + const ret = requestResult.map((completions) => { + return { + type: "GET_COMPLETIONS_RESULT", + meetLine: action.currentMeet.meetLine, + meetPosition: action.currentMeet.meetPosition, + completions, + } as CompletionAction + }) + + return ret + }) + +const getCompletionDetailsEpic: Epic = (action$, store) => + action$.ofType("SELECT_ITEM") + .mergeMap((action) => { + + if (action.type !== "SELECT_ITEM") { + return Observable.of(nullAction) + } + + return Observable.defer(async () => { + const state = store.getState() + + const result = await resolveCompletionItem(state.bufferInfo.language, state.bufferInfo.filePath, action.completionItem) + return result + }).map((itemResult: types.CompletionItem) => { + if (itemResult) { + return { + type: "GET_COMPLETION_ITEM_DETAILS_RESULT", + completionItemWithDetails: itemResult, + } as CompletionAction + } else { + return nullAction + } + }) + }) + +const selectFirstItemEpic: Epic = (action$, store) => + action$.ofType("GET_COMPLETIONS_RESULT") + .map((action) => { + + if (action.type !== "GET_COMPLETIONS_RESULT") { + return nullAction + } + + const state = store.getState() + const filteredItems = CompletionSelects.filterCompletionOptions(action.completions, state.meetInfo.meetBase) + + if (!filteredItems || !filteredItems.length) { + return nullAction + } + + return { + type: "SELECT_ITEM", + completionItem: filteredItems[0], + } as CompletionAction + + }) + +export const createStore = (): Store => { + return oniCreateStore("COMPLETION_STORE", + combineReducers({ + enabled: enabledReducer, + bufferInfo: bufferInfoReducer, + meetInfo: meetInfoReducer, + completionResults: completionResultsReducer, + lastCompletionInfo: lastCompletionInfoReducer, + cursorInfo: cursorInfoReducer, + }), + DefaultCompletionState, + [createEpicMiddleware(combineEpics( + commitCompletionEpic, + getCompletionMeetEpic, + getCompletionsEpic, + getCompletionDetailsEpic, + selectFirstItemEpic, + ))], + ) +} diff --git a/browser/src/Services/Language/Completion/CompletionUtility.ts b/browser/src/Services/Completion/CompletionUtility.ts similarity index 93% rename from browser/src/Services/Language/Completion/CompletionUtility.ts rename to browser/src/Services/Completion/CompletionUtility.ts index 391d759f42..96e67e0b42 100644 --- a/browser/src/Services/Language/Completion/CompletionUtility.ts +++ b/browser/src/Services/Completion/CompletionUtility.ts @@ -1,139 +1,141 @@ -/** - * CompletionUtility.ts - * - * Helper functions for auto completion - */ - -import * as types from "vscode-languageserver-types" - -export function getCompletionStart(bufferLine: string, cursorColumn: number, completion: string): number { - - cursorColumn = Math.min(cursorColumn, bufferLine.length) - - let x = cursorColumn - while (x >= 0) { - - const subWord = bufferLine.substring(x, cursorColumn + 1) - - if (completion.indexOf(subWord) === -1) { - break - } - - x-- - } - - return x + 1 -} - -export const getInsertText = (completionItem: types.CompletionItem): string => { - return completionItem.insertText || completionItem.label -} - -export function replacePrefixWithCompletion(bufferLine: string, basePosition: number, cursorColumn: number, completion: string): string { - const startPosition = basePosition - - const before = bufferLine.substring(0, startPosition) - const after = bufferLine.substring(cursorColumn, bufferLine.length) - - return before + completion + after -} - -export interface CompletionMeetResult { - // Position - where the meet starts - position: number - - // PositionToQuery - where the query request should start - positionToQuery: number - - // Base - the currentg prefix of the completion - base: string - - // Whether or not completiosn should be expanded / queriried - shouldExpandCompletions: boolean -} - -export const doesCharacterMatchTriggerCharacters = (character: string, triggerCharacters: string[]): boolean => { - return triggerCharacters.indexOf(character) >= 0 -} - -/** - * Returns the start of the 'completion meet' along with the current base for completion - */ -export function getCompletionMeet(line: string, cursorColumn: number, characterMatchRegex: RegExp, completionTriggerCharacters: string[]): CompletionMeetResult { - - // Clamp column to within string bands - let col = Math.max(cursorColumn - 1, 0) - col = Math.min(col, line.length - 1) - - let currentPrefix = "" - - while (col >= 0 && col < line.length) { - const currentCharacter = line[col] - - if (!currentCharacter.match(characterMatchRegex) || doesCharacterMatchTriggerCharacters(currentCharacter, completionTriggerCharacters)) { - break - } - - currentPrefix = currentCharacter + currentPrefix - col-- - } - - const basePos = col + 1 - - const isFromTriggerCharacter = doesCharacterMatchTriggerCharacters(line[basePos - 1], completionTriggerCharacters) - - const shouldExpandCompletions = currentPrefix.length > 0 || isFromTriggerCharacter - - const positionToQuery = isFromTriggerCharacter ? basePos : basePos + 1 - - return { - position: basePos, - positionToQuery, - base: currentPrefix, - shouldExpandCompletions, - } -} - -export const convertKindToIconName = (completionKind: types.CompletionItemKind) => { - - switch (completionKind) { - case types.CompletionItemKind.Class: - return "cube" - case types.CompletionItemKind.Color: - return "paint-brush" - case types.CompletionItemKind.Constructor: - return "building" - case types.CompletionItemKind.Enum: - return "sitemap" - case types.CompletionItemKind.Field: - return "var" - case types.CompletionItemKind.File: - return "file" - case types.CompletionItemKind.Function: - return "cog" - case types.CompletionItemKind.Interface: - return "plug" - case types.CompletionItemKind.Keyword: - return "key" - case types.CompletionItemKind.Method: - return "flash" - case types.CompletionItemKind.Module: - return "cubes" - case types.CompletionItemKind.Property: - return "wrench" - case types.CompletionItemKind.Reference: - return "chain" - case types.CompletionItemKind.Snippet: - return "align-justify" - case types.CompletionItemKind.Text: - return "align-justify" - case types.CompletionItemKind.Unit: - return "tag" - case types.CompletionItemKind.Value: - return "lock" - case types.CompletionItemKind.Variable: - return "code" - default: - return "question" - } -} +/** + * CompletionUtility.ts + * + * Helper functions for auto completion + */ + +import * as types from "vscode-languageserver-types" + +export function getCompletionStart(bufferLine: string, cursorColumn: number, completion: string): number { + + cursorColumn = Math.min(cursorColumn, bufferLine.length) + + let x = cursorColumn + while (x >= 0) { + + const subWord = bufferLine.substring(x, cursorColumn + 1) + + if (completion.indexOf(subWord) === -1) { + break + } + + x-- + } + + return x + 1 +} + +export const getInsertText = (completionItem: types.CompletionItem): string => { + return completionItem.insertText || completionItem.label +} + +export function replacePrefixWithCompletion(bufferLine: string, basePosition: number, cursorColumn: number, completion: string): string { + const startPosition = basePosition + + const before = bufferLine.substring(0, startPosition) + const after = bufferLine.substring(cursorColumn, bufferLine.length) + + return before + completion + after +} + +export interface CompletionMeetResult { + // Position - where the meet starts + position: number + + // PositionToQuery - where the query request should start + positionToQuery: number + + // Base - the currentg prefix of the completion + base: string + + // Whether or not completiosn should be expanded / queriried + shouldExpandCompletions: boolean +} + +export const doesCharacterMatchTriggerCharacters = (character: string, triggerCharacters: string[]): boolean => { + return triggerCharacters.indexOf(character) >= 0 +} + +/** + * Returns the start of the 'completion meet' along with the current base for completion + */ +export function getCompletionMeet(line: string, cursorColumn: number, characterMatchRegex: RegExp, completionTriggerCharacters: string[]): CompletionMeetResult { + + // Clamp column to within string bounds + let col = Math.max(cursorColumn - 1, 0) + col = Math.min(col, line.length - 1) + + let currentPrefix = "" + + while (col >= 0 && col < line.length) { + const currentCharacter = line[col] + + if (!currentCharacter.match(characterMatchRegex) || doesCharacterMatchTriggerCharacters(currentCharacter, completionTriggerCharacters)) { + break + } + + currentPrefix = currentCharacter + currentPrefix + col-- + } + + const basePos = col + 1 + + const isFromTriggerCharacter = doesCharacterMatchTriggerCharacters(line[basePos - 1], completionTriggerCharacters) + + const isCharacterAfterCursor = (cursorColumn < line.length) && line[cursorColumn].match(characterMatchRegex) + + const shouldExpandCompletions = (currentPrefix.length > 0 || isFromTriggerCharacter) && !isCharacterAfterCursor + + const positionToQuery = isFromTriggerCharacter ? basePos : basePos + 1 + + return { + position: basePos, + positionToQuery, + base: currentPrefix, + shouldExpandCompletions, + } +} + +export const convertKindToIconName = (completionKind: types.CompletionItemKind) => { + + switch (completionKind) { + case types.CompletionItemKind.Class: + return "cube" + case types.CompletionItemKind.Color: + return "paint-brush" + case types.CompletionItemKind.Constructor: + return "building" + case types.CompletionItemKind.Enum: + return "sitemap" + case types.CompletionItemKind.Field: + return "var" + case types.CompletionItemKind.File: + return "file" + case types.CompletionItemKind.Function: + return "cog" + case types.CompletionItemKind.Interface: + return "plug" + case types.CompletionItemKind.Keyword: + return "key" + case types.CompletionItemKind.Method: + return "flash" + case types.CompletionItemKind.Module: + return "cubes" + case types.CompletionItemKind.Property: + return "wrench" + case types.CompletionItemKind.Reference: + return "chain" + case types.CompletionItemKind.Snippet: + return "align-justify" + case types.CompletionItemKind.Text: + return "align-justify" + case types.CompletionItemKind.Unit: + return "tag" + case types.CompletionItemKind.Value: + return "lock" + case types.CompletionItemKind.Variable: + return "code" + default: + return "question" + } +} diff --git a/browser/src/Services/Language/Completion/index.ts b/browser/src/Services/Completion/index.ts similarity index 100% rename from browser/src/Services/Language/Completion/index.ts rename to browser/src/Services/Completion/index.ts diff --git a/browser/src/Services/ContextMenu/ContextMenu.less b/browser/src/Services/ContextMenu/ContextMenu.less index 7d31733925..247795fe58 100644 --- a/browser/src/Services/ContextMenu/ContextMenu.less +++ b/browser/src/Services/ContextMenu/ContextMenu.less @@ -11,7 +11,8 @@ .entry { &.selected { - .box-shadow; + transform: translateY(0.1px); + box-shadow: 0 1px 8px 1px rgba(0, 0, 0, 0.2), 0 1px 20px 0 rgba(0, 0, 0, 0.19); .main { opacity: 1; diff --git a/browser/src/Services/ContextMenu/ContextMenu.tsx b/browser/src/Services/ContextMenu/ContextMenu.tsx index d320d4bead..621fe049d9 100644 --- a/browser/src/Services/ContextMenu/ContextMenu.tsx +++ b/browser/src/Services/ContextMenu/ContextMenu.tsx @@ -5,7 +5,7 @@ */ import * as React from "react" -import { applyMiddleware, bindActionCreators, createStore } from "redux" +import { bindActionCreators } from "redux" import thunk from "redux-thunk" import * as types from "vscode-languageserver-types" @@ -17,6 +17,8 @@ import * as ActionCreators from "./../Menu/MenuActionCreators" import { createReducer } from "./../Menu/MenuReducer" import * as State from "./../Menu/MenuState" +import { createStore } from "./../../Redux" + import * as UI from "./../../UI" import { ContextMenuContainer } from "./ContextMenuComponent" @@ -35,7 +37,7 @@ const reducer = createReducer((opts, }) }) -export const contextMenuStore = createStore(reducer, State.createDefaultState(), applyMiddleware(thunk)) +export const contextMenuStore = createStore("CONTEXT-MENU", reducer, State.createDefaultState(), [thunk]) export const contextMenuActions: typeof ActionCreators = bindActionCreators(ActionCreators as any, contextMenuStore.dispatch) // TODO: This is essentially a duplicate of `MenuManager.ts` - can this be consolidated? @@ -111,7 +113,12 @@ export class ContextMenu { } public setFilter(filter: string): void { - contextMenuActions.filterMenu(filter) + + const contextMenuState = contextMenuStore.getState() + + if (contextMenuState.menu && contextMenuState.menu.filter !== filter) { + contextMenuActions.filterMenu(filter) + } } public setLoading(isLoading: boolean): void { diff --git a/browser/src/Services/Language/Completion/Completion.ts b/browser/src/Services/Language/Completion/Completion.ts deleted file mode 100644 index 2812d01f48..0000000000 --- a/browser/src/Services/Language/Completion/Completion.ts +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Completion.ts - */ - -import * as isEqual from "lodash/isEqual" -import "rxjs/add/observable/combineLatest" -import "rxjs/add/operator/withLatestFrom" -import { Observable } from "rxjs/Observable" - -import * as types from "vscode-languageserver-types" - -import * as Oni from "oni-api" - -import * as Log from "./../../../Log" -import * as Helpers from "./../../../Plugins/Api/LanguageClient/LanguageClientHelpers" -import { configuration } from "./../../Configuration" - -import { ILatestCursorAndBufferInfo } from "./../LanguageEditorIntegration" -import { languageManager } from "./../LanguageManager" - -import { createCompletionMenu } from "./CompletionMenu" -import * as CompletionUtility from "./CompletionUtility" - -export interface ICompletionMeetInfo { - language: string - filePath: string - meetLine: number - meetPosition: number - queryPosition: number - meetBase: string - shouldExpand: boolean -} - -export interface ICompletionResults { - completions: types.CompletionItem[] - meetLine: number - meetPosition: number -} - -export const initCompletionUI = (latestCursorAndBufferInfo$: Observable, modeChanged$: Observable) => { - - // Observable that gets full completion context (cursor positon + meet info) - const completionMeet$: Observable = latestCursorAndBufferInfo$ - .map((changeInfo) => { - const token = languageManager.getTokenRegex(changeInfo.language) - const completionCharacters = languageManager.getCompletionTriggerCharacters(changeInfo.language) - const meet = CompletionUtility.getCompletionMeet(changeInfo.contents, changeInfo.cursorColumn, token, completionCharacters) - - if (Log.isDebugLoggingEnabled()) { - Log.debug(`[COMPLETION] Got meet at position: ${meet.position} with base: ${meet.base} - shouldExpand: ${meet.shouldExpandCompletions}`) - } - - return { - language: changeInfo.language, - filePath: changeInfo.filePath, - meetLine: changeInfo.cursorLine, - meetPosition: meet.position, - queryPosition: meet.positionToQuery, - meetBase: meet.base, - shouldExpand: meet.shouldExpandCompletions, - } - }) - - const completion$: Observable = completionMeet$ - // Only check for completion if the meets have actually changed - // requesting completions for the same spot - .distinctUntilChanged(isEqual) - .filter((info) => info.shouldExpand) - .mergeMap((completionInfo: ICompletionMeetInfo) => { - return Observable.defer(async () => { - const results = await getCompletions(completionInfo.language, completionInfo.filePath, completionInfo.meetLine, completionInfo.queryPosition) - - if (!results || !results.length) { - return null - } - - return { - completions: results, - meetLine: completionInfo.meetLine, - meetPosition: completionInfo.meetPosition, - } - }) - }) - - // Core completion logic: - // Take the latest completion info, meet info, and mode - // and determine what to show in the context menu - const resolvedCompletion$ = Observable - .combineLatest(completion$, completionMeet$) - .map((args: [ICompletionResults, ICompletionMeetInfo]) => { - - const [completionInfo, meetInfo] = args - return resolveCompletionsFromCurrentState(completionInfo, meetInfo) - }) - - createCompletionMenu(completionMeet$, resolvedCompletion$, modeChanged$) -} - -export interface IResolvedCompletions { - completions: types.CompletionItem[] - meetInfo: ICompletionMeetInfo -} - -export const resolveCompletionsFromCurrentState = (completionInfo: ICompletionResults, meetInfo: ICompletionMeetInfo): IResolvedCompletions => { - if (!completionInfo) { - return null - } - - const { completions, meetLine, meetPosition } = completionInfo - - const filteredCompletions = filterCompletionOptions(completions, meetInfo.meetBase) - - if (!filteredCompletions || !filteredCompletions.length || !meetInfo.shouldExpand) { - return null - } else if (meetLine !== meetInfo.meetLine || meetPosition !== meetInfo.meetPosition) { - return null - } else if (filteredCompletions.length === 1) { - const completionItem: types.CompletionItem = filteredCompletions[0] - if (CompletionUtility.getInsertText(completionItem) === meetInfo.meetBase) { - return null - } else { - return { - completions: filteredCompletions, - meetInfo, - } - } - } else { - return { - completions: filteredCompletions, - meetInfo, - } - } -} - -export const filterCompletionOptions = (items: types.CompletionItem[], searchText: string): types.CompletionItem[] => { - if (!searchText) { - return items - } - - if (!items || !items.length) { - return null - } - - const filterRegEx = new RegExp("^" + searchText.split("").join(".*") + ".*") - - const filteredOptions = items.filter((f) => { - const textToFilterOn = f.filterText || f.label - return textToFilterOn.match(filterRegEx) - }) - - return filteredOptions.sort((itemA, itemB) => { - - const itemAFilterText = itemA.filterText || itemA.label - const itemBFilterText = itemB.filterText || itemB.label - - const indexOfA = itemAFilterText.indexOf((searchText)) - const indexOfB = itemBFilterText.indexOf((searchText)) - - return indexOfB - indexOfA - }) -} - -export const getCompletions = async (language: string, filePath: string, line: number, character: number): Promise => { - - if (!configuration.getValue("editor.completions.enabled")) { - return null - } - - if (Log.isDebugLoggingEnabled()) { - Log.debug(`[COMPLETION] Requesting completions at line ${line} and character ${character}`) - } - - const args = { - textDocument: { - uri: Helpers.wrapPathInFileUri(filePath), - }, - position: { - line, - character, - }, - } - let result = null - try { - result = await languageManager.sendLanguageServerRequest(language, filePath, "textDocument/completion", args) - } catch (ex) { - Log.verbose(ex) - } - - if (!result) { - return null - } - - const items = getCompletionItems(result) - - if (!items) { - return null - } - - if (Log.isDebugLoggingEnabled()) { - Log.debug(`[COMPLETION] Got completions: ${items}`) - } - - const completions = items.map((i) => _convertCompletionForContextMenu(i)) - - return completions -} - -export const resolveCompletionItem = async (language: string, filePath: string, completionItem: types.CompletionItem): Promise => { - let result - try { - result = await languageManager.sendLanguageServerRequest(language, filePath, "completionItem/resolve", completionItem) - } catch (ex) { - Log.verbose(ex) - } - - if (!result) { - return null - } - - return _convertCompletionForContextMenu(result) -} - -const getCompletionItems = (items: types.CompletionItem[] | types.CompletionList): types.CompletionItem[] => { - if (!items) { - return [] - } - - if (Array.isArray(items)) { - return items - } else { - return items.items || [] - } -} - -const getCompletionDocumentation = (item: types.CompletionItem): string | null => { - if (item.documentation) { - return item.documentation - } else if (item.data && item.data.documentation) { - return item.data.documentation - } else { - return null - } -} - -const _convertCompletionForContextMenu = (completion: types.CompletionItem): any => ({ - label: completion.label, - detail: completion.detail, - documentation: getCompletionDocumentation(completion), - icon: CompletionUtility.convertKindToIconName(completion.kind), - insertText: completion.insertText, - rawCompletion: completion, -}) diff --git a/browser/src/Services/Language/Completion/CompletionMenu.ts b/browser/src/Services/Language/Completion/CompletionMenu.ts deleted file mode 100644 index 9670ea9047..0000000000 --- a/browser/src/Services/Language/Completion/CompletionMenu.ts +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Completion.ts - */ - -import "rxjs/add/observable/combineLatest" -import "rxjs/add/operator/withLatestFrom" -import { Observable } from "rxjs/Observable" - -import * as types from "vscode-languageserver-types" - -import * as Oni from "oni-api" - -import { contextMenuManager } from "./../../ContextMenu" -import { editorManager } from "./../../EditorManager" - -import * as CompletionUtility from "./CompletionUtility" - -import { ICompletionMeetInfo, IResolvedCompletions, resolveCompletionItem } from "./Completion" - -export const createCompletionMenu = (completionMeet$: Observable, completion$: Observable, modeChanged$: Observable): void => { - - const completionContextMenu = contextMenuManager.create() - - let lastCompletedMeet: ICompletionMeetInfo = null - let lastSelection: string = null - - // Handle menu completion - const completionMenuItemSelected$ = completionContextMenu.onItemSelected.asObservable() - completionMenuItemSelected$ - .withLatestFrom(completionMeet$) - .subscribe((args: [any, ICompletionMeetInfo]) => { - const [completionItem, lastMeet] = args - - if (lastMeet) { - const insertText = CompletionUtility.getInsertText(completionItem) - commitCompletion(lastMeet.meetLine, lastMeet.meetPosition, insertText) - - lastCompletedMeet = lastMeet - lastSelection = insertText - completionContextMenu.hide() - } - }) - - // Handle menu selection - const completionMenuSelectedItemChanged$ = completionContextMenu.onSelectedItemChanged.asObservable() - completionMenuSelectedItemChanged$ - .withLatestFrom(completionMeet$) - .subscribe(async (args: [any, ICompletionMeetInfo]) => { - const [newItem, lastMeet] = args - - await updateCompletionItemDetails(completionContextMenu, lastMeet.language, lastMeet.filePath, newItem.rawCompletion) - }) - - completion$ - .combineLatest(modeChanged$) - .subscribe((result: [IResolvedCompletions, Oni.Vim.Mode]) => { - - const [completions, mode] = result - - if (!completions || !completions.completions || !completions.completions.length) { - completionContextMenu.hide() - return - } - - // If we're switching from insert mode, - // clear out completion state and hide menu - if (mode !== "insert") { - lastCompletedMeet = null - lastSelection = null - completionContextMenu.hide() - return - } - - const meetInfo = completions.meetInfo - - // If we're trying to complete the same item - // we completed before, from the same spot, - // hide the menu. - // - // This helps the case where we accepted a shorter completion, - // but there are potential longer completions. Without this logic, - // we'd still keep the completion menu pu - if (lastCompletedMeet !== null - && lastCompletedMeet.meetLine === meetInfo.meetLine - && lastCompletedMeet.meetPosition === meetInfo.meetPosition - && lastSelection === meetInfo.meetBase) { - completionContextMenu.hide() - return - } - - completionContextMenu.show(completions.completions, meetInfo.meetBase) - updateCompletionItemDetails(completionContextMenu, meetInfo.language, meetInfo.filePath, completions.completions[0]) - }) -} - -let lastDetailsRequestInfo: { label: string, result: types.CompletionItem } = { label: null, result: null } - -export const updateCompletionItemDetails = async (menu: any, language: string, filePath: string, completionItem: types.CompletionItem) => { - - if (lastDetailsRequestInfo.label === completionItem.label && lastDetailsRequestInfo.result) { - menu.updateItem(lastDetailsRequestInfo.result) - return - } - - const result = await resolveCompletionItem(language, filePath, completionItem) - - lastDetailsRequestInfo = { - label: completionItem.label, - result, - } - - if (result) { - menu.updateItem(result) - } -} - -export const commitCompletion = async (line: number, base: number, completion: string) => { - const buffer = editorManager.activeEditor.activeBuffer - const currentLines = await buffer.getLines(line, line + 1) - - const column = buffer.cursor.column - - if (!currentLines || !currentLines.length) { - return - } - - const originalLine = currentLines[0] - - const newLine = CompletionUtility.replacePrefixWithCompletion(originalLine, base, column, completion) - await buffer.setLines(line, line + 1, [newLine]) - const cursorOffset = newLine.length - originalLine.length - await buffer.setCursorPosition(line, column + cursorOffset) -} diff --git a/browser/src/Services/Language/LanguageEditorIntegration.ts b/browser/src/Services/Language/LanguageEditorIntegration.ts index b012463a12..f1808c674c 100644 --- a/browser/src/Services/Language/LanguageEditorIntegration.ts +++ b/browser/src/Services/Language/LanguageEditorIntegration.ts @@ -10,11 +10,9 @@ import * as isEqual from "lodash/isEqual" import "rxjs/add/observable/never" import { Observable } from "rxjs/Observable" -// import * as types from "vscode-languageserver-types" import * as Oni from "oni-api" import { editorManager } from "./../EditorManager" -import * as Completion from "./Completion" import * as Definition from "./Definition" import * as Hover from "./Hover" import * as SignatureHelp from "./SignatureHelp" @@ -79,6 +77,5 @@ export const addInsertModeLanguageFunctionality = (cursorMoved$: Observable { + + describe("getCompletionStart", () => { + it("rewinds back to first character", () => { + const bufferLine = "abc" + const cursorColumn = 5 + const completion = "c" + + const completionStart = CompletionUtility.getCompletionStart(bufferLine, cursorColumn, completion) + assert.strictEqual(completionStart, 2) + }) + }) + + describe("getCompletionMeet", () => { + it("shouldExpandCompletions is true when at end of word", () => { + + const line = "const" + const cursorPosition = 5 // const| + + const meet = CompletionUtility.getCompletionMeet(line, cursorPosition, DefaultCursorMatchRegEx, DefaultTriggerCharacters) + + const expectedResult = { + position: 0, + positionToQuery: 1, // When there is no trigger character, we expect it to be an extra position forward + base: "const", + shouldExpandCompletions: true, + } + + assert.deepEqual(meet, expectedResult) + }) + + it("shouldExpandCompletions is false when in the middle of a word", () => { + const line = "const" + const cursorPosition = 3 // con|st + + const meet = CompletionUtility.getCompletionMeet(line, cursorPosition, DefaultCursorMatchRegEx, DefaultTriggerCharacters) + + const expectedResult = { + position: 0, + positionToQuery: 1, // When there is no trigger character, we expect it to be an extra position forward + base: "con", + shouldExpandCompletions: false, + } + + assert.deepEqual(meet, expectedResult) + }) + }) +}) diff --git a/browser/test/Services/Language/Completion/CompletionUtilityTests.ts b/browser/test/Services/Language/Completion/CompletionUtilityTests.ts deleted file mode 100644 index dc2699223c..0000000000 --- a/browser/test/Services/Language/Completion/CompletionUtilityTests.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as assert from "assert" - -import * as CompletionUtility from "./../../../../src/Services/Language/Completion/CompletionUtility" - -describe("CompletionUtility", () => { - - describe("getCompletionStart", () => { - it("rewinds back to first character", () => { - const bufferLine = "abc" - const cursorColumn = 5 - const completion = "c" - - const completionStart = CompletionUtility.getCompletionStart(bufferLine, cursorColumn, completion) - assert.strictEqual(completionStart, 2) - }) - }) -}) diff --git a/package.json b/package.json index 2f59755d05..7e01ff5106 100644 --- a/package.json +++ b/package.json @@ -175,7 +175,7 @@ "react-redux": "5.0.6", "react-transition-group": "2.2.1", "redux": "3.7.2", - "redux-observable": "^0.17.0", + "redux-observable": "0.17.0", "redux-thunk": "2.2.0", "reselect": "3.0.1", "rxjs": "5.5.0", diff --git a/test/CiTests.ts b/test/CiTests.ts index f7791f39c3..baa3f368a0 100644 --- a/test/CiTests.ts +++ b/test/CiTests.ts @@ -11,7 +11,8 @@ const LongTimeout = 5000 const CiTests = [ "BasicEditingTest", - "AutoCompletionTest", + "AutoCompletionTest-CSS", + "AutoCompletionTest-TypeScript", "QuickOpenTest", "NoInstalledNeovim", ] diff --git a/test/ci/AutoCompletionTest-CSS.ts b/test/ci/AutoCompletionTest-CSS.ts new file mode 100644 index 0000000000..8285e2415a --- /dev/null +++ b/test/ci/AutoCompletionTest-CSS.ts @@ -0,0 +1,29 @@ +/** + * Test scripts for QuickOpen + */ + +import * as assert from "assert" +import * as os from "os" +import * as path from "path" + +import { getCompletionElement } from "./Common" + +export const test = async (oni: any) => { + const dir = os.tmpdir() + const testFileName = `testFile-${new Date().getTime()}.css` + const tempFilePath = path.join(dir, testFileName) + oni.automation.sendKeys(":e " + tempFilePath) + oni.automation.sendKeys("") + await oni.automation.sleep(500) + oni.automation.sendKeys("i") + oni.automation.sendKeys(".test { pos") + + // Wait for completion popup to show + await oni.automation.waitFor(() => getCompletionElement() !== null) + + // Check for 'alert' as an available completion + const completionElement = getCompletionElement() + const textContent = completionElement.textContent + + assert.ok(textContent.indexOf("position") >= 0, "Verify 'position' was presented as a completion") +} diff --git a/test/ci/AutoCompletionTest-TypeScript.ts b/test/ci/AutoCompletionTest-TypeScript.ts new file mode 100644 index 0000000000..9e7fd44725 --- /dev/null +++ b/test/ci/AutoCompletionTest-TypeScript.ts @@ -0,0 +1,29 @@ +/** + * Test scripts for QuickOpen + */ + +import * as assert from "assert" +import * as os from "os" +import * as path from "path" + +import { getCompletionElement } from "./Common" + +export const test = async (oni: any) => { + const dir = os.tmpdir() + const testFileName = `testFile-${new Date().getTime()}.ts` + const tempFilePath = path.join(dir, testFileName) + oni.automation.sendKeys(":e " + tempFilePath) + oni.automation.sendKeys("") + await oni.automation.sleep(500) + oni.automation.sendKeys("i") + oni.automation.sendKeys("window.a") + + // Wait for completion popup to show + await oni.automation.waitFor(() => getCompletionElement() !== null) + + // Check for 'alert' as an available completion + const completionElement = getCompletionElement() + const textContent = completionElement.textContent + + assert.ok(textContent.indexOf("alert") >= 0, "Verify 'alert' was presented as a completion") +} diff --git a/test/ci/AutoCompletionTest.ts b/test/ci/AutoCompletionTest.ts index bab7302f39..9e7fd44725 100644 --- a/test/ci/AutoCompletionTest.ts +++ b/test/ci/AutoCompletionTest.ts @@ -6,16 +6,7 @@ import * as assert from "assert" import * as os from "os" import * as path from "path" -const getCompletionElement = () => { - - const elements = document.body.getElementsByClassName("autocompletion") - - if (!elements || !elements.length) { - return null - } else { - return elements[0] - } -} +import { getCompletionElement } from "./Common" export const test = async (oni: any) => { const dir = os.tmpdir() diff --git a/test/ci/Common.ts b/test/ci/Common.ts new file mode 100644 index 0000000000..b7988e5930 --- /dev/null +++ b/test/ci/Common.ts @@ -0,0 +1,14 @@ +/** + * Test scripts for QuickOpen + */ + +export const getCompletionElement = () => { + + const elements = document.body.getElementsByClassName("autocompletion") + + if (!elements || !elements.length) { + return null + } else { + return elements[0] + } +} diff --git a/tslint.json b/tslint.json index 8e811a58c2..5bc7ed02a8 100644 --- a/tslint.json +++ b/tslint.json @@ -10,6 +10,7 @@ "max-line-length": [ false ], + "no-object-literal-type-assertion": false, "no-submodule-imports": false, "no-reference": false, "no-namespace": false, From a94255d945a890d276374cf4c9b93fc48f4eb1f4 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 27 Nov 2017 19:03:11 -0800 Subject: [PATCH 38/63] Use common 'createStore' method for shell / UI (#1026) * Use common 'createStore' method * Fix issue with shared requestAnimationFrame functionality, where not all callbacks would be fired.. --- .../RequestAnimationFrameNotifyBatcher.ts | 20 ++++++++------- browser/src/Redux/createStore.ts | 2 +- browser/src/UI/index.tsx | 25 +++---------------- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts b/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts index 7e761f03a9..5766be4dd4 100644 --- a/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts +++ b/browser/src/Redux/RequestAnimationFrameNotifyBatcher.ts @@ -11,15 +11,17 @@ import { NotifyFunction } from "redux-batched-subscribe" -let rafId: number = null +export const RequestAnimationFrameNotifyBatcher = () => { + let rafId: number = null -export const RequestAnimationFrameNotifyBatcher = (notify: NotifyFunction) => { - if (rafId) { - return - } + return (notify: NotifyFunction) => { + if (rafId) { + return + } - rafId = window.requestAnimationFrame(() => { - rafId = null - notify() - }) + rafId = window.requestAnimationFrame(() => { + rafId = null + notify() + }) + } } diff --git a/browser/src/Redux/createStore.ts b/browser/src/Redux/createStore.ts index d2338df866..064ac15c8e 100644 --- a/browser/src/Redux/createStore.ts +++ b/browser/src/Redux/createStore.ts @@ -25,7 +25,7 @@ export const createStore = (name: string, reducer: Reducer, defa const enhancer = composeEnhancers( applyMiddleware(...middleware), - batchedSubscribe(RequestAnimationFrameNotifyBatcher), + batchedSubscribe(RequestAnimationFrameNotifyBatcher()), ) return reduxCreateStore(reducer, defaultState, enhancer) } diff --git a/browser/src/UI/index.tsx b/browser/src/UI/index.tsx index 0105288b6a..0339d01d89 100644 --- a/browser/src/UI/index.tsx +++ b/browser/src/UI/index.tsx @@ -9,7 +9,7 @@ import * as React from "react" import * as ReactDOM from "react-dom" import { Provider } from "react-redux" -import { applyMiddleware, bindActionCreators, compose, createStore } from "redux" +import { bindActionCreators } from "redux" import thunk from "redux-thunk" import { Observable } from "rxjs/Observable" @@ -31,32 +31,13 @@ import { PluginManager } from "./../Plugins/PluginManager" import { NeovimEditor } from "./../Editor/NeovimEditor" -import { batchedSubscribe } from "redux-batched-subscribe" - -let rafId: any = null - -const rafUpdateBatcher = (notify: any) => { - if (rafId) { - return - } - - rafId = window.requestAnimationFrame(() => { - rafId = null - notify() - }) -} +import { createStore } from "./../Redux" const defaultState = State.createDefaultState() require("./components/common.less") // tslint:disable-line no-var-requires -const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"] || compose // tslint:disable-line no-string-literal -const enhancer = composeEnhancers( - applyMiddleware(thunk), - batchedSubscribe(rafUpdateBatcher), -) - -export const store = createStore(reducer, defaultState, enhancer) +export const store = createStore("SHELL", reducer, defaultState, [thunk]) const _state$: Subject = new Subject() export const state$: Observable = _state$ From eac2e4d7fd0ca517388d61cc0dad7e51540b59b3 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Mon, 27 Nov 2017 20:00:26 -0800 Subject: [PATCH 39/63] Fix regression in status bar loading (#1027) * Fix timing issue with statusbar * Fix timing issue with loading / initialization * Add identifiable classname for mode * Add test case for statusbar * Refactor out getElementByClassName, use in new test --- browser/src/Plugins/Plugin.ts | 12 +++++++----- browser/src/Plugins/PluginManager.ts | 9 ++++++++- browser/src/index.tsx | 10 +++++----- test/CiTests.ts | 1 + test/ci/Common.ts | 6 +++++- test/ci/StatusBar-Mode.ts | 21 +++++++++++++++++++++ vim/core/oni-core-statusbar/index.js | 2 +- 7 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 test/ci/StatusBar-Mode.ts diff --git a/browser/src/Plugins/Plugin.ts b/browser/src/Plugins/Plugin.ts index dc26d8cbd3..c3f60ac751 100644 --- a/browser/src/Plugins/Plugin.ts +++ b/browser/src/Plugins/Plugin.ts @@ -33,17 +33,19 @@ export class Plugin { Log.error(`[PLUGIN] Aborting plugin load, invalid package.json: ${packageJsonPath}`) } else { if (this._oniPluginMetadata.main) { - - this._oni = new Oni() - this._onActivate() - this._commands = PackageMetadataParser.getAllCommandsFromMetadata(this._oniPluginMetadata) } } } } - private _onActivate(): void { + public activate(): void { + + if (!this._oniPluginMetadata || !this._oniPluginMetadata.main) { + return + } + + this._oni = new Oni() const vm = require("vm") Log.info(`[PLUGIN] Activating: ${this._oniPluginMetadata.name}`) diff --git a/browser/src/Plugins/PluginManager.ts b/browser/src/Plugins/PluginManager.ts index 1f9533b9fb..7319458095 100644 --- a/browser/src/Plugins/PluginManager.ts +++ b/browser/src/Plugins/PluginManager.ts @@ -22,7 +22,7 @@ export class PluginManager extends EventEmitter { return this._plugins } - public startPlugins(): Oni.Plugin.Api { + public discoverPlugins(): void { this._rootPluginPaths.push(corePluginsRoot) @@ -37,6 +37,13 @@ export class PluginManager extends EventEmitter { this._plugins = allPluginPaths.map((pluginRootDirectory) => this._createPlugin(pluginRootDirectory)) this._anonymousPlugin = new AnonymousPlugin() + } + + public startApi(): Oni.Plugin.Api { + + this._plugins.forEach((plugin) => { + plugin.activate() + }) return this._anonymousPlugin.oni } diff --git a/browser/src/index.tsx b/browser/src/index.tsx index 21b71ce886..a8cafe0714 100644 --- a/browser/src/index.tsx +++ b/browser/src/index.tsx @@ -72,14 +72,14 @@ const start = (args: string[]) => { configChange(configuration.getValues()) // initialize values configuration.onConfigurationChanged.subscribe(configChange) - performance.mark("NeovimInstance.Plugins.Start") - const api = pluginManager.startPlugins() - performance.mark("NeovimInstance.Plugins.End") + performance.mark("NeovimInstance.Plugins.Discover.Start") + pluginManager.discoverPlugins() + performance.mark("NeovimInstance.Plugins.Discover.End") + UI.init(pluginManager, parsedArgs._) + const api = pluginManager.startApi() configuration.activate(api) - UI.init(pluginManager, parsedArgs._) - ipcRenderer.on("execute-command", (_evt: any, command: string) => { commandManager.executeCommand(command, null) }) diff --git a/test/CiTests.ts b/test/CiTests.ts index baa3f368a0..0fe2906676 100644 --- a/test/CiTests.ts +++ b/test/CiTests.ts @@ -14,6 +14,7 @@ const CiTests = [ "AutoCompletionTest-CSS", "AutoCompletionTest-TypeScript", "QuickOpenTest", + "StatusBar-Mode", "NoInstalledNeovim", ] diff --git a/test/ci/Common.ts b/test/ci/Common.ts index b7988e5930..77ec6d909a 100644 --- a/test/ci/Common.ts +++ b/test/ci/Common.ts @@ -3,8 +3,12 @@ */ export const getCompletionElement = () => { + return getElementByClassName("autocompletion") +} + +export const getElementByClassName = (className: string) => { - const elements = document.body.getElementsByClassName("autocompletion") + const elements = document.body.getElementsByClassName(className) if (!elements || !elements.length) { return null diff --git a/test/ci/StatusBar-Mode.ts b/test/ci/StatusBar-Mode.ts new file mode 100644 index 0000000000..60bc9ba62b --- /dev/null +++ b/test/ci/StatusBar-Mode.ts @@ -0,0 +1,21 @@ +/** + * Test scripts for StatusBar + * + * Validating the 'mode' UX element showsu p + */ + +import * as assert from "assert" +import * as path from "path" + +import { getElementByClassName } from "./Common" + +export const test = async (oni: any) => { + // Wait for completion popup to show + await oni.automation.waitFor(() => getElementByClassName("mode") !== null) + + // Check for 'alert' as an available completion + const statusBarModeElement = getElementByClassName("mode") + const textContent = statusBarModeElement.textContent + + assert.ok(textContent.indexOf("normal") >= 0, "Verify 'normal' was present in the statusbar mode item") +} diff --git a/vim/core/oni-core-statusbar/index.js b/vim/core/oni-core-statusbar/index.js index 549a01e5c0..608bb885ed 100644 --- a/vim/core/oni-core-statusbar/index.js +++ b/vim/core/oni-core-statusbar/index.js @@ -43,7 +43,7 @@ const activate = (Oni) => { backgroundColor: getColorForMode(mode) } - const modeElement = React.createElement("div", { style }, parseMode(mode)) + const modeElement = React.createElement("div", { style, className: "mode" }, parseMode(mode)) modeItem.setContents(modeElement) } From e8aa37e7d86f22393a212100690a24cb2384d40b Mon Sep 17 00:00:00 2001 From: Akin Date: Wed, 29 Nov 2017 00:33:27 +0000 Subject: [PATCH 40/63] Bugfix/quickopen sizing (#1030) * tweak right position to prevent flickering * add overflow rules to reveal any clipped text horizontally in quickfix * add conditional to prevent quickopen left side drift this is caused by a negative left position * extract left positioning ternary into separate function * revert canOpenDownward to arrangement on master * use Math.abs rather than convoluted ternary fn --- browser/src/UI/components/CursorPositioner.tsx | 11 +++++++++-- browser/src/UI/components/QuickInfo.less | 10 ++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/browser/src/UI/components/CursorPositioner.tsx b/browser/src/UI/components/CursorPositioner.tsx index a7189c94a2..ce9ed3dbab 100644 --- a/browser/src/UI/components/CursorPositioner.tsx +++ b/browser/src/UI/components/CursorPositioner.tsx @@ -150,8 +150,9 @@ export class CursorPositionerView extends React.PureComponent @@ -161,7 +162,13 @@ export class CursorPositionerView extends React.PureComponent
    - +
    } diff --git a/browser/src/UI/components/QuickInfo.less b/browser/src/UI/components/QuickInfo.less index 0f7b953cb6..f237f609d3 100644 --- a/browser/src/UI/components/QuickInfo.less +++ b/browser/src/UI/components/QuickInfo.less @@ -23,8 +23,18 @@ width: 100%; margin: 8px; white-space: pre; + overflow-x: hidden; + + &:hover { + overflow-x: overlay; + } + } + .title::-webkit-scrollbar { + height: 2px; + }; + .documentation { .box-shadow-inset; padding: 8px; From 906880c0ce6dcef8852adae9efe228f88fd31056 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Tue, 28 Nov 2017 17:12:54 -0800 Subject: [PATCH 41/63] #950 - `ui.colorscheme` setting (#975) * Start adding 'vim.colorscheme' setting * Start stubbing out ThemeManager * Add todo comments * Continue theming work * Refactor plugins * Move onedark * Add onedark package * Start wiring up themes / colorschemes * Synchronize color theme between vim <-> theme manager * Hook up subscriptions completely * Fix up lint issues * Update to use colors from package * Remove foreground & background, and generalize to colors * Finish merge * Start adding more colors to the onedark theme * Implement colors reconciler, along with loading colors from config * Add 'colors' concept and hook up status bar to respect the values * Fix menu and context menu highlight colors * Some code cleanup * Use the theme colors for onedark as mode colors * Fix highlight for context menu * Fix lint issues --- browser/src/Editor/KeyboardInput.tsx | 2 +- browser/src/Editor/NeovimEditor.tsx | 66 +++- browser/src/Editor/NeovimPopupMenu.tsx | 2 +- browser/src/Plugins/Api/Capabilities.ts | 33 +- browser/src/Plugins/Api/Oni.ts | 8 + browser/src/Plugins/PackageMetadataParser.ts | 64 ++-- browser/src/Plugins/Plugin.ts | 19 +- browser/src/Plugins/PluginManager.ts | 3 +- browser/src/Services/Colors.ts | 87 ++++++ .../Configuration/DefaultConfiguration.ts | 1 + .../Configuration/IConfigurationValues.ts | 1 + .../src/Services/ContextMenu/ContextMenu.tsx | 20 +- .../ContextMenu/ContextMenuComponent.tsx | 10 +- browser/src/Services/Language/Hover.tsx | 4 +- browser/src/Services/Menu/Menu.ts | 1 + .../src/Services/Menu/MenuActionCreators.ts | 8 +- browser/src/Services/Menu/MenuActions.ts | 1 + browser/src/Services/Menu/MenuState.ts | 2 + browser/src/Services/Themes/ThemeLoader.ts | 69 +++++ browser/src/Services/Themes/ThemeManager.ts | 290 ++++++++++++++++++ browser/src/Services/Themes/index.ts | 21 ++ browser/src/UI/ActionCreators.ts | 21 +- browser/src/UI/Actions.ts | 18 +- browser/src/UI/Colors.ts | 16 - browser/src/UI/Reducer.ts | 10 +- browser/src/UI/Selectors.ts | 5 - browser/src/UI/State.ts | 9 +- browser/src/UI/components/Background.tsx | 2 +- browser/src/UI/components/Cursor.tsx | 4 +- browser/src/UI/components/CursorLine.tsx | 2 +- .../src/UI/components/CursorPositioner.tsx | 6 +- browser/src/UI/components/LightweightText.tsx | 4 +- browser/src/UI/components/StatusBar.less | 2 - browser/src/UI/components/StatusBar.tsx | 6 + browser/src/UI/components/Tabs.tsx | 4 +- browser/src/UI/components/ToolTip.tsx | 18 +- .../src/UI/components/TypingPredictions.tsx | 4 +- .../src/UI/containers/DefinitionContainer.ts | 2 +- browser/src/index.tsx | 2 + browser/src/neovim/NeovimInstance.ts | 15 +- .../Plugins/PackageMetadataParserTests.ts | 109 ------- configuration/config.default.js | 3 + extensions/theme-onedark/colors/onedark.json | 42 +++ .../theme-onedark}/colors/onedark.vim | 0 extensions/theme-onedark/package.json | 19 ++ vim/core/oni-core-interop/plugin/init.vim | 1 + vim/core/oni-core-statusbar/index.js | 28 +- .../bundle/oni-vim-defaults/plugin/init.vim | 2 - yarn.lock | 4 +- 49 files changed, 790 insertions(+), 280 deletions(-) create mode 100644 browser/src/Services/Colors.ts create mode 100644 browser/src/Services/Themes/ThemeLoader.ts create mode 100644 browser/src/Services/Themes/ThemeManager.ts create mode 100644 browser/src/Services/Themes/index.ts delete mode 100644 browser/src/UI/Colors.ts delete mode 100644 browser/test/Plugins/PackageMetadataParserTests.ts create mode 100644 extensions/theme-onedark/colors/onedark.json rename {vim/core => extensions/theme-onedark}/colors/onedark.vim (100%) create mode 100644 extensions/theme-onedark/package.json diff --git a/browser/src/Editor/KeyboardInput.tsx b/browser/src/Editor/KeyboardInput.tsx index 111a5f314f..9072f9a953 100644 --- a/browser/src/Editor/KeyboardInput.tsx +++ b/browser/src/Editor/KeyboardInput.tsx @@ -222,7 +222,7 @@ const mapStateToProps = (state: IState, originalProps: IKeyboardInputProps): IKe top: state.cursorPixelY, left: state.cursorPixelX, height: state.fontPixelHeight, - foregroundColor: state.foregroundColor, + foregroundColor: state.colors["editor.foreground"], fontFamily: state.fontFamily, fontSize: state.fontSize, fontCharacterWidthInPixels: state.fontPixelWidth, diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 340a2fe82e..9933170f09 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -17,12 +17,15 @@ import { clipboard, ipcRenderer, remote } from "electron" import * as Oni from "oni-api" import { Event, IEvent } from "oni-types" +import * as Log from "./../Log" + import { EventContext, INeovimStartOptions, NeovimInstance, NeovimWindowManager } from "./../neovim" import { CanvasRenderer, INeovimRenderer } from "./../Renderer" import { NeovimScreen } from "./../Screen" import { pluginManager } from "./../Plugins/PluginManager" +import { Colors } from "./../Services/Colors" import { commandManager } from "./../Services/CommandManager" import { registerBuiltInCommands } from "./../Services/Commands" import { Completion } from "./../Services/Completion" @@ -30,6 +33,7 @@ import { configuration, IConfigurationValues } from "./../Services/Configuration import { Errors } from "./../Services/Errors" import { addInsertModeLanguageFunctionality, addNormalModeLanguageFunctionality } from "./../Services/Language" import { ISyntaxHighlighter, NullSyntaxHighlighter, SyntaxHighlighter } from "./../Services/SyntaxHighlighting" +import { getThemeManagerInstance } from "./../Services/Themes" import { TypingPredictionManager } from "./../Services/TypingPredictionManager" import { WindowTitle } from "./../Services/WindowTitle" import { workspace } from "./../Services/Workspace" @@ -55,6 +59,7 @@ export class NeovimEditor implements IEditor { private _renderer: INeovimRenderer private _screen: NeovimScreen private _popupMenu: NeovimPopupMenu + private _colors: Colors // TODO: Factor this out to the UI 'Shell' private _pendingAnimationFrame: boolean = false @@ -73,6 +78,7 @@ export class NeovimEditor implements IEditor { private _windowManager: NeovimWindowManager + private _currentColorScheme: string = "" private _isFirstRender: boolean = true private _lastBufferId: string = null @@ -125,6 +131,7 @@ export class NeovimEditor implements IEditor { constructor( private _config = configuration, + private _themeManager = getThemeManagerInstance(), ) { const services: any[] = [] @@ -132,6 +139,8 @@ export class NeovimEditor implements IEditor { this._bufferManager = new BufferManager(this._neovimInstance) this._screen = new NeovimScreen() + this._colors = new Colors(this._themeManager, this._config) + this._popupMenu = new NeovimPopupMenu( this._neovimInstance.onShowPopupMenu, this._neovimInstance.onHidePopupMenu, @@ -152,6 +161,11 @@ export class NeovimEditor implements IEditor { services.push(errorService) services.push(windowTitle) + this._colors.onColorsChanged.subscribe(() => { + const updatedColors: any = this._colors.getColors() + UI.Actions.setColors(updatedColors) + }) + // Overlays // TODO: Replace `OverlayManagement` concept and associated window management code with // explicit window management: #362 @@ -176,6 +190,10 @@ export class NeovimEditor implements IEditor { this._neovimInstance.on("event", (eventName: string, evt: any) => this._onVimEvent(eventName, evt)) + this._neovimInstance.onColorsChanged.subscribe(() => { + this._onColorsChanged() + }) + this._neovimInstance.onError.subscribe((err) => { UI.Actions.setNeovimError(true) }) @@ -192,7 +210,6 @@ export class NeovimEditor implements IEditor { }) this._neovimInstance.onRedrawComplete.subscribe(() => { - UI.Actions.setColors(this._screen.foregroundColor, this._screen.backgroundColor) UI.Actions.setCursorPosition(this._screen) this._typingPredictionManager.setCursorPosition(this._screen.cursorRow, this._screen.cursorColumn) }) @@ -297,6 +314,11 @@ export class NeovimEditor implements IEditor { this._syntaxHighlighter = null } + if (this._colors) { + this._colors.dispose() + this._colors = null + } + if (this._completion) { this._completion.dispose() this._completion = null @@ -319,18 +341,33 @@ export class NeovimEditor implements IEditor { commandManager.executeCommand(command, null) } - public init(filesToOpen: string[]): void { + public async init(filesToOpen: string[]): Promise { const startOptions: INeovimStartOptions = { args: filesToOpen, runtimePaths: pluginManager.getAllRuntimePaths(), transport: configuration.getValue("experimental.neovim.transport"), } - this._neovimInstance.start(startOptions) - .then(() => { - this._hasLoaded = true - VimConfigurationSynchronizer.synchronizeConfiguration(this._neovimInstance, this._config.getValues()) - }) + await this._neovimInstance.start(startOptions) + VimConfigurationSynchronizer.synchronizeConfiguration(this._neovimInstance, this._config.getValues()) + + this._themeManager.onThemeChanged.subscribe(() => { + const newTheme = this._themeManager.activeTheme + + if (newTheme.baseVimTheme && newTheme.baseVimTheme !== this._currentColorScheme) { + this._neovimInstance.command(":color " + newTheme.baseVimTheme) + UI.Actions.setColors(this._themeManager.getColors()) + } + }) + + if (this._themeManager.activeTheme && this._themeManager.activeTheme.baseVimTheme) { + await this._neovimInstance.command(":color " + this._themeManager.activeTheme.baseVimTheme) + UI.Actions.setColors(this._themeManager.getColors()) + } + + this._hasLoaded = true + this._isFirstRender = true + this._scheduleRender() } public render(): JSX.Element { @@ -439,6 +476,21 @@ export class NeovimEditor implements IEditor { this._scheduleRender() } + private async _onColorsChanged(): Promise { + const newColorScheme = await this._neovimInstance.eval("g:colors_name") + this._currentColorScheme = newColorScheme + const backgroundColor = this._screen.backgroundColor + const foregroundColor = this._screen.foregroundColor + + Log.info(`[NeovimEditor] Colors changed: ${newColorScheme} - background: ${backgroundColor} foreground: ${foregroundColor}`) + + this._themeManager.notifyVimThemeChanged(newColorScheme, backgroundColor, foregroundColor) + + // Flip first render to force a full redraw + this._isFirstRender = true + this._scheduleRender() + } + private _scheduleRender(): void { if (this._pendingAnimationFrame) { return diff --git a/browser/src/Editor/NeovimPopupMenu.tsx b/browser/src/Editor/NeovimPopupMenu.tsx index 3ba8340f9e..930bb91600 100644 --- a/browser/src/Editor/NeovimPopupMenu.tsx +++ b/browser/src/Editor/NeovimPopupMenu.tsx @@ -62,7 +62,7 @@ export class NeovimPopupMenu { adjustedIndex = itemsToRender.length - 1 } - const completionElement = + const completionElement = UI.Actions.showToolTip("nvim-popup", completionElement, { position: null, openDirection: 2, diff --git a/browser/src/Plugins/Api/Capabilities.ts b/browser/src/Plugins/Api/Capabilities.ts index e700ac4773..45aaeb6454 100644 --- a/browser/src/Plugins/Api/Capabilities.ts +++ b/browser/src/Plugins/Api/Capabilities.ts @@ -9,33 +9,30 @@ * `immediate` means the plugin will be executed at startup, * `on-demand` means the plugin will be executed when it encounters a command or event it can handle */ -export type ActivationMode = "immediate" | "on-demand" +export interface IContributions { + commands: ICommandContribution[] + themes: IThemeContribution[] +} -export interface Capabilities { - commands?: { [commandName: string]: ICommandInfo } +export const DefaultContributions: IContributions = { + commands: [], + themes: [], } -export interface ICommandInfo { - name: string - details: string +export interface ICommandContribution { + command: string /* ie, myExtension.myCommand */ + title: string /* My Extension Command */ + category: string /* Testing */ } -/** - * Interface describing - */ -export interface IPluginFilter { - fileType: string - requiredCapabilities: Capabilities +export interface IThemeContribution { + name: string + path: string } export interface IPluginMetadata { name: string main: string engines: any - oni: IPluginCapabilities -} - -export interface IPluginCapabilities extends Capabilities { - activationMode?: ActivationMode - supportedFileTypes?: string[] + contributes: IContributions } diff --git a/browser/src/Plugins/Api/Oni.ts b/browser/src/Plugins/Api/Oni.ts index 625f7c8fd4..4f3a8f3de7 100644 --- a/browser/src/Plugins/Api/Oni.ts +++ b/browser/src/Plugins/Api/Oni.ts @@ -17,6 +17,7 @@ import { Services } from "./Services" import { Ui } from "./Ui" import { automation } from "./../../Services/Automation" +import { Colors } from "./../../Services/Colors" import { commandManager } from "./../../Services/CommandManager" import { configuration } from "./../../Services/Configuration" import { contextMenuManager } from "./../../Services/ContextMenu" @@ -26,6 +27,7 @@ import { languageManager } from "./../../Services/Language" import { menuManager } from "./../../Services/Menu" import { recorder } from "./../../Services/Recorder" import { statusBar } from "./../../Services/StatusBar" +import { getThemeManagerInstance } from "./../../Services/Themes" import { windowManager, WindowManager } from "./../../Services/WindowManager" import { workspace } from "./../../Services/Workspace" @@ -54,11 +56,16 @@ export class Oni extends EventEmitter implements OniApi.Plugin.Api { private _diagnostics: OniApi.Plugin.Diagnostics.Api private _ui: Ui private _services: Services + private _colors: Colors public get automation(): OniApi.Automation.Api { return automation } + public get colors(): Colors /* TODO: Promote to API */ { + return this._colors + } + public get commands(): OniApi.Commands { return commandManager } @@ -133,6 +140,7 @@ export class Oni extends EventEmitter implements OniApi.Plugin.Api { constructor() { super() + this._colors = new Colors(getThemeManagerInstance(), configuration) this._diagnostics = new Diagnostics() this._dependencies = new Dependencies() diff --git a/browser/src/Plugins/PackageMetadataParser.ts b/browser/src/Plugins/PackageMetadataParser.ts index e0f70aee0d..bdbde465b6 100644 --- a/browser/src/Plugins/PackageMetadataParser.ts +++ b/browser/src/Plugins/PackageMetadataParser.ts @@ -4,50 +4,54 @@ * Responsible for parsing and normalizing package.json for ONI plugins */ -import * as keys from "lodash/keys" +import * as fs from "fs" +import * as path from "path" import * as Capabilities from "./Api/Capabilities" import * as Log from "./../Log" -export const PluginDefaults: Partial = { - commands: {}, - activationMode: "on-demand", -} - -export const parseFromString = (packageJson: string): Capabilities.IPluginMetadata | null => { - const metadata: Capabilities.IPluginMetadata = JSON.parse(packageJson) +const remapToAbsolutePaths = (packageRoot: string, contributes: Capabilities.IContributions): Capabilities.IContributions => { + const remapThemePath = (themes: Capabilities.IThemeContribution): Capabilities.IThemeContribution => { + return { + ...themes, + path: path.join(packageRoot, themes.path), + } + } - if (!metadata.engines || !metadata.engines["oni"]) { // tslint:disable-line no-string-literal - Log.warn("Aborting plugin load as Oni engine version not specified") - return null + return { + ...contributes, + themes: contributes.themes.map((t) => remapThemePath(t)), } +} - const pluginData = metadata.oni || {} +export const readMetadata = (packagePath: string): Capabilities.IPluginMetadata | null => { - metadata.oni = { - ...PluginDefaults, - ...pluginData, - } + const packageContents = fs.readFileSync(packagePath, "utf8") - return metadata -} + let metadata: Capabilities.IPluginMetadata = null + try { + metadata = JSON.parse(packageContents) as Capabilities.IPluginMetadata + } catch (ex) { + Log.error(ex) + } -export const getAllCommandsFromMetadata = (metadata: Capabilities.IPluginMetadata) => { - if (!metadata || !metadata.oni) { - return [] + if (!metadata) { + return null } - const commands = metadata.oni.commands + if (!metadata.engines || !metadata.engines["oni"]) { // tslint:disable-line no-string-literal + Log.warn("Aborting plugin load as Oni engine version not specified") + return null + } - if (!commands) { - return [] + const contributes = { + ...Capabilities.DefaultContributions, + ...metadata.contributes, } - const commandNames = keys(commands) - return commandNames.map((command) => ({ - command, - name: commands[command].name, - details: commands[command].details, - })) + return { + ...metadata, + contributes: remapToAbsolutePaths(path.dirname(packagePath), contributes), + } } diff --git a/browser/src/Plugins/Plugin.ts b/browser/src/Plugins/Plugin.ts index c3f60ac751..51b490101a 100644 --- a/browser/src/Plugins/Plugin.ts +++ b/browser/src/Plugins/Plugin.ts @@ -8,17 +8,12 @@ import { Oni } from "./Api/Oni" import * as PackageMetadataParser from "./PackageMetadataParser" -export interface IPluginCommandInfo extends Capabilities.ICommandInfo { - command: string -} - export class Plugin { private _oniPluginMetadata: Capabilities.IPluginMetadata - private _commands: IPluginCommandInfo[] private _oni: Oni - public get commands(): IPluginCommandInfo[] { - return this._commands + public get metadata(): Capabilities.IPluginMetadata { + return this._oniPluginMetadata } constructor( @@ -27,15 +22,7 @@ export class Plugin { const packageJsonPath = path.join(this._pluginRootDirectory, "package.json") if (fs.existsSync(packageJsonPath)) { - this._oniPluginMetadata = PackageMetadataParser.parseFromString(fs.readFileSync(packageJsonPath, "utf8")) - - if (!this._oniPluginMetadata) { - Log.error(`[PLUGIN] Aborting plugin load, invalid package.json: ${packageJsonPath}`) - } else { - if (this._oniPluginMetadata.main) { - this._commands = PackageMetadataParser.getAllCommandsFromMetadata(this._oniPluginMetadata) - } - } + this._oniPluginMetadata = PackageMetadataParser.readMetadata(packageJsonPath) } } diff --git a/browser/src/Plugins/PluginManager.ts b/browser/src/Plugins/PluginManager.ts index 7319458095..d02f4e07fb 100644 --- a/browser/src/Plugins/PluginManager.ts +++ b/browser/src/Plugins/PluginManager.ts @@ -11,6 +11,7 @@ import { Plugin } from "./Plugin" const corePluginsRoot = path.join(__dirname, "vim", "core") const defaultPluginsRoot = path.join(__dirname, "vim", "default") +const extensionsRoot = path.join(__dirname, "extensions") export class PluginManager extends EventEmitter { private _config = configuration @@ -23,8 +24,8 @@ export class PluginManager extends EventEmitter { } public discoverPlugins(): void { - this._rootPluginPaths.push(corePluginsRoot) + this._rootPluginPaths.push(extensionsRoot) if (this._config.getValue("oni.useDefaultConfig")) { this._rootPluginPaths.push(defaultPluginsRoot) diff --git a/browser/src/Services/Colors.ts b/browser/src/Services/Colors.ts new file mode 100644 index 0000000000..0cbf4ef467 --- /dev/null +++ b/browser/src/Services/Colors.ts @@ -0,0 +1,87 @@ +/** + * Colors + * + * - Rationalizes colors from both the active theme and configuration + * - The 'source of truth' for colors in Oni + * - Also will handle 'fallback logic' for colors + */ + +import { Event, IDisposable, IEvent } from "oni-types" + +import { configuration, Configuration, IConfigurationValues } from "./Configuration" +import { getThemeManagerInstance, ThemeManager } from "./Themes" + +export interface ColorsDictionary { [colorName: string]: string} + +export class Colors implements IDisposable { + + private _subscriptions: IDisposable[] = [] + private _colors: ColorsDictionary = {} + private _onColorsChangedEvent: Event = new Event() + + public get onColorsChanged(): IEvent { + return this._onColorsChangedEvent + } + + constructor( + private _themeManager: ThemeManager = getThemeManagerInstance(), + private _configuration: Configuration = configuration, + ) { + + const sub1 = this._themeManager.onThemeChanged.subscribe(() => { + this._updateColorsFromConfig() + }) + + const sub2 = this._configuration.onConfigurationChanged.subscribe((newValues: Partial) => { + + const anyColorsChanged = Object.keys(newValues).filter((color) => color.indexOf("colors.") >= 0) + + if (anyColorsChanged.length > 0) { + this._updateColorsFromConfig() + } + }) + + this._subscriptions = [sub1, sub2] + this._updateColorsFromConfig() + } + + public getColors(): ColorsDictionary { + return this._colors + } + + public getColor(colorName: string): string | null { + return this._colors[colorName] || null + } + + public dispose(): void { + if (this._subscriptions && this._subscriptions.length) { + this._subscriptions.forEach((disposable) => disposable.dispose()) + this._subscriptions = null + } + } + + private _updateColorsFromConfig(): void { + + if (!this._themeManager.activeTheme) { + return + } + + const currentThemeColors = this._themeManager.getColors() + this._colors = {} + + Object.keys(currentThemeColors).forEach((themeColor) => { + + const configurationName = this._getConfigurationNameForColor(themeColor) + + const colorFromConfiguration = this._configuration.getValue(configurationName) + + this._colors[themeColor] = colorFromConfiguration ? colorFromConfiguration : currentThemeColors[themeColor] + }) + + this._onColorsChangedEvent.dispatch() + } + + private _getConfigurationNameForColor(colorName: string): string { + return "colors." + colorName + } +} diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index eb029bd6e9..1074337007 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -176,6 +176,7 @@ const BaseConfiguration: IConfigurationValues = { "tabs.wrap": false, "ui.animations.enabled": true, + "ui.colorscheme": "onedark", "ui.fontFamily": "BlinkMacSystemFont, 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif", "ui.fontSize": "13px", } diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index 8a15d5abad..559648a152 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -183,6 +183,7 @@ export interface IConfigurationValues { "tabs.wrap": boolean "ui.animations.enabled": boolean + "ui.colorscheme": string "ui.fontFamily": string "ui.fontSize": string diff --git a/browser/src/Services/ContextMenu/ContextMenu.tsx b/browser/src/Services/ContextMenu/ContextMenu.tsx index 621fe049d9..fbaf78fc01 100644 --- a/browser/src/Services/ContextMenu/ContextMenu.tsx +++ b/browser/src/Services/ContextMenu/ContextMenu.tsx @@ -137,12 +137,28 @@ export class ContextMenu { } public show(items?: any[], filter?: string): void { + + const state: any = UI.store.getState() + + const backgroundColor = state.colors["contextMenu.background"] + const foregroundColor = state.colors["contextMenu.foreground"] + const borderColor = state.colors["contextMenu.border"] || backgroundColor + const highlightColor = state.colors["contextMenu.highlight"] || backgroundColor + + const colors = { + backgroundColor, + foregroundColor, + borderColor, + highlightColor, + } + contextMenuActions.showPopupMenu(this._id, { + ...colors, onSelectedItemChanged: (item: any) => this._onSelectedItemChanged.dispatch(item), onSelectItem: (idx: number) => this._onItemSelectedHandler(idx), onHide: () => this._onHidden(), - onFilterTextChanged: (newText) => this._onFilterTextChanged.dispatch(newText), - }, items, filter) + onFilterTextChanged: (newText: string) => this._onFilterTextChanged.dispatch(newText), + } as any, items, filter) UI.Actions.showToolTip(this._getContextMenuId(), , { openDirection: 2, diff --git a/browser/src/Services/ContextMenu/ContextMenuComponent.tsx b/browser/src/Services/ContextMenu/ContextMenuComponent.tsx index 6cc44ccd46..3bfeff055b 100644 --- a/browser/src/Services/ContextMenu/ContextMenuComponent.tsx +++ b/browser/src/Services/ContextMenu/ContextMenuComponent.tsx @@ -12,7 +12,6 @@ import * as Oni from "oni-api" import { IMenus } from "./../Menu/MenuState" -import * as Colors from "./../../UI/Colors" import { Arrow, ArrowDirection } from "./../../UI/components/Arrow" import { HighlightText } from "./../../UI/components/HighlightText" import { Icon } from "./../../UI/Icon" @@ -34,6 +33,8 @@ export interface IContextMenuProps { backgroundColor: string foregroundColor: string + borderColor: string + highlightColor: string } require("./ContextMenu.less") // tslint:disable-line no-var-requires @@ -46,14 +47,13 @@ export class ContextMenuView extends React.PureComponent return null } - const highlightColor = Colors.getBorderColor(this.props.backgroundColor, this.props.foregroundColor) // TODO: sync max display items (10) with value in Reducer.autoCompletionReducer() (Reducer.ts) const firstTenEntries = take(this.props.entries, 10) const entries = firstTenEntries.map((s, i) => { const isSelected = i === this.props.selectedIndex - return + return }) const selectedItemDocumentation = getDocumentationFromItems(firstTenEntries, this.props.selectedIndex) @@ -137,6 +137,8 @@ const EmptyProps = { selectedIndex: 0, backgroundColor: "", foregroundColor: "", + borderColor: "", + highlightColor: "", } const mapStateToProps = (state: IMenus) => { @@ -151,6 +153,8 @@ const mapStateToProps = (state: IMenus 0) { diff --git a/browser/src/Services/Menu/Menu.ts b/browser/src/Services/Menu/Menu.ts index 9f8dce1a2c..23ed8395c8 100644 --- a/browser/src/Services/Menu/Menu.ts +++ b/browser/src/Services/Menu/Menu.ts @@ -99,6 +99,7 @@ export class Menu { } public show(): void { + menuActions.showPopupMenu(this._id, { onSelectItem: (idx: number) => this._onItemSelectedHandler(idx), onHide: () => this._onHide.dispatch(), diff --git a/browser/src/Services/Menu/MenuActionCreators.ts b/browser/src/Services/Menu/MenuActionCreators.ts index 890ebecc2a..96dd28c701 100644 --- a/browser/src/Services/Menu/MenuActionCreators.ts +++ b/browser/src/Services/Menu/MenuActionCreators.ts @@ -26,11 +26,17 @@ const notifySelectedItemChange = (contextMenuState: any) => { export const showPopupMenu = (id: string, opts?: MenuActions.IMenuOptions, items?: any, filter?: string) => { - const { backgroundColor, foregroundColor } = UI.store.getState() as any + const state: any = UI.store.getState() + const backgroundColor = state.colors["menu.background"] + const foregroundColor = state.colors["menu.foreground"] + const borderColor = state.colors["menu.border"] || backgroundColor + const highlightColor = state.colors["menu.highlight"] || backgroundColor const defaultOptions = { backgroundColor, foregroundColor, + borderColor, + highlightColor, } const options = { diff --git a/browser/src/Services/Menu/MenuActions.ts b/browser/src/Services/Menu/MenuActions.ts index 189b2fc7ad..4add5a9a25 100644 --- a/browser/src/Services/Menu/MenuActions.ts +++ b/browser/src/Services/Menu/MenuActions.ts @@ -7,6 +7,7 @@ export interface IMenuOptions { foregroundColor?: string backgroundColor?: string + highlightColor?: string onSelectedItemChanged?: (newItem: any) => void onSelectItem?: (idx: number) => void onHide?: () => void diff --git a/browser/src/Services/Menu/MenuState.ts b/browser/src/Services/Menu/MenuState.ts index 10293f7639..265f7445bc 100644 --- a/browser/src/Services/Menu/MenuState.ts +++ b/browser/src/Services/Menu/MenuState.ts @@ -19,6 +19,8 @@ export interface IMenu { backgroundColor: string foregroundColor: string + borderColor: string + highlightColor: string onFilterTextChanged: (newText: string) => void onSelectedItemChanged: (newItem: FilteredT) => void diff --git a/browser/src/Services/Themes/ThemeLoader.ts b/browser/src/Services/Themes/ThemeLoader.ts new file mode 100644 index 0000000000..36e950a44b --- /dev/null +++ b/browser/src/Services/Themes/ThemeLoader.ts @@ -0,0 +1,69 @@ +/** + * ThemeLoader + * + * - Manages loading of themes + */ + +import * as fs from "fs" + +import { DefaultTheme, IThemeMetadata } from "./ThemeManager" + +import { IThemeContribution } from "./../../Plugins/Api/Capabilities" +import { pluginManager, PluginManager } from "./../../Plugins/PluginManager" + +export interface IThemeLoader { + getThemeByName(name: string): Promise +} + +export class DefaultLoader implements IThemeLoader { + public async getThemeByName(name: string): Promise { + return DefaultTheme + } +} + +export class PluginThemeLoader implements IThemeLoader { + + constructor( + private _pluginManager: PluginManager = pluginManager, + ) { } + + public async getThemeByName(name: string): Promise { + + const plugins = this._pluginManager.plugins + + const pluginsWithThemes = plugins.filter((p) => { + return p.metadata && p.metadata.contributes && p.metadata.contributes.themes + }) + + const allThemes = pluginsWithThemes.reduce((previous: IThemeContribution[], current) => { + const themes = current.metadata.contributes.themes + return [ + ...previous, + ...themes, + ] + }, [] as IThemeContribution[]) + + const matchingTheme = allThemes.find((t) => t.name === name) + + if (!matchingTheme || !matchingTheme.path) { + return null + } + + return this._loadThemeFromFile(matchingTheme.path) + } + + private async _loadThemeFromFile(themeJsonPath: string): Promise { + const contents = await new Promise((resolve, reject) => { + fs.readFile(themeJsonPath, "utf8", (err, data: string) => { + if (err) { + reject(err) + return + } + + resolve(data) + }) + }) + + return JSON.parse(contents) as IThemeMetadata + } +} diff --git a/browser/src/Services/Themes/ThemeManager.ts b/browser/src/Services/Themes/ThemeManager.ts new file mode 100644 index 0000000000..6992a8e59f --- /dev/null +++ b/browser/src/Services/Themes/ThemeManager.ts @@ -0,0 +1,290 @@ +/** + * ThemeManager + * + * - Manages theming + */ + +import { Event, IEvent } from "oni-types" + +import { PluginThemeLoader } from "./ThemeLoader" + +export interface IThemeColors { + "background": string + "foreground": string + "editor.background": string + "editor.foreground": string + + "highlight.mode.insert.foreground": string + "highlight.mode.insert.background": string + + "highlight.mode.normal.foreground": string + "highlight.mode.normal.background": string + + "highlight.mode.visual.foreground": string + "highlight.mode.visual.background": string + + "highlight.mode.operator.foreground": string + "highlight.mode.operator.background": string + + "tabs.background": string + "tabs.foreground": string + + // Tool tip is used for some contextual information, + // like hover, as well as for rename. + "toolTip.background": string + "toolTip.foreground": string + "toolTip.border": string + + // Context menu is used for completion, refactoring + "contextMenu.background": string + "contextMenu.foreground": string + "contextMenu.border": string + "contextMenu.highlight": string + + // Menu is used for the popup menu + "menu.background": string + "menu.foreground": string + "menu.border": string + "menu.highlight": string + + "statusBar.background": string + "statusBar.foreground": string + + "sidebar.background": string + "sidebar.foreground": string + + "fileExplorer.background": string + "fileExplorer.foreground": string + "fileExplorer.selection.background": string + "fileExplorer.selection.foreground": string + "fileExplorer.cursor.background": string + "fileExplorer.cursor.foreground": string + + // LATER: + // - Notifications? + // - Alert / message? +} + +import * as Color from "color" + +/** + * Gets a reasonable border color for popup elements, based on popups + */ +export const getBorderColor = (bgColor: string, fgColor: string): string => { + const backgroundColor = Color(bgColor) + const foregroundColor = Color(fgColor) + + const borderColor = backgroundColor.luminosity() > 0.5 ? foregroundColor.lighten(0.6) : foregroundColor.darken(0.6) + return borderColor.rgb().toString() +} + +export const getColorsFromBackgroundAndForeground = (background: string, foreground: string) => { + const borderColor = getBorderColor(background, foreground) + return { + ...DefaultThemeColors, + "background": background, + "foreground": foreground, + "editor.background": background, + "editor.foreground": foreground, + + "toolTip.background": background, + "toolTip.foreground": foreground, + "toolTip.border": borderColor, + + "tabs.background": background, + "tabs.foreground": foreground, + + // Context menu is used for completion, refactoring + "contextMenu.background": background, + "contextMenu.foreground": foreground, + "contextMenu.border": borderColor, + "contextMenu.highlight": borderColor, + + // Menu is used for the popup menu + "menu.background": background, + "menu.foreground": foreground, + "menu.border": borderColor, + } +} + +const ColorBlack = "black" +const ColorWhite = "white" + +const InsertMode = "#00c864" +const OperatorMode = "#ff6400" +const NormalMode = "#0064ff" + +const HighlightForeground = "#dcdcdc" + +const StatusBarBackground = "#282828" +const StatusBarForeground = "#c8c8c8" + +export const DefaultThemeColors: IThemeColors = { + "background": ColorBlack, + "foreground": ColorWhite, + + "editor.background": ColorBlack, + "editor.foreground": ColorWhite, + + "highlight.mode.insert.foreground": HighlightForeground, + "highlight.mode.insert.background": InsertMode, + + "highlight.mode.normal.foreground": HighlightForeground, + "highlight.mode.normal.background": NormalMode, + + "highlight.mode.visual.foreground": HighlightForeground, + "highlight.mode.visual.background": NormalMode, + + "highlight.mode.operator.foreground": HighlightForeground, + "highlight.mode.operator.background": OperatorMode, + + // Tool tip is used for some contextual information, + // like hover, as well as for rename. + "toolTip.background": ColorBlack, + "toolTip.foreground": ColorWhite, + "toolTip.border": ColorWhite, + + // Context menu is used for completion, refactoring + "contextMenu.background": ColorBlack, + "contextMenu.foreground": ColorBlack, + "contextMenu.border": ColorWhite, + "contextMenu.highlight": ColorBlack, + + // Menu is used for the popup menu + "menu.background": ColorBlack, + "menu.foreground": ColorBlack, + "menu.border": ColorWhite, + "menu.highlight": ColorBlack, + + "statusBar.background": StatusBarBackground, + "statusBar.foreground": StatusBarForeground, + + "sidebar.background": StatusBarBackground, + "sidebar.foreground": StatusBarForeground, + + "tabs.background": ColorBlack, + "tabs.foreground": ColorWhite, + + "fileExplorer.background": StatusBarBackground, + "fileExplorer.foreground": StatusBarForeground, + "fileExplorer.selection.background": NormalMode, + "fileExplorer.selection.foreground": HighlightForeground, + "fileExplorer.cursor.background": NormalMode, + "fileExplorer.cursor.foreground": NormalMode, +} + +// export interface ITokenTheme { +// name: string +// scope: string[] +// settings: ITokenColorSettings +// } + +// export interface ITokenColorSettings { +// background?: string +// foreground?: string + +// bold: boolean +// italic: boolean +// } + +export interface IThemeMetadata { + name: string + baseVimTheme?: string + colors: Partial + // tokenColors: ITokenTheme[] +} + +export const DefaultTheme: IThemeMetadata = { + name: "default", + baseVimTheme: "default", + colors: DefaultThemeColors, + // tokenColors: [], +} + +export class ThemeManager { + private _onThemeChangedEvent: Event = new Event() + + private _activeTheme: IThemeMetadata = DefaultTheme + + private _isAnonymousTheme: boolean = false + + // _colors stores the current theme colors mixed with configuration + private _colors: IThemeColors = DefaultThemeColors + + public get activeTheme(): IThemeMetadata { + return this._activeTheme + } + + public async setTheme(name: string): Promise { + // TODO: Load theme... + if (!name || name === this._activeTheme.name) { + return + } + + const themeLoader = new PluginThemeLoader() + + const theme = await themeLoader.getThemeByName(name) + + if (!theme) { + // If we couldn't find the theme... we'll try + // loading vim-style, and derive a theme from + // that. + this._isAnonymousTheme = true + + const temporaryVimTheme = { + name, + baseVimTheme: name, + colors: DefaultThemeColors, + } + + this._updateTheme(temporaryVimTheme) + } else { + this._updateTheme(theme) + } + } + + public notifyVimThemeChanged(vimName: string, backgroundColor: string, foregroundColor: string): void { + + // If the vim colorscheme changed, for example, via `:co `, + // then we should update our theme to match + if (this._isAnonymousTheme || (this._activeTheme.baseVimTheme && this._activeTheme.baseVimTheme !== vimName && this._activeTheme.baseVimTheme !== "*")) { + this._isAnonymousTheme = false + + const vimTheme: IThemeMetadata = { + name: vimName, + baseVimTheme: vimName, + colors: getColorsFromBackgroundAndForeground(backgroundColor, foregroundColor), + } + + this._updateTheme(vimTheme) + } + } + + public get onThemeChanged(): IEvent { + return this._onThemeChangedEvent + } + + public getColors(): IThemeColors { + return this._colors + } + + private _updateTheme(theme: IThemeMetadata): void { + this._activeTheme = theme + + this._colors = { + ...DefaultThemeColors, + ...this._activeTheme.colors, + } + + this._onThemeChangedEvent.dispatch() + } +} + +let _themeManager: ThemeManager = null +export const getThemeManagerInstance = () => { + if (!_themeManager) { + _themeManager = new ThemeManager() + } + + return _themeManager +} diff --git a/browser/src/Services/Themes/index.ts b/browser/src/Services/Themes/index.ts new file mode 100644 index 0000000000..a648f6684a --- /dev/null +++ b/browser/src/Services/Themes/index.ts @@ -0,0 +1,21 @@ +export * from "./ThemeManager" + +import { Configuration, IConfigurationValues } from "./../Configuration" +import { getThemeManagerInstance } from "./ThemeManager" + +export const activate = (configuration: Configuration) => { + + const updateColorScheme = (configurationValues: Partial) => { + const colorscheme = configurationValues["ui.colorscheme"] + if (colorscheme) { + const themeManager = getThemeManagerInstance() + themeManager.setTheme(colorscheme) + } + } + + configuration.onConfigurationChanged.subscribe((newValues: Partial) => { + updateColorScheme(newValues) + }) + + updateColorScheme(configuration.getValues()) +} diff --git a/browser/src/UI/ActionCreators.ts b/browser/src/UI/ActionCreators.ts index 34823f7059..c315cbcbc5 100644 --- a/browser/src/UI/ActionCreators.ts +++ b/browser/src/UI/ActionCreators.ts @@ -26,10 +26,18 @@ import { IScreen } from "./../Screen" import { normalizePath } from "./../Utility" import { IConfigurationValues } from "./../Services/Configuration" +import { IThemeColors } from "./../Services/Themes" export type DispatchFunction = (action: any) => void export type GetStateFunction = () => State.IState +export const setColors = (colors: IThemeColors) => ({ + type: "SET_COLORS", + payload: { + colors, + }, +}) + export const setNeovimError = (neovimError: boolean) => ({ type: "SET_NEOVIM_ERROR", payload: { @@ -235,14 +243,6 @@ export const setCursorPosition = (screen: IScreen) => (dispatch: DispatchFunctio $setCursorPosition.next(_setCursorPosition(screen.cursorColumn * screen.fontWidthInPixels, screen.cursorRow * screen.fontHeightInPixels, screen.fontWidthInPixels, screen.fontHeightInPixels, cell.character, cell.characterWidth * screen.fontWidthInPixels).payload) } -export const setColors = (foregroundColor: string, backgroundColor: string) => (dispatch: DispatchFunction, getState: GetStateFunction) => { - if (foregroundColor === getState().foregroundColor && backgroundColor === getState().backgroundColor) { - return - } - - dispatch(_setColors(foregroundColor, backgroundColor)) -} - export const setMode = (mode: string) => ({ type: "SET_MODE", payload: { mode }, @@ -295,8 +295,3 @@ const _setCursorPosition = (cursorPixelX: any, cursorPixelY: any, fontPixelWidth cursorPixelWidth, }, }) - -const _setColors = (foregroundColor: string, backgroundColor: string) => ({ - type: "SET_COLORS", - payload: { foregroundColor, backgroundColor }, -}) diff --git a/browser/src/UI/Actions.ts b/browser/src/UI/Actions.ts index e160109cc6..261d729237 100644 --- a/browser/src/UI/Actions.ts +++ b/browser/src/UI/Actions.ts @@ -14,9 +14,17 @@ import { IMessageDialog, ITab, StatusBarAlignment } from "./State" import { Rectangle } from "./Types" import { IConfigurationValues } from "./../Services/Configuration" +import { IThemeColors } from "./../Services/Themes" import * as types from "vscode-languageserver-types" +export interface ISetColorsAction { + type: "SET_COLORS", + payload: { + colors: IThemeColors, + } +} + export interface ISetViewportAction { type: "SET_VIEWPORT", payload: { @@ -197,14 +205,6 @@ export interface ISetModeAction { } } -export interface ISetColorsAction { - type: "SET_COLORS", - payload: { - foregroundColor: string, - backgroundColor: string, - } -} - export interface IShowDefinitionAction { type: "SHOW_DEFINITION", payload: { @@ -232,6 +232,7 @@ export type SimpleAction = IBufferEnterAction | IBufferSaveAction | IBufferUpdateAction | + ISetColorsAction | ISetCursorPositionAction | ISetImeActive | ISetFont | @@ -243,7 +244,6 @@ export type SimpleAction = IShowDefinitionAction | ISetModeAction | ISetCursorScaleAction | - ISetColorsAction | IStatusBarHideAction | IStatusBarShowAction | ISetErrorsAction | diff --git a/browser/src/UI/Colors.ts b/browser/src/UI/Colors.ts deleted file mode 100644 index 9f2e153917..0000000000 --- a/browser/src/UI/Colors.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Helper utilities for manipulating colors - */ - -import * as Color from "color" - -/** - * Gets a reasonable border color for popup elements, based on popups - */ -export const getBorderColor = (bgColor: string, fgColor: string): string => { - const backgroundColor = Color(bgColor) - const foregroundColor = Color(fgColor) - - const borderColor = backgroundColor.luminosity() > 0.5 ? foregroundColor.lighten(0.6) : foregroundColor.darken(0.6) - return borderColor.rgb().toString() -} diff --git a/browser/src/UI/Reducer.ts b/browser/src/UI/Reducer.ts index 6918c65754..10023a1c31 100644 --- a/browser/src/UI/Reducer.ts +++ b/browser/src/UI/Reducer.ts @@ -21,6 +21,11 @@ export function reducer(s: State.IState, a } switch (a.type) { + case "SET_COLORS": + return { + ...s, + colors: a.payload.colors, + } case "SET_NEOVIM_ERROR": return { ...s, neovimError: a.payload.neovimError } @@ -49,11 +54,6 @@ export function reducer(s: State.IState, a fontSize: a.payload.fontSize } case "SET_MODE": return { ...s, ...{ mode: a.payload.mode } } - case "SET_COLORS": - return { ...s, ...{ - foregroundColor: a.payload.foregroundColor, - backgroundColor: a.payload.backgroundColor, - } } case "SET_CONFIGURATION_VALUE": const obj: Partial = {} obj[a.payload.key] = a.payload.value diff --git a/browser/src/UI/Selectors.ts b/browser/src/UI/Selectors.ts index 1cf965ba6d..2c20c413d4 100644 --- a/browser/src/UI/Selectors.ts +++ b/browser/src/UI/Selectors.ts @@ -99,8 +99,3 @@ export const getErrorsForPosition = createSelector( const { line, column } = win return errors.filter((diag) => Utility.isInRange(line, column, diag.range)) }) - -export const getForegroundBackgroundColor = (state: State.IState) => ({ - foregroundColor: state.foregroundColor, - backgroundColor: state.backgroundColor, -}) diff --git a/browser/src/UI/State.ts b/browser/src/UI/State.ts index 48ff633edb..32d8783f00 100644 --- a/browser/src/UI/State.ts +++ b/browser/src/UI/State.ts @@ -10,6 +10,8 @@ import * as Oni from "oni-api" import { configuration , IConfigurationValues } from "./../Services/Configuration" +import { DefaultThemeColors, IThemeColors } from "./../Services/Themes" + import * as Coordinates from "./Coordinates" import { Rectangle } from "./Types" @@ -41,8 +43,6 @@ export interface IState { fontFamily: string fontSize: string mode: string - backgroundColor: string - foregroundColor: string definition: null | IDefinition cursorLineOpacity: number cursorColumnOpacity: number @@ -52,6 +52,8 @@ export interface IState { neovimError: boolean + colors: IThemeColors + statusBar: { [id: string]: IStatusBarItem } toolTips: { [id: string]: IToolTip } @@ -179,7 +181,6 @@ export const createDefaultState = (): IState => ({ fontSize: "", imeActive: false, mode: "normal", - foregroundColor: "rgba(0, 0, 0, 0)", definition: null, activeWindowDimensions: { x: 0, @@ -187,9 +188,9 @@ export const createDefaultState = (): IState => ({ width: 0, height: 0, }, + colors: DefaultThemeColors, cursorLineOpacity: 0, cursorColumnOpacity: 0, - backgroundColor: "#000000", neovimError: false, configuration: configuration.getValues(), diff --git a/browser/src/UI/components/Background.tsx b/browser/src/UI/components/Background.tsx index a27393a2db..143959e933 100644 --- a/browser/src/UI/components/Background.tsx +++ b/browser/src/UI/components/Background.tsx @@ -41,7 +41,7 @@ export const BackgroundImageView = (props: IBackgroundProps) => { const mapStateToProps = (state: State.IState): IBackgroundProps => { const conf = state.configuration return { - backgroundColor: state.backgroundColor, + backgroundColor: state.colors.background, backgroundImageUrl: State.readConf(conf, "editor.backgroundImageUrl"), backgroundImageSize: State.readConf(conf, "editor.backgroundImageSize"), backgroundOpacity: State.readConf(conf, "editor.backgroundOpacity"), diff --git a/browser/src/UI/components/Cursor.tsx b/browser/src/UI/components/Cursor.tsx index 06ed3f722e..368e546898 100644 --- a/browser/src/UI/components/Cursor.tsx +++ b/browser/src/UI/components/Cursor.tsx @@ -133,8 +133,8 @@ const mapStateToProps = (state: State.IState, props: ICursorProps): ICursorRende width: state.cursorPixelWidth, height: state.fontPixelHeight, mode: state.mode, - color: state.foregroundColor, - textColor: state.backgroundColor, + color: state.colors["editor.foreground"], + textColor: state.colors["editor.background"], character: state.cursorCharacter, fontPixelWidth: state.fontPixelWidth, fontFamily: State.readConf(state.configuration, "editor.fontFamily"), diff --git a/browser/src/UI/components/CursorLine.tsx b/browser/src/UI/components/CursorLine.tsx index e59d4d3b95..70f32c9751 100644 --- a/browser/src/UI/components/CursorLine.tsx +++ b/browser/src/UI/components/CursorLine.tsx @@ -72,7 +72,7 @@ const mapStateToProps = (state: State.IState, props: ICursorLineProps) => { y: props.lineType === "line" ? state.cursorPixelY : activeWindowDimensions.y, width: props.lineType === "line" ? activeWindowDimensions.width : state.cursorPixelWidth, height: props.lineType === "line" ? state.fontPixelHeight : activeWindowDimensions.height, - color: state.foregroundColor, + color: state.colors["editore.foreground"], visible, opacity, } diff --git a/browser/src/UI/components/CursorPositioner.tsx b/browser/src/UI/components/CursorPositioner.tsx index ce9ed3dbab..8eaf3c5773 100644 --- a/browser/src/UI/components/CursorPositioner.tsx +++ b/browser/src/UI/components/CursorPositioner.tsx @@ -222,7 +222,9 @@ const mapStateToProps = (state: IState, props?: ICursorPositionerProps): ICursor const lineHeight = state.fontPixelHeight - const beakColor = (props && props.beakColor) ? props.beakColor : state.backgroundColor + const backgroundColor = state.colors["editor.background"] + + const beakColor = (props && props.beakColor) ? props.beakColor : backgroundColor return { beakColor, @@ -232,7 +234,7 @@ const mapStateToProps = (state: IState, props?: ICursorPositionerProps): ICursor containerWidth: state.viewport.width, containerHeight: state.viewport.height, lineHeight, - backgroundColor: state.backgroundColor, + backgroundColor, } } diff --git a/browser/src/UI/components/LightweightText.tsx b/browser/src/UI/components/LightweightText.tsx index ce62a4e1b5..96fc73296f 100644 --- a/browser/src/UI/components/LightweightText.tsx +++ b/browser/src/UI/components/LightweightText.tsx @@ -64,8 +64,8 @@ export class TextInputView extends React.PureComponent { const mapStateToProps = (state: State.IState, originalProps?: Partial) => ({ ...originalProps, - backgroundColor: state.backgroundColor, - foregroundColor: state.foregroundColor, + backgroundColor: state.colors["editor.background"], + foregroundColor: state.colors["editor.foreground"], }) export const TextInput = connect(mapStateToProps)(TextInputView) diff --git a/browser/src/UI/components/StatusBar.less b/browser/src/UI/components/StatusBar.less index cc60c6c395..a5992cffb3 100644 --- a/browser/src/UI/components/StatusBar.less +++ b/browser/src/UI/components/StatusBar.less @@ -3,8 +3,6 @@ .status-bar { .box-shadow-up; - color: @text-color; - background-color: @background-color; height: 2em; position: relative; width: 100%; diff --git a/browser/src/UI/components/StatusBar.tsx b/browser/src/UI/components/StatusBar.tsx index 8fd997c084..a64cfa236b 100644 --- a/browser/src/UI/components/StatusBar.tsx +++ b/browser/src/UI/components/StatusBar.tsx @@ -15,6 +15,8 @@ export interface StatusBarProps { enabled: boolean fontSize: string fontFamily: string + backgroundColor: string + foregroundColor: string } export interface StatusBarItemProps { @@ -43,6 +45,8 @@ export class StatusBar extends React.PureComponent { const statusBarStyle = { "fontFamily": this.props.fontFamily, "fontSize": this.props.fontSize, + backgroundColor: this.props.backgroundColor, + color: this.props.foregroundColor, } return
    @@ -96,6 +100,8 @@ const mapStateToProps = (state: IState): StatusBarProps => { const statusBarItems = getStatusBarItems(state) return { + backgroundColor: state.colors["statusBar.background"], + foregroundColor: state.colors["statusBar.foreground"], fontFamily: state.configuration["ui.fontFamily"], fontSize: state.configuration["statusbar.fontSize"] || state.configuration["ui.fontSize"], items: statusBarItems, diff --git a/browser/src/UI/components/Tabs.tsx b/browser/src/UI/components/Tabs.tsx index 0f4b3c812b..e49fce085d 100644 --- a/browser/src/UI/components/Tabs.tsx +++ b/browser/src/UI/components/Tabs.tsx @@ -196,8 +196,8 @@ const mapStateToProps = (state: State.IState, ownProps: ITabContainerProps): ITa return { fontFamily: state.configuration["ui.fontFamily"], fontSize: state.configuration["ui.fontSize"], - backgroundColor: state.backgroundColor, - foregroundColor: state.foregroundColor, + backgroundColor: state.colors["tabs.background"], + foregroundColor: state.colors["tabs.foreground"], onSelect: selectFunc, onClose: closeFunc, height, diff --git a/browser/src/UI/components/ToolTip.tsx b/browser/src/UI/components/ToolTip.tsx index 13847e4421..6cc5e80300 100644 --- a/browser/src/UI/components/ToolTip.tsx +++ b/browser/src/UI/components/ToolTip.tsx @@ -5,15 +5,15 @@ import { CSSTransition, TransitionGroup } from "react-transition-group" import { createSelector } from "reselect" -import * as Colors from "./../Colors" import * as State from "./../State" import { CursorPositioner } from "./CursorPositioner" export interface IToolTipsViewProps { toolTips: State.IToolTip[] - backgroundColor: string, - foregroundColor: string, + backgroundColor: string + foregroundColor: string + borderColor: string } export class ToolTipsView extends React.PureComponent { @@ -28,7 +28,7 @@ export class ToolTipsView extends React.PureComponent { exit={false} key={toolTip.id} > - + }) @@ -43,6 +43,7 @@ export class ToolTipsView extends React.PureComponent { export interface IToolTipViewProps extends State.IToolTip { backgroundColor: string foregroundColor: string + borderColor: string } export class ToolTipView extends React.PureComponent { @@ -75,11 +76,9 @@ export class ToolTipView extends React.PureComponent { const openDirection = options.openDirection || 1 const padding = options.padding || "8px" - const borderColorString = Colors.getBorderColor(this.props.backgroundColor, this.props.foregroundColor) - const toolTipStyle: React.CSSProperties = { backgroundColor: this.props.backgroundColor, - border: `1px solid ${borderColorString}`, + border: `1px solid ${this.props.borderColor}`, color: this.props.foregroundColor, padding, } @@ -120,8 +119,9 @@ const mapStateToProps = (state: State.IState): IToolTipsViewProps => { const toolTips = getToolTipsSelector(state) return { - backgroundColor: state.backgroundColor, - foregroundColor: state.foregroundColor, + borderColor: state.colors["toolTip.border"], + backgroundColor: state.colors["toolTip.background"], + foregroundColor: state.colors["toolTip.foreground"], toolTips, } } diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx index 78dd2658d8..2a343a4a5a 100644 --- a/browser/src/UI/components/TypingPredictions.tsx +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -109,8 +109,8 @@ const mapStateToProps = (state: State.IState, props: ITypingPredictionProps): IT y: state.cursorPixelY, width: state.cursorPixelWidth, height: state.fontPixelHeight, - color: state.foregroundColor, - textColor: state.backgroundColor, + color: state.colors["editor.background"], + textColor: state.colors["editor.foreground"], fontFamily: State.readConf(state.configuration, "editor.fontFamily"), fontSize: State.readConf(state.configuration, "editor.fontSize"), visible: true, diff --git a/browser/src/UI/containers/DefinitionContainer.ts b/browser/src/UI/containers/DefinitionContainer.ts index 260870f2df..cb2959fbf1 100644 --- a/browser/src/UI/containers/DefinitionContainer.ts +++ b/browser/src/UI/containers/DefinitionContainer.ts @@ -25,7 +25,7 @@ const mapStateToProps = (state: State.IState): IDefinitionProps => { const range = activeDefinition ? activeDefinition.token.range : emptyRange return { - color: state.foregroundColor, + color: state.colors["editor.foreground"], range, fontWidthInPixels: state.fontPixelWidth, fontHeightInPixels: state.fontPixelHeight, diff --git a/browser/src/index.tsx b/browser/src/index.tsx index a8cafe0714..290b2618de 100644 --- a/browser/src/index.tsx +++ b/browser/src/index.tsx @@ -16,6 +16,7 @@ import { configuration, IConfigurationValues } from "./Services/Configuration" import { editorManager } from "./Services/EditorManager" import { inputManager } from "./Services/InputManager" import { languageManager } from "./Services/Language" +import * as Themes from "./Services/Themes" import { createLanguageClientsFromConfiguration } from "./Services/Language" @@ -87,6 +88,7 @@ const start = (args: string[]) => { createLanguageClientsFromConfiguration(configuration.getValues()) AutoClosingPairs.activate(configuration, editorManager, inputManager, languageManager) + Themes.activate(configuration) checkForUpdates() } diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 69c75709ed..3f571639e3 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -89,6 +89,8 @@ export interface INeovimInstance { onHidePopupMenu: IEvent onShowPopupMenu: IEvent + onColorsChanged: IEvent + autoCommands: INeovimAutoCommands screenToPixels(row: number, col: number): IPixelPosition @@ -170,6 +172,8 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { private _onSelectPopupMenu = new Event() private _onLeave = new Event() + private _onColorsChanged = new Event() + private _pendingScrollTimeout: number | null = null public get quickFix(): IQuickFixList { @@ -184,6 +188,10 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this._onIncrementalBufferUpdateEvent } + public get onColorsChanged(): IEvent { + return this._onColorsChanged + } + public get onDirectoryChanged(): IEvent { return this._onDirectoryChanged } @@ -298,6 +306,8 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { } else if (eventName === "VimLeave") { this._isLeaving = true this._onLeave.dispatch() + } else if (eventName === "ColorScheme") { + this._onColorsChanged.dispatch() } this._autoCommands.notifyAutocommand(eventName, eventContext) @@ -397,9 +407,10 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this._neovim.request("nvim_eval", [expression]) } - public command(command: string): Promise { + public command(command: string): Promise { + // await this._initPromise Log.verbose("[NeovimInstance] Executing command: " + command) - return this._neovim.request("nvim_command", [command]) + return this._neovim.request("nvim_command", [command]) } public callFunction(functionName: string, args: any[]): Promise { diff --git a/browser/test/Plugins/PackageMetadataParserTests.ts b/browser/test/Plugins/PackageMetadataParserTests.ts deleted file mode 100644 index b9e127088e..0000000000 --- a/browser/test/Plugins/PackageMetadataParserTests.ts +++ /dev/null @@ -1,109 +0,0 @@ -import * as assert from "assert" - -import * as Capabilities from "./../../src/Plugins/Api/Capabilities" -import * as PackageMetadataParser from "./../../src/Plugins/PackageMetadataParser" - -describe("PackageMetadataParser", () => { - - const blankMetadataWithOniEngine: Partial = { - name: "blankMetadata", - engines: { - oni: "0.1", - }, - } - - describe("parseFromString", () => { - it("returns null if no engine specified", () => { - const blankMetadata = {} - const blankMetadataString = JSON.stringify(blankMetadata) - - const output = PackageMetadataParser.parseFromString(blankMetadataString) - assert.strictEqual(output, null) - }) - - it("creates default `oni` object", () => { - const metadata = { ...blankMetadataWithOniEngine } - const metadataString = JSON.stringify(metadata) - - const output = PackageMetadataParser.parseFromString(metadataString) - assert.deepEqual(output.oni, PackageMetadataParser.PluginDefaults) - }) - - it("passes through language capabilities", () => { - const metadata = { ...blankMetadataWithOniEngine } - metadata.oni = { - supportedFileTypes: ["typescript"], - } - - const metadataString = JSON.stringify(metadata) - - const output = PackageMetadataParser.parseFromString(metadataString) - assert.deepEqual(output.oni, { - ...PackageMetadataParser.PluginDefaults, - ...metadata.oni, - }) - }) - }) - - describe("getAllCommandsFromMetadata", () => { - const PluginWithNoCommands: Capabilities.IPluginMetadata = { - name: "PluginWithNoCommands", - main: "", - engines: "", - oni: { - }, - } - const PluginWithCommand: Capabilities.IPluginMetadata = { - name: "PluginWithNoCommands", - main: "", - engines: "", - oni: { - supportedFileTypes: ["javascript"], - commands: { - "test.testCommand": { - name: "Test Command", - details: "Test Command Details", - }, - }, - }, - } - - const PluginWithDuplicateCommands: Capabilities.IPluginMetadata = { - name: "PluginWithDuplicateCommands", - main: "", - engines: "", - oni: { - supportedFileTypes: ["javascript", "typescript"], - commands: { - "test.testCommand": { - name: "Test Command", - details: "Test Command Details", - }, - }, - }, - } - - it("returns empty array if no commands", () => { - const commands = PackageMetadataParser.getAllCommandsFromMetadata(PluginWithNoCommands) - assert.deepEqual(commands, []) - }) - - it("returns single command", () => { - const commands = PackageMetadataParser.getAllCommandsFromMetadata(PluginWithCommand) - assert.deepEqual(commands, [{ - command: "test.testCommand", - name: "Test Command", - details: "Test Command Details", - }]) - }) - - it("doesn't return duplicate commands", () => { - const commands = PackageMetadataParser.getAllCommandsFromMetadata(PluginWithDuplicateCommands) - assert.deepEqual(commands, [{ - command: "test.testCommand", - name: "Test Command", - details: "Test Command Details", - }]) - }) - }) -}) diff --git a/configuration/config.default.js b/configuration/config.default.js index b7a8feef21..7b28cdcc8f 100644 --- a/configuration/config.default.js +++ b/configuration/config.default.js @@ -25,6 +25,9 @@ module.exports = { activate, deactivate, //add custom config here, such as + + "ui.colorscheme": "onedark", + //"oni.useDefaultConfig": true, //"oni.bookmarks": ["~/Documents",] //"oni.loadInitVim": false, diff --git a/extensions/theme-onedark/colors/onedark.json b/extensions/theme-onedark/colors/onedark.json new file mode 100644 index 0000000000..da59804147 --- /dev/null +++ b/extensions/theme-onedark/colors/onedark.json @@ -0,0 +1,42 @@ +{ + "name": "onedark", + "baseVimTheme": "onedark", + "colors": { + "background": "#1F1F1F", + "foreground": "#ABB2BF", + + "editor.background": "#282C34", + "editor.foreground": "#ABB2BF", + + "tabs.background": "#282C34", + "tabs.foreground": "#ABB3BF", + + "toolTip.background": "#282C34", + "toolTip.foreground": "#ABB2BF", + "toolTip.border": "#505050", + + "menu.background": "#282C34", + "menu.foreground": "#ABB2BF", + "menu.border": "#505050", + + "contextMenu.background": "#282C34", + "contextMenu.foreground": "#ABB2BF", + "contextMenu.border": "#505050", + "contextMenu.highlight": "#3F4652", + + "statusBar.background": "#282828", + "statusBar.foreground": "#c8c8c8", + + "highlight.mode.insert.background": "#98c379", + "highlight.mode.insert.foreground": "#282c34", + + "highlight.mode.normal.background": "#61afef", + "highlight.mode.normal.foreground": "#282c34", + + "highlight.mode.operator.background": "#d19a66", + "highlight.mode.operator.foreground": "#282c34", + + "highlight.mode.visual.background": "#56b6c2", + "highlight.mode.visual.foreground": "#282c34" + } +} diff --git a/vim/core/colors/onedark.vim b/extensions/theme-onedark/colors/onedark.vim similarity index 100% rename from vim/core/colors/onedark.vim rename to extensions/theme-onedark/colors/onedark.vim diff --git a/extensions/theme-onedark/package.json b/extensions/theme-onedark/package.json new file mode 100644 index 0000000000..2fab303231 --- /dev/null +++ b/extensions/theme-onedark/package.json @@ -0,0 +1,19 @@ +{ + "name": "theme-onedark", + "version": "0.0.1", + "description": "One-dark theme, set for Oni", + "engines": { + "oni": "0.2.18" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "contributes": { + "themes": [{ + "name": "onedark", + "path": "colors/onedark.json" + }] + }, + "author": "", + "license": "MIT" +} diff --git a/vim/core/oni-core-interop/plugin/init.vim b/vim/core/oni-core-interop/plugin/init.vim index 88bb85ced1..edfcecc697 100644 --- a/vim/core/oni-core-interop/plugin/init.vim +++ b/vim/core/oni-core-interop/plugin/init.vim @@ -67,6 +67,7 @@ augroup OniEventListeners autocmd! BufWritePost * :call OniNotifyEvent("BufWritePost") autocmd! BufEnter * :call OniNotifyEvent("BufEnter") autocmd! BufWinEnter * :call OniNotifyEvent("BufWinEnter") + autocmd! ColorScheme * :call OniNotifyEvent("ColorScheme") autocmd! WinEnter * :call OniNotifyEvent("WinEnter") autocmd! BufDelete * :call OniNotifyEvent("BufDelete") autocmd! CursorMoved * :call OniNotifyEvent("CursorMoved") diff --git a/vim/core/oni-core-statusbar/index.js b/vim/core/oni-core-statusbar/index.js index 608bb885ed..c048a12beb 100644 --- a/vim/core/oni-core-statusbar/index.js +++ b/vim/core/oni-core-statusbar/index.js @@ -10,15 +10,31 @@ const activate = (Oni) => { const modeItem = Oni.statusBar.createItem(1, -2, "oni.status.mode") const setMode = (mode) => { - const getColorForMode = (m) => { + const getBackgroundColorForMode = (m) => { switch (m) { case "insert": case "replace": - return rgb(0, 200, 100) + return Oni.colors.getColor("highlight.mode.insert.background") case "operator": - return rgb(255, 100, 0) + return Oni.colors.getColor("highlight.mode.operator.background") + case "visual": + return Oni.colors.getColor("highlight.mode.visual.background") default: - return rgb(0, 100, 255) + return Oni.colors.getColor("highlight.mode.normal.background") + } + } + + const getForegroundColorForMode = (m) => { + switch (m) { + case "insert": + case "replace": + return Oni.colors.getColor("highlight.mode.insert.foreground") + case "operator": + return Oni.colors.getColor("highlight.mode.operator.foreground") + case "visual": + return Oni.colors.getColor("highlight.mode.visual.foreground") + default: + return Oni.colors.getColor("highlight.mode.normal.foreground") } } @@ -39,8 +55,8 @@ const activate = (Oni) => { "paddingLeft": "8px", "paddingRight": "8px", "textTransform": "uppercase", - color: rgb(220, 220, 220), - backgroundColor: getColorForMode(mode) + color: getForegroundColorForMode(mode), + backgroundColor: getBackgroundColorForMode(mode) } const modeElement = React.createElement("div", { style, className: "mode" }, parseMode(mode)) diff --git a/vim/default/bundle/oni-vim-defaults/plugin/init.vim b/vim/default/bundle/oni-vim-defaults/plugin/init.vim index 3db462624f..db5ba7ec8d 100644 --- a/vim/default/bundle/oni-vim-defaults/plugin/init.vim +++ b/vim/default/bundle/oni-vim-defaults/plugin/init.vim @@ -35,5 +35,3 @@ inoremap pumvisible() ? "bi" : "b" inoremap pumvisible() ? "la" : "a" tnoremap - -colorscheme onedark diff --git a/yarn.lock b/yarn.lock index 79763d1bc9..baae88663f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -179,8 +179,8 @@ ajv@^4.9.1: json-stable-stringify "^1.0.1" ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3: - version "5.5.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.0.tgz#eb2840746e9dc48bd5e063a36e3fd400c5eab5a9" + version "5.4.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" From 524f115ab4b5596548f5be914069c447de2baf50 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 09:38:25 -0800 Subject: [PATCH 42/63] Add unit test to exercise filter exception, and then get the test green (#1028) --- browser/src/Services/InputManager.ts | 6 +++++- browser/test/Input/InputManagerTests.ts | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/browser/src/Services/InputManager.ts b/browser/src/Services/InputManager.ts index 3d512d88e9..ea38a6636b 100644 --- a/browser/src/Services/InputManager.ts +++ b/browser/src/Services/InputManager.ts @@ -38,7 +38,11 @@ export class InputManager implements Oni.InputManager { this._boundKeys[normalizedKeyChord] = [...currentBinding, newBinding] return () => { - this._boundKeys[normalizedKeyChord] = this._boundKeys[normalizedKeyChord].filter((f) => f !== newBinding) + const existingBindings = this._boundKeys[normalizedKeyChord] + + if (existingBindings) { + this._boundKeys[normalizedKeyChord] = existingBindings.filter((f) => f !== newBinding) + } } } diff --git a/browser/test/Input/InputManagerTests.ts b/browser/test/Input/InputManagerTests.ts index 3ff09462a5..44c280ff5b 100644 --- a/browser/test/Input/InputManagerTests.ts +++ b/browser/test/Input/InputManagerTests.ts @@ -30,5 +30,20 @@ describe("InputManager", () => { assert.strictEqual(count, 0, "Handler should not have been called") assert.strictEqual(handled, false) }) + + it("dispose key handler is robust if unbindAll was called first", () => { + const im = new InputManager() + + let count = 0 + const dispose = im.bind("{", () => { count++; return true }) + + im.unbindAll() + + dispose() + + const handled = im.handleKey("{") + assert.strictEqual(count, 0, "Handler should not have been called.") + assert.strictEqual(handled, false) + }) }) }) From 4f80d33140139ec6cc1d32ae63cb16ed6ac27aac Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 09:39:40 -0800 Subject: [PATCH 43/63] Add 'ui.fontSmoothing' configuration, which directly sets '-webkit-font-smoothing' on the body (#1033) --- browser/src/Services/Configuration/DefaultConfiguration.ts | 1 + browser/src/Services/Configuration/IConfigurationValues.ts | 3 +++ browser/src/index.tsx | 6 ++++++ configuration/config.default.js | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index 1074337007..6ac4f204f8 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -179,6 +179,7 @@ const BaseConfiguration: IConfigurationValues = { "ui.colorscheme": "onedark", "ui.fontFamily": "BlinkMacSystemFont, 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif", "ui.fontSize": "13px", + "ui.fontSmoothing": "auto", } const MacConfigOverrides: Partial = { diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index 559648a152..d6bc51522f 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -15,6 +15,8 @@ export interface ITokenColorsSetting { settings: IHighlight | string } +export type FontSmoothingOptions = "auto" | "antialiased" | "subpixel-antialiased" | "none" + export interface IConfigurationValues { "activate": (oni: Oni.Plugin.Api) => void @@ -186,6 +188,7 @@ export interface IConfigurationValues { "ui.colorscheme": string "ui.fontFamily": string "ui.fontSize": string + "ui.fontSmoothing": FontSmoothingOptions // Handle other, non-predefined configuration keys [configurationKey: string]: any diff --git a/browser/src/index.tsx b/browser/src/index.tsx index 290b2618de..d7f2ce0fd4 100644 --- a/browser/src/index.tsx +++ b/browser/src/index.tsx @@ -50,6 +50,12 @@ const start = (args: string[]) => { document.body.style.fontSize = configuration.getValue("ui.fontSize") document.body.style.fontVariant = configuration.getValue("editor.fontLigatures") ? "normal" : "none" + const fontSmoothing = configuration.getValue("ui.fontSmoothing") + + if (fontSmoothing) { + document.body.style["-webkit-font-smoothing"] = fontSmoothing + } + const hideMenu: boolean = configuration.getValue("oni.hideMenu") browserWindow.setAutoHideMenuBar(hideMenu) browserWindow.setMenuBarVisibility(!hideMenu) diff --git a/configuration/config.default.js b/configuration/config.default.js index 7b28cdcc8f..c12e9c94cb 100644 --- a/configuration/config.default.js +++ b/configuration/config.default.js @@ -33,4 +33,8 @@ module.exports = { //"oni.loadInitVim": false, //"editor.fontSize": "14px", //"editor.fontFamily": "Monaco" + + // UI customizations + "ui.animations.enabled": true, + "ui.fontSmoothing": "auto", } From f1247f8d45bb1aac608da885f06fa7b86a0f7535 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 10:41:35 -0800 Subject: [PATCH 44/63] Fix #63: Synchronize titlebar color on OSX (#1034) * Create component + state management for window title, use frameless window on OSX * Create connected component to store, hook up title * Add 'title' colors and update 'onedark.json * Only show window title on Mac * Fix lint issues * Derive the titlebar / background color from the theme color --- browser/src/Editor/NeovimEditor.tsx | 8 +-- browser/src/Services/Themes/ThemeManager.ts | 16 +++++- browser/src/Services/WindowTitle.ts | 16 ------ browser/src/UI/ActionCreators.ts | 12 +++++ browser/src/UI/Actions.ts | 10 +++- browser/src/UI/Reducer.ts | 5 ++ browser/src/UI/RootComponent.tsx | 8 +++ browser/src/UI/State.ts | 2 + browser/src/UI/components/Tabs.less | 2 - browser/src/UI/components/WindowTitle.tsx | 56 ++++++++++++++++++++ browser/src/neovim/NeovimInstance.ts | 9 +++- extensions/theme-onedark/colors/onedark.json | 3 ++ main/src/main.ts | 2 +- 13 files changed, 124 insertions(+), 25 deletions(-) delete mode 100644 browser/src/Services/WindowTitle.ts create mode 100644 browser/src/UI/components/WindowTitle.tsx diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 9933170f09..8cff761e78 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -35,7 +35,6 @@ import { addInsertModeLanguageFunctionality, addNormalModeLanguageFunctionality import { ISyntaxHighlighter, NullSyntaxHighlighter, SyntaxHighlighter } from "./../Services/SyntaxHighlighting" import { getThemeManagerInstance } from "./../Services/Themes" import { TypingPredictionManager } from "./../Services/TypingPredictionManager" -import { WindowTitle } from "./../Services/WindowTitle" import { workspace } from "./../Services/Workspace" import * as UI from "./../UI/index" @@ -151,7 +150,6 @@ export class NeovimEditor implements IEditor { // Services const errorService = new Errors(this._neovimInstance) - const windowTitle = new WindowTitle(this._neovimInstance) registerBuiltInCommands(commandManager, this._neovimInstance) @@ -159,7 +157,6 @@ export class NeovimEditor implements IEditor { tasks.registerTaskProvider(errorService) services.push(errorService) - services.push(windowTitle) this._colors.onColorsChanged.subscribe(() => { const updatedColors: any = this._colors.getColors() @@ -177,6 +174,11 @@ export class NeovimEditor implements IEditor { } }) + this._neovimInstance.onTitleChanged.subscribe((newTitle) => { + const title = newTitle.replace(" - NVIM", " - ONI") + UI.Actions.setWindowTitle(title) + }) + this._neovimInstance.onLeave.subscribe(() => { // TODO: Only leave if all editors are closed... if (!configuration.getValue("debug.persistOnNeovimExit")) { diff --git a/browser/src/Services/Themes/ThemeManager.ts b/browser/src/Services/Themes/ThemeManager.ts index 6992a8e59f..ecae965008 100644 --- a/browser/src/Services/Themes/ThemeManager.ts +++ b/browser/src/Services/Themes/ThemeManager.ts @@ -53,6 +53,9 @@ export interface IThemeColors { "sidebar.background": string "sidebar.foreground": string + "title.background": string + "title.foreground": string + "fileExplorer.background": string "fileExplorer.foreground": string "fileExplorer.selection.background": string @@ -78,11 +81,16 @@ export const getBorderColor = (bgColor: string, fgColor: string): string => { return borderColor.rgb().toString() } +export const getBackgroundColor = (editorBackground: string): string => { + return Color(editorBackground).darken(0.25).toString() +} + export const getColorsFromBackgroundAndForeground = (background: string, foreground: string) => { + const shellBackground = getBackgroundColor(background) const borderColor = getBorderColor(background, foreground) return { ...DefaultThemeColors, - "background": background, + "background": shellBackground, "foreground": foreground, "editor.background": background, "editor.foreground": foreground, @@ -94,6 +102,9 @@ export const getColorsFromBackgroundAndForeground = (background: string, foregro "tabs.background": background, "tabs.foreground": foreground, + "title.background": shellBackground, + "title.foreground": foreground, + // Context menu is used for completion, refactoring "contextMenu.background": background, "contextMenu.foreground": foreground, @@ -126,6 +137,9 @@ export const DefaultThemeColors: IThemeColors = { "editor.background": ColorBlack, "editor.foreground": ColorWhite, + "title.background": ColorBlack, + "title.foreground": ColorWhite, + "highlight.mode.insert.foreground": HighlightForeground, "highlight.mode.insert.background": InsertMode, diff --git a/browser/src/Services/WindowTitle.ts b/browser/src/Services/WindowTitle.ts deleted file mode 100644 index 5fc3297e4e..0000000000 --- a/browser/src/Services/WindowTitle.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * WindowTitle.ts - * - * Manages the window title - */ - -import { INeovimInstance } from "./../neovim" - -export class WindowTitle { - - constructor(neovimInstance: INeovimInstance) { - neovimInstance.on("set-title", (title: string) => { - document.title = title.replace(" - NVIM", " - ONI") - }) - } -} diff --git a/browser/src/UI/ActionCreators.ts b/browser/src/UI/ActionCreators.ts index c315cbcbc5..de74d566fe 100644 --- a/browser/src/UI/ActionCreators.ts +++ b/browser/src/UI/ActionCreators.ts @@ -31,6 +31,18 @@ import { IThemeColors } from "./../Services/Themes" export type DispatchFunction = (action: any) => void export type GetStateFunction = () => State.IState +export const setWindowTitle = (title: string) => { + + document.title = title + + return { + type: "SET_WINDOW_TITLE", + payload: { + title, + }, + } +} + export const setColors = (colors: IThemeColors) => ({ type: "SET_COLORS", payload: { diff --git a/browser/src/UI/Actions.ts b/browser/src/UI/Actions.ts index 261d729237..5d7d801e99 100644 --- a/browser/src/UI/Actions.ts +++ b/browser/src/UI/Actions.ts @@ -18,6 +18,13 @@ import { IThemeColors } from "./../Services/Themes" import * as types from "vscode-languageserver-types" +export interface ISetWindowTitleAction { + type: "SET_WINDOW_TITLE", + payload: { + title: string, + } +} + export interface ISetColorsAction { type: "SET_COLORS", payload: { @@ -252,7 +259,8 @@ export type SimpleAction = ISetTabs | ISetViewportAction | ISetWindowCursor | - ISetWindowState + ISetWindowState | + ISetWindowTitleAction export type ActionWithGeneric = ISetConfigurationValue diff --git a/browser/src/UI/Reducer.ts b/browser/src/UI/Reducer.ts index 10023a1c31..dcffb0f818 100644 --- a/browser/src/UI/Reducer.ts +++ b/browser/src/UI/Reducer.ts @@ -21,6 +21,11 @@ export function reducer(s: State.IState, a } switch (a.type) { + case "SET_WINDOW_TITLE": + return { + ...s, + windowTitle: a.payload.title, + } case "SET_COLORS": return { ...s, diff --git a/browser/src/UI/RootComponent.tsx b/browser/src/UI/RootComponent.tsx index a34bfc5a79..3704e1dbde 100644 --- a/browser/src/UI/RootComponent.tsx +++ b/browser/src/UI/RootComponent.tsx @@ -1,5 +1,7 @@ import * as React from "react" +import * as Platform from "./../Platform" + import { keyEventToVimKey } from "./../Input/Keyboard" import { focusManager } from "./../Services/FocusManager" import { inputManager } from "./../Services/InputManager" @@ -9,11 +11,14 @@ import * as WindowManager from "./../Services/WindowManager" import { Background } from "./components/Background" import StatusBar from "./components/StatusBar" import { WindowSplits } from "./components/WindowSplits" +import { WindowTitle } from "./components/WindowTitle" interface IRootComponentProps { windowManager: WindowManager.WindowManager } +const titleBarVisible = Platform.isMac() + export class RootComponent extends React.PureComponent { public render() { return
    this._onRootKeyDown(evt)}> @@ -22,6 +27,9 @@ export class RootComponent extends React.PureComponent
    +
    + +
    diff --git a/browser/src/UI/State.ts b/browser/src/UI/State.ts index 32d8783f00..aeb3f246c3 100644 --- a/browser/src/UI/State.ts +++ b/browser/src/UI/State.ts @@ -49,6 +49,7 @@ export interface IState { configuration: IConfigurationValues imeActive: boolean viewport: IViewport + windowTitle: string neovimError: boolean @@ -220,4 +221,5 @@ export const createDefaultState = (): IState => ({ statusBar: {}, toolTips: {}, activeMessageDialog: null, + windowTitle: "", }) diff --git a/browser/src/UI/components/Tabs.less b/browser/src/UI/components/Tabs.less index e1b34525bc..8f99ae86df 100644 --- a/browser/src/UI/components/Tabs.less +++ b/browser/src/UI/components/Tabs.less @@ -27,8 +27,6 @@ align-items: flex-end; width: 100%; - color: #c8c8c8; - background-color: rgba(0, 0, 0, 0.2); overflow-x: hidden; &:hover { diff --git a/browser/src/UI/components/WindowTitle.tsx b/browser/src/UI/components/WindowTitle.tsx new file mode 100644 index 0000000000..5956c478bc --- /dev/null +++ b/browser/src/UI/components/WindowTitle.tsx @@ -0,0 +1,56 @@ +/** + * WindowTitle.tsx + * + * Renders the title bar (OSX only) + */ + +import * as React from "react" + +import { connect } from "react-redux" + +import * as State from "./../State" + +export interface IWindowTitleViewProps { + visible: boolean + title: string + backgroundColor: string + foregroundColor: string +} + +export class WindowTitleView extends React.PureComponent { + + public render(): null | JSX.Element { + + if (!this.props.visible) { + return null + } + + const style = { + height: "22px", + lineHeight: "22px", + zoom: 1, // Don't allow this to be impacted by zoom + backgroundColor: this.props.backgroundColor, + color: this.props.foregroundColor, + textAlign: "center", + "-webkit-app-region": "drag", + "-webkit-user-select": "none", + } + + return
    {this.props.title}
    + } +} + +export interface IWindowTitleProps { + visible: boolean +} + +export const mapStateToProps = (state: State.IState, props: IWindowTitleProps): IWindowTitleViewProps => { + return { + ...props, + title: state.windowTitle, + backgroundColor: state.colors["title.background"], + foregroundColor: state.colors["title.foreground"], + } +} + +export const WindowTitle = connect(mapStateToProps)(WindowTitleView) diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 3f571639e3..dc0067c997 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -83,6 +83,8 @@ export interface INeovimInstance { onScroll: IEvent + onTitleChanged: IEvent + // When an OniCommand is requested, ie :OniCommand("quickOpen.show") onOniCommand: IEvent @@ -166,6 +168,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { private _onFullBufferUpdateEvent = new Event() private _onIncrementalBufferUpdateEvent = new Event() private _onScroll = new Event() + private _onTitleChanged = new Event() private _onModeChanged = new Event() private _onHidePopupMenu = new Event() private _onShowPopupMenu = new Event() @@ -220,6 +223,10 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { return this._onScroll } + public get onTitleChanged(): IEvent { + return this._onTitleChanged + } + public get onHidePopupMenu(): IEvent { return this._onHidePopupMenu } @@ -542,7 +549,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { this.emit("action", Actions.resize(a[0][0], a[0][1])) break case "set_title": - this.emit("set-title", a[0][0]) + this._onTitleChanged.dispatch(a[0][0]) break case "set_icon": // window title when minimized, no-op diff --git a/extensions/theme-onedark/colors/onedark.json b/extensions/theme-onedark/colors/onedark.json index da59804147..496bcd31b5 100644 --- a/extensions/theme-onedark/colors/onedark.json +++ b/extensions/theme-onedark/colors/onedark.json @@ -5,6 +5,9 @@ "background": "#1F1F1F", "foreground": "#ABB2BF", + "title.background": "#1F1F1F", + "title.foreground": "#ABB2BF", + "editor.background": "#282C34", "editor.foreground": "#ABB2BF", diff --git a/main/src/main.ts b/main/src/main.ts index a1fb8f4e60..e56d30e547 100644 --- a/main/src/main.ts +++ b/main/src/main.ts @@ -69,7 +69,7 @@ function createWindow(commandLineArguments, workingDirectory) { const indexPath = path.join(rootPath, "index.html?react_perf") // Create the browser window. // TODO: Do we need to use non-ico for other platforms? - let mainWindow = new BrowserWindow({ width: 800, height: 600, icon: iconPath, webPreferences }) + let mainWindow = new BrowserWindow({ width: 800, height: 600, icon: iconPath, webPreferences, titleBarStyle: "hidden" }) updateMenu(mainWindow, false) From 6d827d6a3121d978b5f5a83db11880e825c4d743 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 12:11:39 -0800 Subject: [PATCH 45/63] #956 - Fix completion case that was still broken (#1031) * Fix case that was still broken - when changing mode, the old meet would still be picked up * Use switchMap instead of mergeMap, to reduce number of completion calls * Simplify action logging --- browser/src/Redux/LoggingMiddleware.ts | 2 +- browser/src/Services/Completion/Completion.ts | 4 ++-- browser/src/Services/Completion/CompletionStore.ts | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/browser/src/Redux/LoggingMiddleware.ts b/browser/src/Redux/LoggingMiddleware.ts index 85102702af..77c00adfd3 100644 --- a/browser/src/Redux/LoggingMiddleware.ts +++ b/browser/src/Redux/LoggingMiddleware.ts @@ -9,7 +9,7 @@ import { Store } from "redux" import * as Log from "./../Log" export const createLoggingMiddleware = (storeName: string) => (store: Store) => (next: any) => (action: any): any => { - Log.verbose("[REDUX - " + storeName + "] Applying action - " + action.type + ":") + Log.verbose("[REDUX - " + storeName + "][ACTION] " + action.type) if (Log.isDebugLoggingEnabled()) { console.dir(action) // tslint:disable-line diff --git a/browser/src/Services/Completion/Completion.ts b/browser/src/Services/Completion/Completion.ts index ae68c66852..b55336cc8d 100644 --- a/browser/src/Services/Completion/Completion.ts +++ b/browser/src/Services/Completion/Completion.ts @@ -103,7 +103,7 @@ export class Completion implements IDisposable { } private async _onModeChanged(newMode: string): Promise { - if (newMode === "insert" && this._lastCursorPosition) { + if (newMode === "insert" && this._lastCursorPosition) { const [latestLine] = await this._editor.activeBuffer.getLines(this._lastCursorPosition.line, this._lastCursorPosition.line + 1) this._throttledCursorUpdates.next({ @@ -114,7 +114,7 @@ export class Completion implements IDisposable { }) } - this._store.dispatch({ + this._store.dispatch({ type: "MODE_CHANGED", mode: newMode, }) diff --git a/browser/src/Services/Completion/CompletionStore.ts b/browser/src/Services/Completion/CompletionStore.ts index 9a228eb683..cb74d383ee 100644 --- a/browser/src/Services/Completion/CompletionStore.ts +++ b/browser/src/Services/Completion/CompletionStore.ts @@ -168,7 +168,7 @@ export const lastCompletionInfoReducer: Reducer = ( const nullAction: CompletionAction = { type: null } as CompletionAction const getCompletionMeetEpic: Epic = (action$, store) => - action$.ofType("CURSOR_MOVED", "MODE_CHANGED") + action$.ofType("CURSOR_MOVED") .map((action: CompletionAction) => { const currentState: ICompletionState = store.getState() @@ -236,7 +236,7 @@ const getCompletionsEpic: Epic = (action$, s return true }) - .mergeMap((action: CompletionAction): Observable => { + .switchMap((action: CompletionAction): Observable => { const state = store.getState() @@ -271,7 +271,7 @@ const getCompletionsEpic: Epic = (action$, s const getCompletionDetailsEpic: Epic = (action$, store) => action$.ofType("SELECT_ITEM") - .mergeMap((action) => { + .switchMap((action) => { if (action.type !== "SELECT_ITEM") { return Observable.of(nullAction) From 6c92b1dbf2850454c94d186b01ac6d8dcf872116 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 12:11:59 -0800 Subject: [PATCH 46/63] Add enter key to auto closing pairs (#1025) * Add enter key to auto closing pairs * Fix lint issues * Add logging for 'dir' to narrow down the CSS case failure * Fix error where '_oldDir' is not defined --- browser/src/Services/AutoClosingPairs.ts | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/browser/src/Services/AutoClosingPairs.ts b/browser/src/Services/AutoClosingPairs.ts index 6993682272..1f610f38e7 100644 --- a/browser/src/Services/AutoClosingPairs.ts +++ b/browser/src/Services/AutoClosingPairs.ts @@ -80,6 +80,40 @@ export const activate = (configuration: Configuration, editorManager: EditorMana return true } + const handleEnterCharacter = (pairs: IAutoClosingPair[], editor: Oni.Editor) => () => { + queue.enqueuePromise(async () => { + const activeBuffer = editor.activeBuffer + + const lines = await activeBuffer.getLines(activeBuffer.cursor.line, activeBuffer.cursor.line + 1) + const line = lines[0] + const neovim = editor.neovim + + const { column } = activeBuffer.cursor + + const matchingPair = pairs.find((p) => { + return column >= 1 + && line[column] === p.close + && line[column - 1] === p.open + }) + + if (matchingPair) { + const beforePair = line.substring(0, column) + const afterPair = line.substring(column, line.length) + + const pos = await neovim.callFunction("getpos", ["."]) + const [, oneBasedLine ] = pos + await activeBuffer.setLines(activeBuffer.cursor.line, activeBuffer.cursor.line + 1, [beforePair, "", afterPair]) + await activeBuffer.setCursorPosition(oneBasedLine, 0) + await neovim.input("") + + } else { + await neovim.input("") + } + }) + + return true + } + const handleCloseCharacter = (pair: IAutoClosingPair, editor: Oni.Editor) => () => { queue.enqueuePromise(async () => { @@ -117,6 +151,7 @@ export const activate = (configuration: Configuration, editorManager: EditorMana }) subscriptions.push(inputManager.bind("", handleBackspaceCharacter(autoClosingPairs, editorManager.activeEditor), insertModeFilter)) + subscriptions.push(inputManager.bind("", handleEnterCharacter(autoClosingPairs, editorManager.activeEditor), insertModeFilter)) }) } From 14eca795bfd07906a5b4932402ca4c8c50a4b9c2 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 12:46:20 -0800 Subject: [PATCH 47/63] Fix #981 - Use 'editor.fontFamily' for completion / tooltips (#1035) * Clean up fonts, update rename to not have additional text * Fix lint issues --- browser/src/Services/Language/RenameView.tsx | 7 ------- browser/src/UI/components/ToolTip.tsx | 12 ++++++++++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/browser/src/Services/Language/RenameView.tsx b/browser/src/Services/Language/RenameView.tsx index 18e4ef6414..eebdb50cb2 100644 --- a/browser/src/Services/Language/RenameView.tsx +++ b/browser/src/Services/Language/RenameView.tsx @@ -17,14 +17,7 @@ export class RenameView extends React.PureComponent { public render(): JSX.Element { - const titleStyle = { - marginBottom: "8px", - } - - const renameText = "Rename '" + this.props.tokenName + "' to:" - return
    -
    {renameText}
    } diff --git a/browser/src/UI/components/ToolTip.tsx b/browser/src/UI/components/ToolTip.tsx index 6cc5e80300..1998c5df56 100644 --- a/browser/src/UI/components/ToolTip.tsx +++ b/browser/src/UI/components/ToolTip.tsx @@ -14,12 +14,13 @@ export interface IToolTipsViewProps { backgroundColor: string foregroundColor: string borderColor: string + fontFamily: string + fontSize: string } export class ToolTipsView extends React.PureComponent { public render(): JSX.Element { - const toolTipElements = this.props.toolTips.map((toolTip) => { return { }) - return
    + const style: React.CSSProperties = { + fontFamily: this.props.fontFamily, + fontSize: this.props.fontSize, + } + + return
    {toolTipElements} @@ -122,6 +128,8 @@ const mapStateToProps = (state: State.IState): IToolTipsViewProps => { borderColor: state.colors["toolTip.border"], backgroundColor: state.colors["toolTip.background"], foregroundColor: state.colors["toolTip.foreground"], + fontFamily: state.fontFamily, + fontSize: state.fontSize, toolTips, } } From 488a686e518188e58ed5d3c883ca0716426d830a Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 14:14:40 -0800 Subject: [PATCH 48/63] Add sleeps to improve stability of AutoCompletion tests. (#1032) * Add sleeps to improve stability of AutoCompletion tests. Long-term, we need to investigate why there is an issue here causing the AutoCompletion to fail - it seems like there may be a timing issue when typing very quickly after switching mode. * Remove unused test * Remove CSS test until it can be stabilized --- test/CiTests.ts | 2 +- test/ci/AutoCompletionTest-CSS.ts | 1 + test/ci/AutoCompletionTest-TypeScript.ts | 1 + test/ci/AutoCompletionTest.ts | 29 ------------------------ 4 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 test/ci/AutoCompletionTest.ts diff --git a/test/CiTests.ts b/test/CiTests.ts index 0fe2906676..a2045127d3 100644 --- a/test/CiTests.ts +++ b/test/CiTests.ts @@ -11,7 +11,7 @@ const LongTimeout = 5000 const CiTests = [ "BasicEditingTest", - "AutoCompletionTest-CSS", +// "AutoCompletionTest-CSS", "AutoCompletionTest-TypeScript", "QuickOpenTest", "StatusBar-Mode", diff --git a/test/ci/AutoCompletionTest-CSS.ts b/test/ci/AutoCompletionTest-CSS.ts index 8285e2415a..e3c2be9d62 100644 --- a/test/ci/AutoCompletionTest-CSS.ts +++ b/test/ci/AutoCompletionTest-CSS.ts @@ -16,6 +16,7 @@ export const test = async (oni: any) => { oni.automation.sendKeys("") await oni.automation.sleep(500) oni.automation.sendKeys("i") + await oni.automation.sleep(500) oni.automation.sendKeys(".test { pos") // Wait for completion popup to show diff --git a/test/ci/AutoCompletionTest-TypeScript.ts b/test/ci/AutoCompletionTest-TypeScript.ts index 9e7fd44725..62f4c4ff79 100644 --- a/test/ci/AutoCompletionTest-TypeScript.ts +++ b/test/ci/AutoCompletionTest-TypeScript.ts @@ -16,6 +16,7 @@ export const test = async (oni: any) => { oni.automation.sendKeys("") await oni.automation.sleep(500) oni.automation.sendKeys("i") + await oni.automation.sleep(500) oni.automation.sendKeys("window.a") // Wait for completion popup to show diff --git a/test/ci/AutoCompletionTest.ts b/test/ci/AutoCompletionTest.ts deleted file mode 100644 index 9e7fd44725..0000000000 --- a/test/ci/AutoCompletionTest.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Test scripts for QuickOpen - */ - -import * as assert from "assert" -import * as os from "os" -import * as path from "path" - -import { getCompletionElement } from "./Common" - -export const test = async (oni: any) => { - const dir = os.tmpdir() - const testFileName = `testFile-${new Date().getTime()}.ts` - const tempFilePath = path.join(dir, testFileName) - oni.automation.sendKeys(":e " + tempFilePath) - oni.automation.sendKeys("") - await oni.automation.sleep(500) - oni.automation.sendKeys("i") - oni.automation.sendKeys("window.a") - - // Wait for completion popup to show - await oni.automation.waitFor(() => getCompletionElement() !== null) - - // Check for 'alert' as an available completion - const completionElement = getCompletionElement() - const textContent = completionElement.textContent - - assert.ok(textContent.indexOf("alert") >= 0, "Verify 'alert' was presented as a completion") -} From 694229b6d565b0657e6c23fefb9087080d916fca Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 17:29:30 -0800 Subject: [PATCH 49/63] Fix regression in predicted text colors (#1036) --- browser/src/UI/components/TypingPredictions.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx index 2a343a4a5a..dcab90847a 100644 --- a/browser/src/UI/components/TypingPredictions.tsx +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -92,7 +92,8 @@ class TypingPredictionView extends React.PureComponent Date: Wed, 29 Nov 2017 19:05:30 -0800 Subject: [PATCH 50/63] Upgrade oni-api to 0.0.6 (#1042) * Upgrade dependency to 0.0.6 * Explicitly implement Oni.IWindowManager to ensure that the interface is kept in sync --- browser/src/Services/WindowManager.ts | 2 +- package.json | 77 +++++++++++++++------------ yarn.lock | 8 +-- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/browser/src/Services/WindowManager.ts b/browser/src/Services/WindowManager.ts index 432d12a1f3..5697051729 100644 --- a/browser/src/Services/WindowManager.ts +++ b/browser/src/Services/WindowManager.ts @@ -13,7 +13,7 @@ import { Event, IEvent } from "oni-types" import { applySplit, closeSplit, createSplitLeaf, createSplitRoot, ISplitInfo, SplitDirection } from "./WindowSplit" -export class WindowManager { +export class WindowManager implements Oni.IWindowManager { // private _activeSplit: ISplitLeaf private _splitRoot: ISplitInfo diff --git a/package.json b/package.json index 7e01ff5106..3fbe5bbf04 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,14 @@ "homepage": "https://www.onivim.io", "version": "0.2.18", "description": "NeoVim front-end with IDE-style extensibility", - "keywords": ["vim", "neovim", "text", "editor", "ide", "vim"], + "keywords": [ + "vim", + "neovim", + "text", + "editor", + "ide", + "vim" + ], "main": "./lib/main/src/main.js", "bin": { "oni": "./cli/oni", @@ -38,63 +45,63 @@ "mac": { "artifactName": "${productName}-${version}-osx.${ext}", "category": "public.app-category.developer-tools", - "target": ["dmg", "zip"], - "files": ["bin/osx/**/*"] + "target": [ + "dmg", + "zip" + ], + "files": [ + "bin/osx/**/*" + ] }, "linux": { "artifactName": "${productName}-${version}-${arch}-linux.${ext}", "maintainer": "bryphe@outlook.com", - "target": ["tar.gz", "deb", "rpm"] + "target": [ + "tar.gz", + "deb", + "rpm" + ] }, "win": { - "target": ["zip", "dir"], - "files": ["bin/x86/**/*"] + "target": [ + "zip", + "dir" + ], + "files": [ + "bin/x86/**/*" + ] } }, "scripts": { - "build": - "npm run build:browser && npm run build:main && npm run build:plugins", + "build": "npm run build:browser && npm run build:main && npm run build:plugins", "build-debug": "npm run build:browser-debug && npm run build:plugins", "build:browser": "webpack --config browser/webpack.production.config.js", "build:browser-debug": "webpack --config browser/webpack.debug.config.js", "build:main": "cd main && tsc -p tsconfig.json", "build:plugins": "npm run build:plugin:oni-plugin-typescript", - "build:plugin:oni-plugin-typescript": - "cd vim/core/oni-plugin-typescript && npm run build", + "build:plugin:oni-plugin-typescript": "cd vim/core/oni-plugin-typescript && npm run build", "build:test": "cd test && tsc -p tsconfig.json", "pack": "build --publish never", "copy-icons": "node build/CopyIcons.js", "dist:win": "build --arch ia32 --publish never", - "pack:win": - "node build/BuildSetupTemplate.js && innosetup-compiler dist/setup.iss --verbose --O=dist", + "pack:win": "node build/BuildSetupTemplate.js && innosetup-compiler dist/setup.iss --verbose --O=dist", "test": "npm run test:unit && npm run test:integration", - "test:integration": - "npm run build:test && mocha -t 30000 lib_test/test/CiTests.js", - "test:stability": - "npm run build:test && mocha -t 600000 --recursive lib_test/test/stability", + "test:integration": "npm run build:test && mocha -t 30000 lib_test/test/CiTests.js", + "test:stability": "npm run build:test && mocha -t 600000 --recursive lib_test/test/stability", "test:unit": "npm run test:unit:browser", - "test:unit:browser": - "cd browser && tsc -p tsconfig.json && mocha --recursive ../lib_test/browser/test", - "fix-lint": - "npm run fix-lint:browser && npm run fix-lint:main && npm run fix-lint:test", - "fix-lint:browser": - "tslint --fix --project browser/tsconfig.json --config tslint.json && tslint --fix --project vim/core/oni-plugin-typescript/tsconfig.json --config tslint.json", - "fix-lint:main": - "tslint --fix --project main/tsconfig.json --config tslint.json", - "fix-lint:test": - "tslint --fix --project test/tsconfig.json --config tslint.json", + "test:unit:browser": "cd browser && tsc -p tsconfig.json && mocha --recursive ../lib_test/browser/test", + "fix-lint": "npm run fix-lint:browser && npm run fix-lint:main && npm run fix-lint:test", + "fix-lint:browser": "tslint --fix --project browser/tsconfig.json --config tslint.json && tslint --fix --project vim/core/oni-plugin-typescript/tsconfig.json --config tslint.json", + "fix-lint:main": "tslint --fix --project main/tsconfig.json --config tslint.json", + "fix-lint:test": "tslint --fix --project test/tsconfig.json --config tslint.json", "lint": "npm run lint:browser && npm run lint:main && npm run lint:test", - "lint:browser": - "tslint --project browser/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", + "lint:browser": "tslint --project browser/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", "lint:main": "tslint --project main/tsconfig.json --config tslint.json", - "lint:test": - "tslint --project test/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", - "start": - "concurrently --kill-others \"npm run start-hot\" \"npm run watch:browser\" \"npm run watch:plugins\"", + "lint:test": "tslint --project test/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", + "start": "concurrently --kill-others \"npm run start-hot\" \"npm run watch:browser\" \"npm run watch:plugins\"", "start-hot": "cross-env NODE_ENV=development electron lib/main/src/main.js", "start-not-dev": "cross-env electron main.js", - "watch:browser": - "webpack-dev-server --config browser/webpack.debug.config.js --host localhost --port 8191", + "watch:browser": "webpack-dev-server --config browser/webpack.debug.config.js --host localhost --port 8191", "watch:plugins": "cd vim/core/oni-plugin-typescript && tsc --watch", "uninstall-global": "npm rm -g oni-vim", "install-global": "npm install -g oni-vim", @@ -113,7 +120,7 @@ "minimist": "1.2.0", "msgpack-lite": "0.1.26", "ocaml-language-server": "1.0.12", - "oni-api": "0.0.5", + "oni-api": "0.0.6", "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "oni-types": "0.0.4", diff --git a/yarn.lock b/yarn.lock index baae88663f..f62fe3883b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4082,9 +4082,9 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -oni-api@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.5.tgz#d690565e3dc1af8c4cfaea3a69a3896206877928" +oni-api@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.6.tgz#8f7e76394a86f564a3182ed1fb901397cb917aa2" oni-neovim-binaries@0.1.0: version "0.1.0" @@ -5029,7 +5029,7 @@ redux-batched-subscribe@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/redux-batched-subscribe/-/redux-batched-subscribe-0.1.6.tgz#de928602708df7198b4d0c98c7119df993780d59" -redux-observable@^0.17.0: +redux-observable@0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-0.17.0.tgz#23e29e3f3c39204b7ed6a14b67a29e317c03106b" From f9f59afe15f409c91a69c5750c4461df7acca26a Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 29 Nov 2017 19:07:02 -0800 Subject: [PATCH 51/63] #1007 - Add 'editor.scrollBar.cursorTick.visible' option (#1041) * Add a key to the scrollbar container * Add configuration value for cursor tick * Revert changes to BufferScrollBar * Revert change to WindowManageR * Revert container change * Revert change to BufferScrollBarContainer * Update 'getMarkers' selector to account for the 'editor.scrollBar.cursorTick.visible' option --- .../Configuration/DefaultConfiguration.ts | 2 ++ .../Configuration/IConfigurationValues.ts | 3 +++ .../UI/containers/BufferScrollBarContainer.ts | 24 ++++++++++++------- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index 6ac4f204f8..2228fc6aea 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -86,6 +86,8 @@ const BaseConfiguration: IConfigurationValues = { "editor.scrollBar.visible": true, + "editor.scrollBar.cursorTick.visible": true, + "editor.fullScreenOnStart": false, "editor.maximizeScreenOnStart": false, diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index d6bc51522f..a253771f24 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -128,6 +128,9 @@ export interface IConfigurationValues { // If true (default), the buffer scroll bar will be visible "editor.scrollBar.visible": boolean + // If true (default), the cursor tick will be shown in the scrollbar. + "editor.scrollBar.cursorTick.visible": boolean + // Allow overriding token colors for specific textmate scopes "editor.tokenColors": ITokenColorsSetting[] diff --git a/browser/src/UI/containers/BufferScrollBarContainer.ts b/browser/src/UI/containers/BufferScrollBarContainer.ts index 75ed96b39f..f5cee72b0c 100644 --- a/browser/src/UI/containers/BufferScrollBarContainer.ts +++ b/browser/src/UI/containers/BufferScrollBarContainer.ts @@ -26,22 +26,30 @@ const NoScrollBar: IBufferScrollBarProps = { visible: false, } +export const shouldIncludeCursorMarker = (state: State.IState) => { + return state.configuration["editor.scrollBar.cursorTick.visible"] +} + export const getMarkers = createSelector( - [getCurrentLine, Selectors.getErrorsForActiveFile], - (activeLine, fileErrors) => { + [getCurrentLine, Selectors.getErrorsForActiveFile, shouldIncludeCursorMarker], + (activeLine, fileErrors, includeCursor) => { const errorMarkers = fileErrors.map((e: types.Diagnostic) => ({ line: e.range.start.line || 0, height: 1, color: getColorFromSeverity(e.severity), })) - const cursorMarker: IScrollBarMarker = { - line: activeLine - 1, - height: 1, - color: "rgb(200, 200, 200)", - } + if (!includeCursor) { + return errorMarkers + } else { + const cursorMarker: IScrollBarMarker = { + line: activeLine - 1, + height: 1, + color: "rgb(200, 200, 200)", + } - return [...errorMarkers, cursorMarker] + return [...errorMarkers, cursorMarker] + } }) const mapStateToProps = (state: State.IState): IBufferScrollBarProps => { From d164220b8a6fd54cb7877c2a108f5a8a8e1fe90b Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 30 Nov 2017 06:38:06 -0800 Subject: [PATCH 52/63] Remove some extraneous logging (#1045) --- .../Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts index 0e33816541..242cd82e7f 100644 --- a/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts +++ b/browser/src/Services/SyntaxHighlighting/SyntaxHighlightReconciler.ts @@ -36,8 +36,6 @@ export class SyntaxHighlightReconciler { this._unsubscribe = this._store.subscribe(throttle(() => { - Log.info("[SyntaxHighlightReconciler] Got state update.") - const state = this._store.getState() const activeBuffer: any = editorManager.activeEditor.activeBuffer @@ -90,7 +88,7 @@ export class SyntaxHighlightReconciler { }) if (tokens.length > 0) { - Log.info("[SyntaxHighlightReconciler] Applying changes to " + tokens.length + " lines.") + Log.verbose("[SyntaxHighlightReconciler] Applying changes to " + tokens.length + " lines.") activeBuffer.updateHighlights((highlightUpdater: any) => { tokens.forEach((token) => { const line = token.line From d9694d94afcbea1401ccb719e7acccbf99aadb59 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 30 Nov 2017 06:38:17 -0800 Subject: [PATCH 53/63] Fix #1037 - Crash in GrammarLoader + go syntax file (#1043) * Fix crash in GrammarLoader; add go.json syntax file * Add README.md for go * Add default textmate file for go --- .../Configuration/DefaultConfiguration.ts | 2 + .../SyntaxHighlighting/GrammarLoader.ts | 7 +- extensions/go/README.md | 3 + extensions/go/syntaxes/go.json | 681 ++++++++++++++++++ 4 files changed, 692 insertions(+), 1 deletion(-) create mode 100644 extensions/go/README.md create mode 100644 extensions/go/syntaxes/go.json diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index 2228fc6aea..d133118d66 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -126,6 +126,8 @@ const BaseConfiguration: IConfigurationValues = { "environment.additionalPaths": [], "language.go.languageServer.command": "go-langserver", + "language.go.textMateGrammar": path.join(__dirname, "extensions", "go", "syntaxes", "go.json"), + "language.python.languageServer.command": "pyls", "language.cpp.languageServer.command": "clangd", "language.c.languageServer.command": "clangd", diff --git a/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts b/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts index f6fae9aa00..61a392f68e 100644 --- a/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts +++ b/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts @@ -2,6 +2,8 @@ import { IGrammar, Registry } from "vscode-textmate" import { configuration } from "./../Configuration" +import * as Log from "./../../Log" + export interface IGrammarLoader { getGrammarForLanguage(language: string, extension: string): Promise } @@ -11,7 +13,10 @@ export interface ExtensionToGrammarMap { [extension: string]: string } export const getPathForLanguage = (language: string, extension: string): string => { const grammar: string | ExtensionToGrammarMap = configuration.getValue("language." + language + ".textMateGrammar") - if (typeof grammar === "string") { + if (!grammar) { + Log.warn("No grammar found for language: " + language) + return null + } else if (typeof grammar === "string") { return grammar } else { return grammar[extension] || null diff --git a/extensions/go/README.md b/extensions/go/README.md new file mode 100644 index 0000000000..2c2f1791b4 --- /dev/null +++ b/extensions/go/README.md @@ -0,0 +1,3 @@ +# Go + +The syntax file for Go is from the VSCode repository: https://github.com/Microsoft/vscode/blob/master/extensions/go/syntaxes/go.json diff --git a/extensions/go/syntaxes/go.json b/extensions/go/syntaxes/go.json new file mode 100644 index 0000000000..4a62b05ef8 --- /dev/null +++ b/extensions/go/syntaxes/go.json @@ -0,0 +1,681 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-go/blob/master/grammars/go.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/atom/language-go/commit/f7c6ca60bfd9d11252560b21e9378e5f82438ce3", + "scopeName": "source.go", + "name": "Go", + "comment": "Go language", + "fileTypes": [ + "go" + ], + "foldingStartMarker": "({|\\()\\s*$", + "foldingStopMarker": "(}|\\))\\s*$", + "patterns": [ + { + "include": "#comments" + }, + { + "comment": "Interpreted string literals", + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.go" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.go" + } + }, + "name": "string.quoted.double.go", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_placeholder" + } + ] + }, + { + "comment": "Raw string literals", + "begin": "`", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.go" + } + }, + "end": "`", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.go" + } + }, + "name": "string.quoted.raw.go", + "patterns": [ + { + "include": "#string_placeholder" + } + ] + }, + { + "comment": "Syntax error receiving channels", + "match": "<\\-([\\t ]+)chan\\b", + "captures": { + "1": { + "name": "invalid.illegal.receive-channel.go" + } + } + }, + { + "comment": "Syntax error sending channels", + "match": "\\bchan([\\t ]+)<-", + "captures": { + "1": { + "name": "invalid.illegal.send-channel.go" + } + } + }, + { + "comment": "Syntax error using slices", + "match": "\\[\\](\\s+)", + "captures": { + "1": { + "name": "invalid.illegal.slice.go" + } + } + }, + { + "comment": "Syntax error numeric literals", + "match": "\\b0[0-7]*[89]\\d*\\b", + "name": "invalid.illegal.numeric.go" + }, + { + "comment": "Built-in functions", + "match": "\\b(append|cap|close|complex|copy|delete|imag|len|make|new|panic|print|println|real|recover)\\b(?=\\()", + "name": "support.function.builtin.go" + }, + { + "comment": "Function declarations", + "match": "^(\\bfunc\\b)(?:\\s+(\\([^\\)]+\\)\\s+)?(\\w+)(?=\\())?", + "captures": { + "1": { + "name": "keyword.function.go" + }, + "2": { + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#operators" + } + ] + }, + "3": { + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "entity.name.function.go" + } + ] + } + } + }, + { + "comment": "Functions", + "match": "(\\bfunc\\b)|(\\w+)(?=\\()", + "captures": { + "1": { + "name": "keyword.function.go" + }, + "2": { + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "support.function.go" + } + ] + } + } + }, + { + "comment": "Floating-point literals", + "match": "(\\.\\d+([Ee][-+]\\d+)?i?)\\b|\\b\\d+\\.\\d*(([Ee][-+]\\d+)?i?\\b)?", + "name": "constant.numeric.floating-point.go" + }, + { + "comment": "Integers", + "match": "\\b((0x[0-9a-fA-F]+)|(0[0-7]+i?)|(\\d+([Ee]\\d+)?i?)|(\\d+[Ee][-+]\\d+i?))\\b", + "name": "constant.numeric.integer.go" + }, + { + "comment": "Language constants", + "match": "\\b(true|false|nil|iota)\\b", + "name": "constant.language.go" + }, + { + "begin": "\\b(package)\\s+", + "beginCaptures": { + "1": { + "name": "keyword.package.go" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "entity.name.package.go" + } + ] + }, + { + "begin": "\\b(type)\\s+", + "beginCaptures": { + "1": { + "name": "keyword.type.go" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "entity.name.type.go" + } + ] + }, + { + "begin": "\\b(import)\\s+", + "beginCaptures": { + "1": { + "name": "keyword.import.go" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "include": "#imports" + } + ] + }, + { + "begin": "\\b(var)\\s+", + "beginCaptures": { + "1": { + "name": "keyword.var.go" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "include": "#variables" + } + ] + }, + { + "match": "(?,\\s*\\w+(?:\\.\\w+)*)*)(?=\\s*=(?!=))", + "captures": { + "1": { + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+(?:\\.\\w+)*", + "name": "variable.other.assignment.go", + "captures": { + "0": { + "patterns": [ + { + "include": "#delimiters" + } + ] + } + } + }, + { + "include": "#delimiters" + } + ] + } + } + }, + { + "match": "\\w+(?:,\\s*\\w+)*(?=\\s*:=)", + "captures": { + "0": { + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "variable.other.assignment.go" + }, + { + "include": "#delimiters" + } + ] + } + } + }, + { + "comment": "Terminators", + "match": ";", + "name": "punctuation.terminator.go" + }, + { + "include": "#brackets" + }, + { + "include": "#delimiters" + }, + { + "include": "#keywords" + }, + { + "include": "#operators" + }, + { + "include": "#runes" + }, + { + "include": "#storage_types" + } + ], + "repository": { + "brackets": { + "patterns": [ + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.definition.begin.bracket.curly.go" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.definition.end.bracket.curly.go" + } + }, + "patterns": [ + { + "include": "$self" + } + ] + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.begin.bracket.round.go" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.end.bracket.round.go" + } + }, + "patterns": [ + { + "include": "$self" + } + ] + }, + { + "match": "\\[|\\]", + "name": "punctuation.definition.bracket.square.go" + } + ] + }, + "comments": { + "patterns": [ + { + "begin": "/\\*", + "end": "\\*/", + "captures": { + "0": { + "name": "punctuation.definition.comment.go" + } + }, + "name": "comment.block.go" + }, + { + "begin": "//", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.go" + } + }, + "end": "$", + "name": "comment.line.double-slash.go" + } + ] + }, + "delimiters": { + "patterns": [ + { + "match": ",", + "name": "punctuation.other.comma.go" + }, + { + "match": "\\.(?!\\.\\.)", + "name": "punctuation.other.period.go" + }, + { + "match": ":(?!=)", + "name": "punctuation.other.colon.go" + } + ] + }, + "imports": { + "patterns": [ + { + "match": "((?!\\s+\")[^\\s]*)?\\s*((\")([^\"]*)(\"))", + "captures": { + "1": { + "name": "entity.alias.import.go" + }, + "2": { + "name": "string.quoted.double.go" + }, + "3": { + "name": "punctuation.definition.string.begin.go" + }, + "4": { + "name": "entity.name.import.go" + }, + "5": { + "name": "punctuation.definition.string.end.go" + } + } + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.imports.begin.bracket.round.go" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.imports.end.bracket.round.go" + } + }, + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#imports" + } + ] + } + ] + }, + "keywords": { + "patterns": [ + { + "comment": "Flow control keywords", + "match": "\\b(break|case|continue|default|defer|else|fallthrough|for|go|goto|if|range|return|select|switch)\\b", + "name": "keyword.control.go" + }, + { + "match": "\\bchan\\b", + "name": "keyword.channel.go" + }, + { + "match": "\\bconst\\b", + "name": "keyword.const.go" + }, + { + "match": "\\bfunc\\b", + "name": "keyword.function.go" + }, + { + "match": "\\binterface\\b", + "name": "keyword.interface.go" + }, + { + "match": "\\bmap\\b", + "name": "keyword.map.go" + }, + { + "match": "\\bstruct\\b", + "name": "keyword.struct.go" + } + ] + }, + "operators": { + "comment": "Note that the order here is very important!", + "patterns": [ + { + "match": "(\\*|&)(?=\\w)", + "name": "keyword.operator.address.go" + }, + { + "match": "<\\-", + "name": "keyword.operator.channel.go" + }, + { + "match": "\\-\\-", + "name": "keyword.operator.decrement.go" + }, + { + "match": "\\+\\+", + "name": "keyword.operator.increment.go" + }, + { + "match": "(==|!=|<=|>=|<[^<]|>[^>])", + "name": "keyword.operator.comparison.go" + }, + { + "match": "(&&|\\|\\||!)", + "name": "keyword.operator.logical.go" + }, + { + "match": "(=|\\+=|\\-=|\\|=|\\^=|\\*=|/=|:=|%=|<<=|>>=|&\\^=|&=)", + "name": "keyword.operator.assignment.go" + }, + { + "match": "(\\+|\\-|\\*|/|%)", + "name": "keyword.operator.arithmetic.go" + }, + { + "match": "(&(?!\\^)|\\||\\^|&\\^|<<|>>)", + "name": "keyword.operator.arithmetic.bitwise.go" + }, + { + "match": "\\.\\.\\.", + "name": "keyword.operator.ellipsis.go" + } + ] + }, + "runes": { + "patterns": [ + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.go" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.go" + } + }, + "name": "string.quoted.rune.go", + "patterns": [ + { + "match": "\\G(\\\\([0-7]{3}|[abfnrtv\\\\'\"]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})|.)(?=')", + "name": "constant.other.rune.go" + }, + { + "match": "[^']+", + "name": "invalid.illegal.unknown-rune.go" + } + ] + } + ] + }, + "storage_types": { + "patterns": [ + { + "match": "\\bbool\\b", + "name": "storage.type.boolean.go" + }, + { + "match": "\\bbyte\\b", + "name": "storage.type.byte.go" + }, + { + "match": "\\berror\\b", + "name": "storage.type.error.go" + }, + { + "match": "\\b(complex(64|128)|float(32|64)|u?int(8|16|32|64)?)\\b", + "name": "storage.type.numeric.go" + }, + { + "match": "\\brune\\b", + "name": "storage.type.rune.go" + }, + { + "match": "\\bstring\\b", + "name": "storage.type.string.go" + }, + { + "match": "\\buintptr\\b", + "name": "storage.type.uintptr.go" + } + ] + }, + "string_escaped_char": { + "patterns": [ + { + "match": "\\\\([0-7]{3}|[abfnrtv\\\\'\"]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})", + "name": "constant.character.escape.go" + }, + { + "match": "\\\\[^0-7xuUabfnrtv\\'\"]", + "name": "invalid.illegal.unknown-escape.go" + } + ] + }, + "string_placeholder": { + "patterns": [ + { + "match": "%(\\[\\d+\\])?([\\+#\\-0\\x20]{,2}((\\d+|\\*)?(\\.?(\\d+|\\*|(\\[\\d+\\])\\*?)?(\\[\\d+\\])?)?))?[vT%tbcdoqxXUbeEfFgGsp]", + "name": "constant.other.placeholder.go" + } + ] + }, + "variables": { + "patterns": [ + { + "match": "(\\w+(?:,\\s*\\w+)*)(\\s+\\*?\\w+(?:\\.\\w+)?\\s*)?(?=\\s*=)", + "captures": { + "1": { + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "variable.other.assignment.go" + }, + { + "include": "#delimiters" + } + ] + }, + "2": { + "patterns": [ + { + "include": "$self" + } + ] + } + } + }, + { + "match": "(\\w+(?:,\\s*\\w+)*)(\\s+(\\[(\\d*|\\.\\.\\.)\\])*\\*?(<-)?\\w+(?:\\.\\w+)?\\s*[^=].*)", + "captures": { + "1": { + "patterns": [ + { + "match": "\\d\\w*", + "name": "invalid.illegal.identifier.go" + }, + { + "match": "\\w+", + "name": "variable.other.declaration.go" + }, + { + "include": "#delimiters" + } + ] + }, + "2": { + "patterns": [ + { + "include": "$self" + } + ] + } + } + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.variables.begin.bracket.round.go" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.variables.end.bracket.round.go" + } + }, + "patterns": [ + { + "include": "$self" + }, + { + "include": "#variables" + } + ] + } + ] + } + } +} \ No newline at end of file From e51fbf2d64c00f7ff5a6a3ff98dec38e15595847 Mon Sep 17 00:00:00 2001 From: Akin Date: Fri, 1 Dec 2017 00:17:45 +0000 Subject: [PATCH 54/63] add a check for . langs and split if found (#1047) javascript.jsx and typescript.tsx are very common filetypes set by vim typescript and js plugins tweaked the grammar config checker to pickup these filetypes --- browser/src/Services/SyntaxHighlighting/GrammarLoader.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts b/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts index 61a392f68e..b55db32530 100644 --- a/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts +++ b/browser/src/Services/SyntaxHighlighting/GrammarLoader.ts @@ -11,7 +11,8 @@ export interface IGrammarLoader { export interface ExtensionToGrammarMap { [extension: string]: string } export const getPathForLanguage = (language: string, extension: string): string => { - const grammar: string | ExtensionToGrammarMap = configuration.getValue("language." + language + ".textMateGrammar") + const verifiedLanguage = language.includes(".") ? language.split(".")[0] : language + const grammar: string | ExtensionToGrammarMap = configuration.getValue("language." + verifiedLanguage + ".textMateGrammar") if (!grammar) { Log.warn("No grammar found for language: " + language) From afe8755e88842469465a7c42940dbf0d9453d7f6 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Thu, 30 Nov 2017 22:29:56 -0800 Subject: [PATCH 55/63] #1006 - Hover state only on cursor moved (#1044) * Factor language state to store * Hook up new LanguageEditorIntegration model to store * Update Language store * Add HoverRequestor * Hook up Definition end-to-end, addressing case where the definition underline is out-of-date * Hook up hover * Clear hover and definition on buffer enter (actually fixing 1006) * Fix diagnostics issue * Fix issue with finding diagnostics * First round of lint fixes * Refactor to enable some unit testing * Some major re-plumbing to expose a greater surface area for unit-testing * Stub out some additional tests * Stub out tests * Fix comment * Correct NeovimEditor's subscription to mode changed event * Start creating unit test mocks * Add electron-mocha * Add 'debug' command for unit tests * Get first test green * Get first test green * Create red test for slow hover response test, and make green * Remove extra console log * Fix lint issues, and update travis CI with xfvb * Create a 'HoverRenderer', and hook up to NeovimEditor * Hook up HoverRenderer and get quick info working again end-to-end * Write failing test to exercise that hover should be hidden on mode change * Make failing unit test green * Add case to exercise a slow response after mode changing * Get test case green * Expose an 'editor.quickInfo.show' command, that can be used to explicitly show hover, ignoring the enabled setting * Fix lint issues * Move xvfb initialization to script, only run for linux * Don't render empty tooltip * Remove zip strategy for now, since it is problematic for builds --- browser/src/Editor/Editor.ts | 78 +++++ browser/src/Editor/HoverRenderer.tsx | 165 ++++++++++ browser/src/Editor/KeyboardInput.tsx | 4 +- browser/src/Editor/NeovimEditor.tsx | 101 +++--- browser/src/Input/Keyboard/Keyboard.ts | 56 ++-- browser/src/Input/Keyboard/KeyboardLayout.ts | 4 +- browser/src/Input/Keyboard/Resolvers.ts | 1 + .../LanguageClient/LanguageClientHelpers.ts | 12 +- browser/src/Redux/createStore.ts | 2 +- browser/src/Services/Language/Definition.ts | 61 ---- .../Services/Language/DefinitionRequestor.ts | 71 +++++ browser/src/Services/Language/Diagnostics.ts | 18 ++ browser/src/Services/Language/Hover.tsx | 188 ----------- .../src/Services/Language/HoverRequestor.ts | 52 +++ .../Language/LanguageEditorIntegration.ts | 183 +++++++---- .../src/Services/Language/LanguageStore.ts | 301 ++++++++++++++++++ browser/src/Services/Language/QuickInfo.ts | 52 --- .../src/Services/Language/SignatureHelp.ts | 2 +- .../addInsertModeLanguageFunctionality.ts | 44 +++ browser/src/Services/Language/index.ts | 4 +- browser/src/UI/RootComponent.tsx | 5 +- browser/src/UI/Selectors.ts | 2 +- browser/src/UI/index.tsx | 29 +- browser/src/Utility.ts | 22 ++ browser/test/Mocks/index.ts | 80 +++++ .../LanguageEditorIntegrationTests.ts | 179 +++++++++++ browser/testHelpers.js | 38 +++ build/script/travis-build.sh | 6 + package.json | 9 +- yarn.lock | 73 ++++- 30 files changed, 1367 insertions(+), 475 deletions(-) create mode 100644 browser/src/Editor/HoverRenderer.tsx create mode 100644 browser/src/Services/Language/DefinitionRequestor.ts delete mode 100644 browser/src/Services/Language/Hover.tsx create mode 100644 browser/src/Services/Language/HoverRequestor.ts create mode 100644 browser/src/Services/Language/LanguageStore.ts delete mode 100644 browser/src/Services/Language/QuickInfo.ts create mode 100644 browser/src/Services/Language/addInsertModeLanguageFunctionality.ts create mode 100644 browser/test/Mocks/index.ts create mode 100644 browser/test/Services/Language/LanguageEditorIntegrationTests.ts create mode 100644 browser/testHelpers.js diff --git a/browser/src/Editor/Editor.ts b/browser/src/Editor/Editor.ts index 8ea983f2f5..e7872aea8c 100644 --- a/browser/src/Editor/Editor.ts +++ b/browser/src/Editor/Editor.ts @@ -5,9 +5,87 @@ */ import * as Oni from "oni-api" +import { Event, IEvent } from "oni-types" export interface IEditor extends Oni.Editor { // Methods init(filesToOpen: string[]): void render(): JSX.Element } + +/** + * Base class for Editor implementations + */ +export class Editor implements Oni.Editor { + private _currentMode: string + private _onBufferEnterEvent = new Event() + private _onBufferLeaveEvent = new Event() + private _onBufferChangedEvent = new Event() + private _onBufferSavedEvent = new Event() + private _onCursorMoved = new Event() + private _onModeChangedEvent = new Event() + + public get mode(): string { + return this._currentMode + } + + public get activeBuffer(): Oni.Buffer { + return null + } + + public get onCursorMoved(): IEvent { + return this._onCursorMoved + } + + // Events + public get onModeChanged(): IEvent { + return this._onModeChangedEvent + } + + public get onBufferEnter(): IEvent { + return this._onBufferEnterEvent + } + + public get onBufferLeave(): IEvent { + return this._onBufferLeaveEvent + } + + public get onBufferChanged(): IEvent { + return this._onBufferChangedEvent + } + + public get onBufferSaved(): IEvent { + return this._onBufferSavedEvent + } + + public /* virtual */ openFile(filePath: string): Promise { + return Promise.reject("Not implemented") + } + + protected setMode(mode: Oni.Vim.Mode): void { + if (mode !== this._currentMode) { + this._currentMode = mode + this._onModeChangedEvent.dispatch(mode) + } + } + + protected notifyCursorMoved(cursor: Oni.Cursor): void { + this._onCursorMoved.dispatch(cursor) + } + + protected notifyBufferChanged(bufferChangeEvent: Oni.EditorBufferChangedEventArgs): void { + this._onBufferChangedEvent.dispatch(bufferChangeEvent) + } + + protected notifyBufferEnter(bufferEvent: Oni.EditorBufferEventArgs): void { + this._onBufferEnterEvent.dispatch(bufferEvent) + } + + protected notifyBufferLeave(bufferEvent: Oni.EditorBufferEventArgs): void { + this._onBufferLeaveEvent.dispatch(bufferEvent) + } + + protected notifyBufferSaved(bufferEvent: Oni.EditorBufferEventArgs): void { + this._onBufferSavedEvent.dispatch(bufferEvent) + } +} diff --git a/browser/src/Editor/HoverRenderer.tsx b/browser/src/Editor/HoverRenderer.tsx new file mode 100644 index 0000000000..dd13b2dc17 --- /dev/null +++ b/browser/src/Editor/HoverRenderer.tsx @@ -0,0 +1,165 @@ +/** + * Hover.tsx + */ + +import * as Oni from "oni-api" +import * as os from "os" +import * as React from "react" +import * as types from "vscode-languageserver-types" + +import { ErrorInfo } from "./../UI/components/ErrorInfo" +import { QuickInfoDocumentation, QuickInfoTitle } from "./../UI/components/QuickInfo" + +import * as Helpers from "./../Plugins/Api/LanguageClient/LanguageClientHelpers" + +import * as UI from "./../UI" +import * as Selectors from "./../UI/Selectors" + +import { Configuration } from "./../Services/Configuration" + +const HoverToolTipId = "hover-tool-tip" + +export class HoverRenderer { + + constructor( + private _editor: Oni.Editor, + private _configuration: Configuration, + ) { + } + + public showQuickInfo(hover: types.Hover, errors: types.Diagnostic[]): void { + const elem = this._renderQuickInfoElement(hover, errors) + + if (!elem) { + return + } + + const state: any = UI.store.getState() + + UI.Actions.showToolTip(HoverToolTipId, elem, { + position: { pixelX: state.cursorPixelX, pixelY: state.cursorPixelY }, + openDirection: 1, + padding: "0px", + }) + } + + public hideQuickInfo(): void { + UI.Actions.hideToolTip(HoverToolTipId) + } + + private _renderQuickInfoElement(hover: types.Hover, errors: types.Diagnostic[]): JSX.Element { + const quickInfoElements = getQuickInfoElementsFromHover(hover) + + const state: any = UI.store.getState() + const borderColor = state.colors["toolTip.border"] + + let customErrorStyle = {} + if (quickInfoElements.length > 0) { + // TODO: + customErrorStyle = { + "border-bottom": "1px solid " + borderColor, + } + } + + const errorElements = getErrorElements(errors, customErrorStyle) + + const elements = [...errorElements, ...quickInfoElements] + + if (this._configuration.getValue("experimental.editor.textMateHighlighting.debugScopes")) { + elements.push(this._getDebugScopesElement()) + } + + if (elements.length === 0) { + return null + } + + return
    +
    +
    +
    + {elements} +
    +
    +
    +
    + } + + private _getDebugScopesElement(): JSX.Element { + const editor: any = this._editor + + if (!editor || !editor.syntaxHighlighter) { + return null + } + + const cursor = editor.activeBuffer.cursor + const scopeInfo = editor.syntaxHighlighter.getHighlightTokenAt(editor.activeBuffer.id, { + line: cursor.line, + character: cursor.column, + }) + + if (!scopeInfo || !scopeInfo.scopes) { + return null + } + const items = scopeInfo.scopes.map((si: string) =>
  • {si}
  • ) + return
    +
    DEBUG: TextMate Scopes:
    +
      + {items} +
    +
    + } +} + +const getErrorElements = (errors: types.Diagnostic[], style: any): JSX.Element[] => { + if (!errors || !errors.length) { + return Selectors.EmptyArray + } else { + return [] + } +} + +const getTitleAndContents = (result: types.Hover) => { + if (!result || !result.contents) { + return null + } + + const contents = Helpers.getTextFromContents(result.contents) + + if (contents.length === 0) { + return null + } else if (contents.length === 1 && contents[0]) { + const title = contents[0].trim() + + if (!title) { + return null + } + + return { + title, + description: "", + } + } else { + + const description = [...contents] + description.shift() + const descriptionContent = description.join(os.EOL) + + return { + title: contents[0], + description: descriptionContent, + } + } +} + +const getQuickInfoElementsFromHover = (hover: types.Hover): JSX.Element[] => { + const titleAndContents = getTitleAndContents(hover) + + if (!titleAndContents) { + return Selectors.EmptyArray + } + + return [ + , + , + ] +} diff --git a/browser/src/Editor/KeyboardInput.tsx b/browser/src/Editor/KeyboardInput.tsx index 9072f9a953..f45d2ef3f1 100644 --- a/browser/src/Editor/KeyboardInput.tsx +++ b/browser/src/Editor/KeyboardInput.tsx @@ -10,7 +10,7 @@ import * as React from "react" import { connect } from "react-redux" -import { keyEventToVimKey } from "./../Input/Keyboard" +import { getKeyEventToVimKey } from "./../Input/Keyboard" import { focusManager } from "./../Services/FocusManager" import { TypingPredictionManager } from "./../Services/TypingPredictionManager" import { IState } from "./../UI/State" @@ -146,7 +146,7 @@ class KeyboardInputView extends React.PureComponent() - private _onBufferLeaveEvent = new Event() - private _onBufferChangedEvent = new Event() - private _onBufferSavedEvent = new Event() - private _onCursorMoved = new Event() - private _modeChanged$: Observable private _cursorMoved$: Observable private _cursorMovedI$: Observable @@ -84,41 +77,14 @@ export class NeovimEditor implements IEditor { private _typingPredictionManager: TypingPredictionManager = new TypingPredictionManager() private _syntaxHighlighter: ISyntaxHighlighter + private _languageIntegration: LanguageEditorIntegration private _completion: Completion + private _hoverRenderer: HoverRenderer - public get mode(): string { - return this._currentMode - } - - public get activeBuffer(): Oni.Buffer { + public /* override */ get activeBuffer(): Oni.Buffer { return this._bufferManager.getBufferById(this._lastBufferId) } - public get onCursorMoved(): IEvent { - return this._onCursorMoved - } - - // Events - public get onModeChanged(): IEvent { - return this._neovimInstance.onModeChanged - } - - public get onBufferEnter(): IEvent { - return this._onBufferEnterEvent - } - - public get onBufferLeave(): IEvent { - return this._onBufferLeaveEvent - } - - public get onBufferChanged(): IEvent { - return this._onBufferChangedEvent - } - - public get onBufferSaved(): IEvent { - return this._onBufferSavedEvent - } - // Capabilities public get neovim(): Oni.NeovimEditorCapability { return this._neovimInstance @@ -132,6 +98,8 @@ export class NeovimEditor implements IEditor { private _config = configuration, private _themeManager = getThemeManagerInstance(), ) { + super() + const services: any[] = [] this._neovimInstance = new NeovimInstance(100, 100) @@ -140,6 +108,8 @@ export class NeovimEditor implements IEditor { this._colors = new Colors(this._themeManager, this._config) + this._hoverRenderer = new HoverRenderer(this, this._config) + this._popupMenu = new NeovimPopupMenu( this._neovimInstance.onShowPopupMenu, this._neovimInstance.onHidePopupMenu, @@ -153,6 +123,13 @@ export class NeovimEditor implements IEditor { registerBuiltInCommands(commandManager, this._neovimInstance) + commandManager.registerCommand(new CallbackCommand( + "editor.quickInfo.show", + null, + null, + () => this._languageIntegration.showHover(), + )) + tasks.registerTaskProvider(commandManager) tasks.registerTaskProvider(errorService) @@ -234,28 +211,43 @@ export class NeovimEditor implements IEditor { Observable.merge(this._cursorMoved$, this._cursorMovedI$) .subscribe((cursorMoved) => { - this._onCursorMoved.dispatch(cursorMoved) + this.notifyCursorMoved(cursorMoved) }) - this._modeChanged$ = this.onModeChanged.asObservable() - - this.onModeChanged.subscribe((newMode) => this._onModeChanged(newMode)) + this._modeChanged$ = this._neovimInstance.onModeChanged.asObservable() + this._neovimInstance.onModeChanged.subscribe((newMode) => this._onModeChanged(newMode)) const bufferUpdates$ = listenForBufferUpdates(this._neovimInstance, this._bufferManager) bufferUpdates$.subscribe((bufferUpdate) => { - this._onBufferChangedEvent.dispatch(bufferUpdate) + this.notifyBufferChanged(bufferUpdate) UI.Actions.bufferUpdate(parseInt(bufferUpdate.buffer.id, 10), bufferUpdate.buffer.modified, bufferUpdate.buffer.lineCount) this._syntaxHighlighter.notifyBufferUpdate(bufferUpdate) }) addInsertModeLanguageFunctionality(this._cursorMovedI$, this._modeChanged$) - addNormalModeLanguageFunctionality(bufferUpdates$, this._cursorMoved$, this._modeChanged$) const textMateHighlightingEnabled = this._config.getValue("experimental.editor.textMateHighlighting.enabled") this._syntaxHighlighter = textMateHighlightingEnabled ? new SyntaxHighlighter() : new NullSyntaxHighlighter() this._completion = new Completion(this) + this._languageIntegration = new LanguageEditorIntegration(this, this._config, languageManager) + + this._languageIntegration.onShowHover.subscribe((hover) => { + this._hoverRenderer.showQuickInfo(hover.hover, hover.errors) + }) + + this._languageIntegration.onHideHover.subscribe(() => { + this._hoverRenderer.hideQuickInfo() + }) + + this._languageIntegration.onShowDefinition.subscribe((definition) => { + UI.Actions.setDefinition(definition.token, definition.location) + }) + + this._languageIntegration.onHideDefinition.subscribe((definition) => { + UI.Actions.hideDefinition() + }) this._render() @@ -316,6 +308,11 @@ export class NeovimEditor implements IEditor { this._syntaxHighlighter = null } + if (this._languageIntegration) { + this._languageIntegration.dispose() + this._languageIntegration = null + } + if (this._colors) { this._colors.dispose() this._colors = null @@ -416,7 +413,7 @@ export class NeovimEditor implements IEditor { } UI.Actions.setMode(newMode) - this._currentMode = newMode + this.setMode(newMode as Oni.Vim.Mode) if (newMode === "insert") { this._syntaxHighlighter.notifyStartInsertMode(this.activeBuffer) @@ -436,21 +433,21 @@ export class NeovimEditor implements IEditor { if (eventName === "BufEnter") { if (lastBuffer && lastBuffer.filePath !== buf.filePath) { - this._onBufferLeaveEvent.dispatch({ + this.notifyBufferLeave({ filePath: lastBuffer.filePath, language: lastBuffer.language, }) } this._lastBufferId = evt.bufferNumber.toString() - this._onBufferEnterEvent.dispatch(buf) + this.notifyBufferEnter(buf) UI.Actions.bufferEnter(evt.bufferNumber, evt.bufferFullPath, evt.filetype, evt.bufferTotalLines, evt.hidden, evt.listed) } else if (eventName === "BufWritePost") { // After we save we aren't modified... but we can pass it in just to be safe UI.Actions.bufferSave(evt.bufferNumber, evt.modified, evt.version) - this._onBufferSavedEvent.dispatch({ + this.notifyBufferSaved({ filePath: evt.bufferFullPath, language: evt.filetype, }) diff --git a/browser/src/Input/Keyboard/Keyboard.ts b/browser/src/Input/Keyboard/Keyboard.ts index 0439daefdd..cde79e8b65 100644 --- a/browser/src/Input/Keyboard/Keyboard.ts +++ b/browser/src/Input/Keyboard/Keyboard.ts @@ -1,34 +1,46 @@ import * as Log from "./../../Log" -import { keyboardLayout } from "./KeyboardLayout" +import { KeyboardLayoutManager } from "./KeyboardLayout" import { createMetaKeyResolver, ignoreMetaKeyResolver, KeyResolver, remapResolver } from "./Resolvers" -const rebuildResolvers = (): KeyResolver[] => { - return [ - ignoreMetaKeyResolver, - remapResolver, - createMetaKeyResolver(keyboardLayout.getCurrentKeyMap()), - ] -} +let _keyEventToVimKey: (evt: KeyboardEvent) => string | null = null + +export const getKeyEventToVimKey = () => { + if (_keyEventToVimKey) { + return _keyEventToVimKey + } + + const keyboardLayout: KeyboardLayoutManager = new KeyboardLayoutManager() + const rebuildResolvers = (): KeyResolver[] => { + return [ + ignoreMetaKeyResolver, + remapResolver, + createMetaKeyResolver(keyboardLayout.getCurrentKeyMap()), + ] + } + + let resolvers: KeyResolver[] = rebuildResolvers() -let resolvers: KeyResolver[] = rebuildResolvers() + keyboardLayout.onKeyMapChanged.subscribe(() => { + resolvers = rebuildResolvers() + }) -keyboardLayout.onKeyMapChanged.subscribe(() => { - resolvers = rebuildResolvers() -}) + const keyEventToVimKey = (evt: KeyboardEvent): string | null => { + const mappedKey = resolvers.reduce((prev: string, current) => { + if (prev === null) { + return prev + } else { + return current(evt, prev) + } + }, evt.key) -export const keyEventToVimKey = (evt: KeyboardEvent): string | null => { - const mappedKey = resolvers.reduce((prev: string, current) => { - if (prev === null) { - return prev - } else { - return current(evt, prev) + if (Log.isDebugLoggingEnabled()) { + Log.debug(`[Key event] Code: ${evt.code} Key: ${evt.key} CtrlKey: ${evt.ctrlKey} ShiftKey: ${evt.shiftKey} AltKey: ${evt.altKey} | Resolution: ${mappedKey}`) } - }, evt.key) - if (Log.isDebugLoggingEnabled()) { - Log.debug(`[Key event] Code: ${evt.code} Key: ${evt.key} CtrlKey: ${evt.ctrlKey} ShiftKey: ${evt.shiftKey} AltKey: ${evt.altKey} | Resolution: ${mappedKey}`) + return mappedKey } - return mappedKey + _keyEventToVimKey = keyEventToVimKey + return _keyEventToVimKey } diff --git a/browser/src/Input/Keyboard/KeyboardLayout.ts b/browser/src/Input/Keyboard/KeyboardLayout.ts index d627106ee9..4b36b86cb6 100644 --- a/browser/src/Input/Keyboard/KeyboardLayout.ts +++ b/browser/src/Input/Keyboard/KeyboardLayout.ts @@ -31,7 +31,7 @@ const augmentKeyMap = (keyMap: IKeyMap, language: string): IKeyMap => { return keyMap } -class KeyboardLayoutManager { +export class KeyboardLayoutManager { private _keyMap: IKeyMap = null private _onKeyMapChanged: Event = new Event() @@ -62,5 +62,3 @@ class KeyboardLayoutManager { return this._keyMap } } - -export const keyboardLayout = new KeyboardLayoutManager() diff --git a/browser/src/Input/Keyboard/Resolvers.ts b/browser/src/Input/Keyboard/Resolvers.ts index a3a4c0cda7..a8a5d04f70 100644 --- a/browser/src/Input/Keyboard/Resolvers.ts +++ b/browser/src/Input/Keyboard/Resolvers.ts @@ -47,6 +47,7 @@ export const remapResolver = (evt: KeyboardEvent, previousResolution: string | n } export const createMetaKeyResolver = (keyMap: IKeyMap) => { + return (evt: KeyboardEvent, previousResolution: string | null): null | string => { const isCharacterFromShiftKey = isShiftCharacter(keyMap, evt) const isCharacterFromAltGraphKey = isAltGraphCharacter(keyMap, evt) diff --git a/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts b/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts index f4e26a1aaa..4fd01e8174 100644 --- a/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts +++ b/browser/src/Plugins/Api/LanguageClient/LanguageClientHelpers.ts @@ -76,16 +76,20 @@ export const eventContextToCodeActionParams = (filePath: string, range: types.Ra } } -export const bufferToTextDocumentPositionParams = (buffer: Oni.Buffer) => ({ +export const createTextDocumentPositionParams = (filePath: string, line: number, column: number) => ({ textDocument: { - uri: wrapPathInFileUri(buffer.filePath), + uri: wrapPathInFileUri(filePath), }, position: { - line: buffer.cursor.line, - character: buffer.cursor.column, + line, + character: column, }, }) +export const bufferToTextDocumentPositionParams = (buffer: Oni.Buffer) => { + return createTextDocumentPositionParams(buffer.filePath, buffer.cursor.line, buffer.cursor.column) +} + export const createDidChangeTextDocumentParams = (bufferFullPath: string, lines: string[], version: number) => { const text = lines.join(os.EOL) diff --git a/browser/src/Redux/createStore.ts b/browser/src/Redux/createStore.ts index 064ac15c8e..7f5d8dcd13 100644 --- a/browser/src/Redux/createStore.ts +++ b/browser/src/Redux/createStore.ts @@ -17,7 +17,7 @@ import { RequestAnimationFrameNotifyBatcher } from "./RequestAnimationFrameNotif export const createStore = (name: string, reducer: Reducer, defaultState: TState, optionalMiddleware: Middleware[] = []): Store => { - const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"] || compose // tslint:disable-line no-string-literal + const composeEnhancers = (global["window"] && window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"]) || compose // tslint:disable-line no-string-literal const loggingMiddleware: Middleware = createLoggingMiddleware(name) diff --git a/browser/src/Services/Language/Definition.ts b/browser/src/Services/Language/Definition.ts index 17c25b988e..c37754883a 100644 --- a/browser/src/Services/Language/Definition.ts +++ b/browser/src/Services/Language/Definition.ts @@ -2,73 +2,12 @@ * Definition.ts */ -import { Observable } from "rxjs/Observable" - -import * as types from "vscode-languageserver-types" - import { editorManager } from "./../EditorManager" -import { languageManager } from "./LanguageManager" import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" -import * as Log from "./../../Log" - import * as UI from "./../../UI" -export const initDefinitionUI = (shouldHide$: Observable, shouldUpdate$: Observable) => { - shouldHide$.subscribe(() => UI.Actions.hideDefinition()) - - shouldUpdate$ - .flatMap(async () => await getDefinition()) - .subscribe((definitionResult: any) => { - if (!definitionResult || !definitionResult.result) { - UI.Actions.hideDefinition() - } else { - const result: types.Location | types.Location[] = definitionResult.result - - if (!result) { - return - } - - if (result instanceof Array) { - if (!result.length) { - return - } - - UI.Actions.setDefinition(definitionResult.token, result[0]) - } else { - UI.Actions.setDefinition(definitionResult.token, result) - } - } - }) -} - -export const getDefinition = async () => { - - const activeBuffer = editorManager.activeEditor.activeBuffer - - if (activeBuffer && languageManager.isLanguageServerAvailable(activeBuffer.language)) { - const args = { ...Helpers.bufferToTextDocumentPositionParams(activeBuffer) } - - const { line, column } = activeBuffer.cursor - const token = await activeBuffer.getTokenAt(line, column) - let result: types.Location = null - - try { - result = await languageManager.sendLanguageServerRequest(activeBuffer.language, activeBuffer.filePath, "textDocument/definition", args) - } catch (ex) { - Log.warn(ex) - } - - return { - token, - result, - } - } else { - return null - } -} - export enum OpenType { NewTab = 0, SplitVertical = 1, diff --git a/browser/src/Services/Language/DefinitionRequestor.ts b/browser/src/Services/Language/DefinitionRequestor.ts new file mode 100644 index 0000000000..5dee8a77ca --- /dev/null +++ b/browser/src/Services/Language/DefinitionRequestor.ts @@ -0,0 +1,71 @@ +/** + * DefinitionRequestor.ts + * + * Abstraction over the action of requesting a definition + */ + +import * as types from "vscode-languageserver-types" + +import * as Oni from "oni-api" + +import * as Log from "./../../Log" +import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" + +import { LanguageManager } from "./LanguageManager" + +export interface IDefinitionResult { + location: types.Location | null + token: Oni.IToken | null +} + +export interface IDefinitionRequestor { + getDefinition(fileLanguage: string, filePath: string, line: number, column: number): Promise +} + +export class LanguageServiceDefinitionRequestor { + + constructor( + private _languageManager: LanguageManager, + private _editor: Oni.Editor, + ) { } + + public async getDefinition(fileLanguage: string, filePath: string, line: number, column: number): Promise { + const args = { ...Helpers.createTextDocumentPositionParams(filePath, line, column) } + + const token: Oni.IToken = await this._editor.activeBuffer.getTokenAt(line, column) + + if (!token) { + return { + token: null, + location: null, + } + } + + let result: types.Location | types.Location[] = null + try { + result = await this._languageManager.sendLanguageServerRequest(fileLanguage, filePath, "textDocument/definition", args) + } catch (ex) { + Log.warn(ex) + } + + return { + location: getFirstLocationFromArray(result), + token, + } + } +} + +export const getFirstLocationFromArray = (result: types.Location | types.Location[]): types.Location => { + if (!result) { + return null + } + + if (result instanceof Array) { + if (!result.length) { + return null + } + return result[0] + } + + return result +} diff --git a/browser/src/Services/Language/Diagnostics.ts b/browser/src/Services/Language/Diagnostics.ts index dd6eb95527..07963b92b4 100644 --- a/browser/src/Services/Language/Diagnostics.ts +++ b/browser/src/Services/Language/Diagnostics.ts @@ -7,16 +7,34 @@ import * as types from "vscode-languageserver-types" import * as UI from "./../../UI" +import * as Selectors from "./../../UI/Selectors" import { ILanguageServerNotificationResponse, languageManager } from "./LanguageManager" import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" +import * as Utility from "./../../Utility" + interface IPublishDiagnosticsParams { uri: string diagnostics: types.Diagnostic[] } +export interface IDiagnosticsDataSource { + getErrorsForPosition(filePath: string, line: number, column: number): types.Diagnostic[] +} + +export class DiagnosticsDataSource { + public getErrorsForPosition(filePath: string, line: number, column: number): types.Diagnostic[] { + const state: any = UI.store.getState() + const errors = Selectors.getAllErrorsForFile(Utility.normalizePath(filePath), state.errors) + + return errors.filter((diagnostic) => { + return Utility.isInRange(line, column, diagnostic.range) + }) + } +} + export const listenForDiagnostics = () => { languageManager.subscribeToLanguageServerNotification("textDocument/publishDiagnostics", (args: ILanguageServerNotificationResponse) => { const test = args.payload as IPublishDiagnosticsParams diff --git a/browser/src/Services/Language/Hover.tsx b/browser/src/Services/Language/Hover.tsx deleted file mode 100644 index 90b2450312..0000000000 --- a/browser/src/Services/Language/Hover.tsx +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Hover.tsx - */ - -import * as os from "os" - -import * as React from "react" - -import { Observable } from "rxjs/Observable" - -import "rxjs/add/operator/combineLatest" - -import * as isEqual from "lodash/isEqual" - -import * as types from "vscode-languageserver-types" - -import { getQuickInfo } from "./QuickInfo" - -import { ErrorInfo } from "./../../UI/components/ErrorInfo" -import { QuickInfoDocumentation, QuickInfoTitle } from "./../../UI/components/QuickInfo" - -import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" - -import * as UI from "./../../UI" -import * as Selectors from "./../../UI/Selectors" -import * as Utility from "./../../Utility" - -import { IResultWithPosition } from "./LanguageClientTypes" - -import { configuration } from "./../Configuration" -import { editorManager } from "./../EditorManager" - -export const initHoverUI = (shouldHide$: Observable, shouldUpdate$: Observable) => { - - const hoverToolTipId = "hover-tool-tip" - - shouldUpdate$.subscribe(() => UI.Actions.hideToolTip(hoverToolTipId)) - shouldHide$.subscribe(() => UI.Actions.hideToolTip(hoverToolTipId)) - - const shouldUpdateQuickInfo$ = shouldUpdate$ - .debounceTime(configuration.getValue("editor.quickInfo.delay")) - - const quickInfoResults$ = Utility.ignoreWhilePendingPromise(shouldUpdateQuickInfo$, () => getQuickInfo()) - - const errors$ = UI.state$ - .filter((state) => state.mode === "normal") - .map((state) => Selectors.getErrorsForPosition(state)) - .distinctUntilChanged(isEqual) - - quickInfoResults$ - .withLatestFrom(quickInfoResults$, errors$) - .subscribe((args: [any, IResultWithPosition, types.Diagnostic[]]) => { - const [, result, errors] = args - - const activeCursor = editorManager.activeEditor.activeBuffer.cursor - - let hover = null - - if (result && (result.position.line === activeCursor.line && result.position.character === activeCursor.column)) { - hover = result.result - } - - if (hover || (errors && errors.length)) { - const state: any = UI.store.getState() - const elem = renderQuickInfo(hover, errors) - UI.Actions.showToolTip(hoverToolTipId, elem, { - position: { pixelX: state.cursorPixelX, pixelY: state.cursorPixelY }, - openDirection: 1, - padding: "0px", - }) - } else { - UI.Actions.hideToolTip(hoverToolTipId) - } - }) -} - -export const renderQuickInfo = (hover: types.Hover, errors: types.Diagnostic[]) => { - const quickInfoElements = getQuickInfoElementsFromHover(hover) - - const state: any = UI.store.getState() - const borderColor = state.colors["toolTip.border"] - - let customErrorStyle = { } - if (quickInfoElements.length > 0) { - // TODO: - customErrorStyle = { - "border-bottom": "1px solid " + borderColor, - } - } - - const errorElements = getErrorElements(errors, customErrorStyle) - - const elements = [...errorElements, ...quickInfoElements ] - - if (configuration.getValue("experimental.editor.textMateHighlighting.debugScopes")) { - elements.push(getDebugScopesElement()) - } - - return
    -
    -
    -
    - {elements} -
    -
    -
    -
    -} - -const getDebugScopesElement = (): JSX.Element => { - const editor: any = editorManager.activeEditor - - if (!editor || !editor.syntaxHighlighter) { - return null - } - - const cursor = editorManager.activeEditor.activeBuffer.cursor - const scopeInfo = editor.syntaxHighlighter.getHighlightTokenAt(editorManager.activeEditor.activeBuffer.id, { - line: cursor.line, - character: cursor.column, - }) - - if (!scopeInfo || !scopeInfo.scopes) { - return null - } - const items = scopeInfo.scopes.map((si: string) =>
  • {si}
  • ) - return
    -
    DEBUG: TextMate Scopes:
    -
      - {items} -
    -
    -} - -const getErrorElements = (errors: types.Diagnostic[], style: any): JSX.Element[] => { - if (!errors || !errors.length) { - return Selectors.EmptyArray - } else { - return [] - } - -} -// -const getTitleAndContents = (result: types.Hover) => { - if (!result || !result.contents) { - return null - } - - const contents = Helpers.getTextFromContents(result.contents) - - if (contents.length === 0) { - return null - } else if (contents.length === 1 && contents[0]) { - const title = contents[0].trim() - - if (!title) { - return null - } - - return { - title, - description: "", - } - } else { - - const description = [...contents] - description.shift() - const descriptionContent = description.join(os.EOL) - - return { - title: contents[0], - description: descriptionContent, - } - } -} - -const getQuickInfoElementsFromHover = (hover: types.Hover): JSX.Element[] => { - const titleAndContents = getTitleAndContents(hover) - - if (!titleAndContents) { - return Selectors.EmptyArray - } - - return [ - , - , - ] -} diff --git a/browser/src/Services/Language/HoverRequestor.ts b/browser/src/Services/Language/HoverRequestor.ts new file mode 100644 index 0000000000..dea3ccfe10 --- /dev/null +++ b/browser/src/Services/Language/HoverRequestor.ts @@ -0,0 +1,52 @@ +/** + * HoverRequestor.ts + * + * Abstraction over the action of requesting a definition + */ + +import * as types from "vscode-languageserver-types" + +import * as Log from "./../../Log" +import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" + +import { LanguageManager } from "./LanguageManager" + +import { DiagnosticsDataSource, IDiagnosticsDataSource } from "./Diagnostics" + +export interface IHoverResult { + hover: types.Hover + errors: types.Diagnostic[] +} + +export interface IHoverRequestor { + getHover(fileLanguage: string, filePath: string, line: number, column: number): Promise +} + +export class LanguageServiceHoverRequestor { + + constructor( + private _languageManager: LanguageManager, + private _diagnostics: IDiagnosticsDataSource = new DiagnosticsDataSource(), + ) { } + + public async getHover(language: string, filePath: string, line: number, column: number): Promise { + const args = { ...Helpers.createTextDocumentPositionParams(filePath, line, column) } + + let result: types.Hover = null + + if (this._languageManager.isLanguageServerAvailable(language)) { + try { + result = await this._languageManager.sendLanguageServerRequest(language, filePath, "textDocument/hover", args) + } catch (ex) { + Log.warn(ex) + } + } + + const latestErrors = this._diagnostics.getErrorsForPosition(filePath, line, column) + + return { + hover: result, + errors: latestErrors, + } + } +} diff --git a/browser/src/Services/Language/LanguageEditorIntegration.ts b/browser/src/Services/Language/LanguageEditorIntegration.ts index f1808c674c..5a35b29295 100644 --- a/browser/src/Services/Language/LanguageEditorIntegration.ts +++ b/browser/src/Services/Language/LanguageEditorIntegration.ts @@ -5,77 +5,132 @@ * and hooking up the language service functionality. */ -import * as isEqual from "lodash/isEqual" - -import "rxjs/add/observable/never" -import { Observable } from "rxjs/Observable" +import { Store, Unsubscribe } from "redux" import * as Oni from "oni-api" +import * as OniTypes from "oni-types" + +import { Configuration } from "./../Configuration" + +import { createStore, DefaultLanguageState, ILanguageState } from "./LanguageStore" + +import { LanguageManager } from "./LanguageManager" + +import { IDefinitionRequestor, IDefinitionResult, LanguageServiceDefinitionRequestor } from "./DefinitionRequestor" +import { IHoverRequestor, IHoverResult, LanguageServiceHoverRequestor } from "./HoverRequestor" + +export class LanguageEditorIntegration implements OniTypes.IDisposable { + + private _subscriptions: OniTypes.IDisposable[] = [] + private _store: Store + private _storeUnsubscribe: Unsubscribe = null + private _lastState: ILanguageState = DefaultLanguageState + + private _onShowDefinition: OniTypes.Event = new OniTypes.Event() + private _onHideDefinition: OniTypes.Event = new OniTypes.Event() + + private _onShowHover: OniTypes.Event = new OniTypes.Event() + private _onHideHover: OniTypes.Event = new OniTypes.Event() + + public get onShowDefinition(): OniTypes.IEvent { + return this._onShowDefinition + } + public get onHideDefinition(): OniTypes.IEvent { + return this._onHideDefinition + } + + public get onShowHover(): OniTypes.IEvent { + return this._onShowHover + } + public get onHideHover(): OniTypes.IEvent { + return this._onHideHover + } + + constructor( + private _editor: Oni.Editor, + private _configuration: Configuration, + private _languageManager?: LanguageManager, + private _definitionRequestor?: IDefinitionRequestor, + private _hoverRequestor?: IHoverRequestor, + ) { + + this._definitionRequestor = this._definitionRequestor || new LanguageServiceDefinitionRequestor(this._languageManager, this._editor) + this._hoverRequestor = this._hoverRequestor || new LanguageServiceHoverRequestor(this._languageManager) + + this._store = createStore(this._configuration, this._hoverRequestor, this._definitionRequestor) + + const sub1 = this._editor.onModeChanged.subscribe((newMode: string) => { + this._store.dispatch({ + type: "MODE_CHANGED", + mode: newMode, + }) + }) -import { editorManager } from "./../EditorManager" -import * as Definition from "./Definition" -import * as Hover from "./Hover" -import * as SignatureHelp from "./SignatureHelp" - -export const addNormalModeLanguageFunctionality = (bufferUpdates$: Observable, cursorMoved$: Observable, modeChanged$: Observable) => { - - const latestPositionAndVersion$ = - bufferUpdates$ - .combineLatest(cursorMoved$, modeChanged$) - .map((combined: any[]) => { - const [bufferEvent, cursorPosition, mode] = combined - return { - language: bufferEvent.buffer.language, - filePath: bufferEvent.buffer.filePath, - version: bufferEvent.buffer.version, - line: cursorPosition.line, - column: cursorPosition.column, - mode, - } - }) - .distinctUntilChanged(isEqual) - - const shouldUpdateNormalModeAdorners$ = latestPositionAndVersion$ - .withLatestFrom(modeChanged$) - .filter((combinedArgs: [any, string]) => { - const [, mode] = combinedArgs - return mode === "normal" + const sub2 = this._editor.onBufferEnter.subscribe((bufferEvent: Oni.EditorBufferEventArgs) => { + this._store.dispatch({ + type: "BUFFER_ENTER", + filePath: bufferEvent.filePath, + language: bufferEvent.language, + }) }) - .map((combinedArgs: [any, string]) => { - const [val ] = combinedArgs - return val + + // TODO: Promote cursor moved to API + const sub3 = (this._editor as any).onCursorMoved.subscribe((cursorMoveEvent: Oni.Cursor) => { + this._store.dispatch({ + type: "CURSOR_MOVED", + line: cursorMoveEvent.line, + column: cursorMoveEvent.column, + }) }) - Definition.initDefinitionUI(latestPositionAndVersion$, shouldUpdateNormalModeAdorners$) - Hover.initHoverUI(latestPositionAndVersion$, shouldUpdateNormalModeAdorners$) -} + this._storeUnsubscribe = this._store.subscribe(() => this._onStateUpdate(this._store.getState())) -export interface ILatestCursorAndBufferInfo { - filePath: string, - language: string, - cursorLine: number, - contents: string, - cursorColumn: number, -} + this._subscriptions = [sub1, sub2, sub3] + } -export const addInsertModeLanguageFunctionality = (cursorMoved$: Observable, modeChanged$: Observable) => { - - const latestCursorAndBufferInfo$: Observable = cursorMoved$ - .auditTime(10) - .mergeMap(async (cursorPos) => { - const editor = editorManager.activeEditor - const buffer = editor.activeBuffer - - const changedLines: string[] = await buffer.getLines(cursorPos.line, cursorPos.line + 1) - const changedLine = changedLines[0] - return { - filePath: buffer.filePath, - language: buffer.language, - cursorLine: cursorPos.line, - contents: changedLine, - cursorColumn: cursorPos.column, - } - }) + // Explicit gesture to show hover - ignores the setting + public showHover(): void { + const state = this._store.getState() + this._store.dispatch({ + type: "HOVER_QUERY", + location: { + filePath: state.activeBuffer.filePath, + language: state.activeBuffer.language, + line: state.cursor.line, + column: state.cursor.column, + }, + }) + } + + public dispose(): void { + if (this._subscriptions && this._subscriptions.length) { + this._subscriptions.forEach((disposable) => disposable.dispose()) + this._subscriptions = null + } + + if (this._storeUnsubscribe) { + this._storeUnsubscribe() + this._storeUnsubscribe = null + } + } + + private _onStateUpdate(newState: ILanguageState): void { + if (newState.definitionResult.result && !this._lastState.definitionResult.result) { + this._onShowDefinition.dispatch(newState.definitionResult.result) + } + + if (!newState.definitionResult.result && this._lastState.definitionResult.result) { + this._onHideDefinition.dispatch() + } + + if (newState.hoverResult.result && !this._lastState.hoverResult.result) { + this._onShowHover.dispatch(newState.hoverResult.result) + } + + if (!newState.hoverResult.result && this._lastState.hoverResult.result) { + this._onHideHover.dispatch() + } - SignatureHelp.initUI(latestCursorAndBufferInfo$, modeChanged$) + this._lastState = newState + } } diff --git a/browser/src/Services/Language/LanguageStore.ts b/browser/src/Services/Language/LanguageStore.ts new file mode 100644 index 0000000000..94536aac30 --- /dev/null +++ b/browser/src/Services/Language/LanguageStore.ts @@ -0,0 +1,301 @@ +/** + * LanguageStore.ts + * + * Manages state for UI-facing elements, like + * hover & definition + */ + +import "rxjs/add/observable/of" +import { Observable } from "rxjs/Observable" + +import { combineReducers, Reducer, Store } from "redux" +import { combineEpics, createEpicMiddleware, Epic } from "redux-observable" + +import { createStore as oniCreateStore } from "./../../Redux" + +import { Configuration } from "./../Configuration" + +import { IDefinitionRequestor, IDefinitionResult } from "./DefinitionRequestor" +import { IHoverRequestor, IHoverResult } from "./HoverRequestor" + +export interface ILocation { + filePath: string + language: string + line: number + column: number +} + +export interface ILocationBasedResult extends ILocation { + result: T | null +} + +export const DefaultLocationBasedResult: ILocationBasedResult = { + filePath: null, + language: null, + line: -1, + column: -1, + result: null, +} + +export interface IActiveBufferState { + filePath: string + language: string +} + +export const DefaultActiveBuffer: IActiveBufferState = { + filePath: null, + language: null, +} + +export interface ICursorPositionState { + line: number + column: number +} + +export const DefaultCursorPosition: ICursorPositionState = { + line: -1, + column: -1, +} + +export type HoverResult = ILocationBasedResult +export type DefinitionResult = ILocationBasedResult + +export interface ILanguageState { + mode: string + activeBuffer: IActiveBufferState + cursor: ICursorPositionState + hoverResult: HoverResult + definitionResult: DefinitionResult +} + +export const DefaultLanguageState: ILanguageState = { + mode: "", + activeBuffer: DefaultActiveBuffer, + cursor: DefaultCursorPosition, + hoverResult: DefaultLocationBasedResult, + definitionResult: DefaultLocationBasedResult, +} + +export type LanguageAction = { + type: "MODE_CHANGED", + mode: string, +} | { + type: "CURSOR_MOVED", + line: number, + column: number, + } | { + type: "BUFFER_ENTER", + filePath: string, + language: string, + } | { + type: "HOVER_QUERY", + location: ILocation, + } | { + type: "DEFINITION_QUERY", + location: ILocation, + } | { + type: "HOVER_QUERY_RESULT", + result: ILocationBasedResult, + } | { + type: "DEFINITION_QUERY_RESULT", + result: ILocationBasedResult, + } + +export const modeReducer: Reducer = ( + state: string = null, + action: LanguageAction, +) => { + switch (action.type) { + case "MODE_CHANGED": + return action.mode + default: + return state + } +} + +export const activeBufferReducer: Reducer = ( + state: IActiveBufferState = DefaultActiveBuffer, + action: LanguageAction, +) => { + switch (action.type) { + case "BUFFER_ENTER": + return { + ...state, + filePath: action.filePath, + language: action.language, + } + default: + return state + } +} + +export const cursorMovedReducer: Reducer = ( + state: ICursorPositionState = DefaultCursorPosition, + action: LanguageAction, +) => { + switch (action.type) { + case "CURSOR_MOVED": + return { + ...state, + line: action.line, + column: action.column, + } + default: + return state + } +} + +export const hoverResultReducer: Reducer = ( + state: HoverResult = DefaultLocationBasedResult, + action: LanguageAction, +) => { + switch (action.type) { + case "HOVER_QUERY_RESULT": + return action.result + case "CURSOR_MOVED": + case "BUFFER_ENTER": + case "MODE_CHANGED": + return DefaultLocationBasedResult + default: + return state + } +} + +export const definitionResultReducer: Reducer = ( + state: DefinitionResult = DefaultLocationBasedResult, + action: LanguageAction, +) => { + switch (action.type) { + case "DEFINITION_QUERY_RESULT": + return action.result + case "CURSOR_MOVED": + case "BUFFER_ENTER": + case "MODE_CHANGED": + return DefaultLocationBasedResult + default: + return state + } +} + +export const languageStateReducer = combineReducers({ + mode: modeReducer, + activeBuffer: activeBufferReducer, + cursor: cursorMovedReducer, + definitionResult: definitionResultReducer, + hoverResult: hoverResultReducer, +}) + +export const createStore = (configuration: Configuration, hoverRequestor: IHoverRequestor, definitionRequestor: IDefinitionRequestor): Store => { + + const epicMiddleware = createEpicMiddleware(combineEpics( + queryForDefinitionAndHoverEpic(configuration), + queryDefinitionEpic(definitionRequestor), + queryHoverEpic(hoverRequestor), + )) + + return oniCreateStore("LANGUAGE", languageStateReducer, DefaultLanguageState, [epicMiddleware]) +} + +export const queryForDefinitionAndHoverEpic = (configuration: Configuration): Epic => (action$, store) => + action$.ofType("CURSOR_MOVED") + .filter(() => store.getState().mode === "normal" && configuration.getValue("editor.quickInfo.enabled")) + .debounceTime(configuration.getValue("editor.quickInfo.delay")) + .filter(() => store.getState().mode === "normal") + .mergeMap((action: LanguageAction) => { + + const currentState = store.getState() + const filePath = currentState.activeBuffer.filePath + const language = currentState.activeBuffer.language + const line = currentState.cursor.line + const column = currentState.cursor.column + + const location = { + filePath, + language, + line, + column, + } + + const hoverObservable = Observable.of({ + type: "HOVER_QUERY", + location, + } as LanguageAction) + + const queryObservable = Observable.of({ + type: "DEFINITION_QUERY", + location, + } as LanguageAction) + + return Observable.merge(hoverObservable, queryObservable) + }) + +export const NullAction = { type: null } as LanguageAction + +export const doesLocationBasedResultMatchCursorPosition = (result: ILocationBasedResult, state: ILanguageState) => { + return result.filePath === state.activeBuffer.filePath + && result.line === state.cursor.line + && result.column === state.cursor.column + && state.mode === "normal" +} + +export const queryDefinitionEpic = (definitionRequestor: IDefinitionRequestor): Epic => (action$, store) => + action$.ofType("DEFINITION_QUERY") + .switchMap(() => { + + const state = store.getState() + + const { filePath, language } = state.activeBuffer + const { line, column } = state.cursor + + return Observable.defer(async () => { + + const result = await definitionRequestor.getDefinition(language, filePath, line, column) + return { + type: "DEFINITION_QUERY_RESULT", + result: { + filePath, + language, + line, + column, + result, + }, + } as LanguageAction + }) + }) + .filter((action) => { + if (action.type !== "DEFINITION_QUERY_RESULT") { + return false + } + + return doesLocationBasedResultMatchCursorPosition(action.result, store.getState()) + }) + +export const queryHoverEpic = (hoverRequestor: IHoverRequestor): Epic => (action$, store) => + action$.ofType("HOVER_QUERY") + .switchMap(() => { + const state = store.getState() + + const { filePath, language } = state.activeBuffer + const { line, column } = state.cursor + + return Observable.defer(async () => { + const result = await hoverRequestor.getHover(language, filePath, line, column) + return { + type: "HOVER_QUERY_RESULT", + result: { + filePath, + language, + line, + column, + result, + }, + } as LanguageAction + }) + }) + .filter((action) => { + if (action.type !== "HOVER_QUERY_RESULT") { + return false + } + + return doesLocationBasedResultMatchCursorPosition(action.result, store.getState()) + }) diff --git a/browser/src/Services/Language/QuickInfo.ts b/browser/src/Services/Language/QuickInfo.ts deleted file mode 100644 index 64c52df118..0000000000 --- a/browser/src/Services/Language/QuickInfo.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * QuickInfo.ts - * - */ - -import * as types from "vscode-languageserver-types" - -import * as Log from "./../../Log" -import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" - -import { configuration } from "./../Configuration" -import { editorManager } from "./../EditorManager" - -import { languageManager } from "./LanguageManager" - -import { IResultWithPosition } from "./LanguageClientTypes" - -export const getQuickInfo = async (): Promise> => { - const buffer = editorManager.activeEditor.activeBuffer - const { language, filePath } = buffer - const { line, column } = buffer.cursor - - if (!configuration.getValue("editor.quickInfo.enabled")) { - return null - } - - if (languageManager.isLanguageServerAvailable(language)) { - - const args = { - textDocument: { - uri: Helpers.wrapPathInFileUri(filePath), - }, - position: { - line, - character: column, - }, - } - - let result: IResultWithPosition = null - try { - const hoverResult = await languageManager.sendLanguageServerRequest(language, filePath, "textDocument/hover", args) - result = { - position: types.Position.create(line, column), - result: hoverResult, - } - } catch (ex) { Log.debug(ex) } - - return result - } else { - return null - } -} diff --git a/browser/src/Services/Language/SignatureHelp.ts b/browser/src/Services/Language/SignatureHelp.ts index aab92b5c62..a6ceb700b5 100644 --- a/browser/src/Services/Language/SignatureHelp.ts +++ b/browser/src/Services/Language/SignatureHelp.ts @@ -14,7 +14,7 @@ import * as UI from "./../../UI" import { editorManager } from "./../EditorManager" -import { ILatestCursorAndBufferInfo } from "./LanguageEditorIntegration" +import { ILatestCursorAndBufferInfo } from "./addInsertModeLanguageFunctionality" import { languageManager } from "./LanguageManager" import * as SignatureHelp from "./SignatureHelpView" diff --git a/browser/src/Services/Language/addInsertModeLanguageFunctionality.ts b/browser/src/Services/Language/addInsertModeLanguageFunctionality.ts new file mode 100644 index 0000000000..bb579f8b00 --- /dev/null +++ b/browser/src/Services/Language/addInsertModeLanguageFunctionality.ts @@ -0,0 +1,44 @@ +/** + * LanguageEditorIntegration + * + * Responsible for listening to editor events, + * and hooking up the language service functionality. + */ + +import "rxjs/add/observable/never" +import { Observable } from "rxjs/Observable" + +import * as Oni from "oni-api" + +import { editorManager } from "./../EditorManager" +import * as SignatureHelp from "./SignatureHelp" + +export interface ILatestCursorAndBufferInfo { + filePath: string, + language: string, + cursorLine: number, + contents: string, + cursorColumn: number, +} + +export const addInsertModeLanguageFunctionality = (cursorMoved$: Observable, modeChanged$: Observable) => { + + const latestCursorAndBufferInfo$: Observable = cursorMoved$ + .auditTime(10) + .mergeMap(async (cursorPos) => { + const editor = editorManager.activeEditor + const buffer = editor.activeBuffer + + const changedLines: string[] = await buffer.getLines(cursorPos.line, cursorPos.line + 1) + const changedLine = changedLines[0] + return { + filePath: buffer.filePath, + language: buffer.language, + cursorLine: cursorPos.line, + contents: changedLine, + cursorColumn: cursorPos.column, + } + }) + + SignatureHelp.initUI(latestCursorAndBufferInfo$, modeChanged$) +} diff --git a/browser/src/Services/Language/index.ts b/browser/src/Services/Language/index.ts index 53a4733a44..e956dabaed 100644 --- a/browser/src/Services/Language/index.ts +++ b/browser/src/Services/Language/index.ts @@ -1,14 +1,16 @@ +export * from "./addInsertModeLanguageFunctionality" export * from "./CodeAction" export * from "./Definition" +export * from "./DefinitionRequestor" export * from "./Diagnostics" export * from "./Edits" export * from "./FindAllReferences" export * from "./Formatting" +export * from "./HoverRequestor" export * from "./LanguageClientProcess" export * from "./LanguageConfiguration" export * from "./LanguageEditorIntegration" export * from "./LanguageManager" -export * from "./QuickInfo" export * from "./Rename" export * from "./SignatureHelp" export * from "./Symbols" diff --git a/browser/src/UI/RootComponent.tsx b/browser/src/UI/RootComponent.tsx index 3704e1dbde..85dfd6f3c2 100644 --- a/browser/src/UI/RootComponent.tsx +++ b/browser/src/UI/RootComponent.tsx @@ -2,7 +2,7 @@ import * as React from "react" import * as Platform from "./../Platform" -import { keyEventToVimKey } from "./../Input/Keyboard" +import { getKeyEventToVimKey } from "./../Input/Keyboard" import { focusManager } from "./../Services/FocusManager" import { inputManager } from "./../Services/InputManager" import { MenuContainer } from "./../Services/Menu" @@ -20,6 +20,7 @@ interface IRootComponentProps { const titleBarVisible = Platform.isMac() export class RootComponent extends React.PureComponent { + public render() { return
    this._onRootKeyDown(evt)}>
    @@ -47,7 +48,7 @@ export class RootComponent extends React.PureComponent } private _onRootKeyDown(evt: React.KeyboardEvent): void { - const vimKey = keyEventToVimKey(evt.nativeEvent) + const vimKey = getKeyEventToVimKey()(evt.nativeEvent) if (inputManager.handleKey(vimKey)) { evt.stopPropagation() evt.preventDefault() diff --git a/browser/src/UI/Selectors.ts b/browser/src/UI/Selectors.ts index 2c20c413d4..efd2b70011 100644 --- a/browser/src/UI/Selectors.ts +++ b/browser/src/UI/Selectors.ts @@ -19,7 +19,7 @@ export const EmptyArray: any[] = [] export const getErrors = (state: State.IState) => state.errors -const getAllErrorsForFile = (fileName: string, errors: State.Errors): types.Diagnostic[] => { +export const getAllErrorsForFile = (fileName: string, errors: State.Errors): types.Diagnostic[] => { if (!fileName || !errors) { return EmptyArray } diff --git a/browser/src/UI/index.tsx b/browser/src/UI/index.tsx index 0339d01d89..96bfa59160 100644 --- a/browser/src/UI/index.tsx +++ b/browser/src/UI/index.tsx @@ -12,9 +12,6 @@ import { Provider } from "react-redux" import { bindActionCreators } from "redux" import thunk from "redux-thunk" -import { Observable } from "rxjs/Observable" -import { Subject } from "rxjs/Subject" - import { RootComponent } from "./RootComponent" import * as ActionCreators from "./ActionCreators" @@ -39,10 +36,6 @@ require("./components/common.less") // tslint:disable-line no-var-requires export const store = createStore("SHELL", reducer, defaultState, [thunk]) -const _state$: Subject = new Subject() -export const state$: Observable = _state$ -store.subscribe(() => _state$.next(store.getState() as any)) - export const Actions: typeof ActionCreators = bindActionCreators(ActionCreators as any, store.dispatch) // TODO: Is there a helper utility like `bindActionCreators`, but for selectors? @@ -61,14 +54,6 @@ const updateViewport = () => { Actions.setViewport(width, height) } -// TODO: WHy is this breaking? -window.setTimeout(() => { - listenForDiagnostics() -}) - -window.addEventListener("resize", updateViewport) -updateViewport() - function render(_state: State.IState, pluginManager: PluginManager, args: any): void { const hostElement = document.getElementById("host") @@ -85,4 +70,16 @@ function render(_state: State.IState, pluginManager: PluginManager, args: any): , hostElement) } -document.body.addEventListener("click", () => focusManager.enforceFocus()) +// Don't execute code that depends on DOM in unit-tests +if (global["window"]) { // tslint:disable-line + updateViewport() + + // TODO: Why is this breaking? + window.setTimeout(() => { + listenForDiagnostics() + }) + + window.addEventListener("resize", updateViewport) + + document.body.addEventListener("click", () => focusManager.enforceFocus()) +} diff --git a/browser/src/Utility.ts b/browser/src/Utility.ts index 14f6f2a1f2..997b7c0c11 100644 --- a/browser/src/Utility.ts +++ b/browser/src/Utility.ts @@ -122,6 +122,28 @@ export const sleep = async (timeInMilliseconds: number): Promise => { }) } +export interface ICompletablePromise { + promise: Promise + resolve: (value?: T) => void + reject: (err?: Error) => void +} + +export const createCompletablePromise = (): ICompletablePromise => { + let resolve = null + let reject = null + + const promise = new Promise((res, rej) => { + resolve = res + reject = rej + }) + + return { + promise, + resolve, + reject, + } +} + /** * Helper function to ignore incoming values while a promise is waiting to complete * This is lossy, in that any input that comes in will be dropped while the promise diff --git a/browser/test/Mocks/index.ts b/browser/test/Mocks/index.ts new file mode 100644 index 0000000000..8afd18f7ec --- /dev/null +++ b/browser/test/Mocks/index.ts @@ -0,0 +1,80 @@ +/** + * Mocks/index.ts + * + * Implementations of test mocks and doubles, + * to exercise boundaries of class implementations + */ + +import { Editor } from "./../../src/Editor/Editor" +import * as Language from "./../../src/Services/Language" +import { createCompletablePromise, ICompletablePromise } from "./../../src/Utility" + +export class MockConfiguration { + + constructor( + private _configurationValues: any = {}, + ) {} + + public getValue(key: string): any { + return this._configurationValues[key] + } + + public setValue(key: string, value: any): void { + this._configurationValues[key] = value + } +} + +export class MockEditor extends Editor { + public simulateModeChange(newMode: string): void { + this.setMode(newMode as any) + } + + public simulateCursorMoved(line: number, column: number): void { + this.notifyCursorMoved({ + line, + column, + }) + } + + public simulateBufferEnter(buffer: MockBuffer): void { + this.notifyBufferEnter(buffer as any) + } +} + +export class MockBuffer { +} + +export class MockRequestor { + + private _completablePromises: Array> = [] + + public get pendingCallCount(): number { + return this._completablePromises.length + } + + public get(language: string, filePath: string, line: number, column: number): Promise { + + const newPromise = createCompletablePromise() + + this._completablePromises.push(newPromise) + + return newPromise.promise + } + + public resolve(val: T): void { + const firstPromise = this._completablePromises.shift() + firstPromise.resolve(val) + } +} + +export class MockDefinitionRequestor extends MockRequestor implements Language.IDefinitionRequestor { + public getDefinition(language: string, filePath: string, line: number, column: number): Promise { + return this.get(language, filePath, line, column) + } +} + +export class MockHoverRequestor extends MockRequestor implements Language.IHoverRequestor { + public getHover(language: string, filePath: string, line: number, column: number): Promise { + return this.get(language, filePath, line, column) + } +} diff --git a/browser/test/Services/Language/LanguageEditorIntegrationTests.ts b/browser/test/Services/Language/LanguageEditorIntegrationTests.ts new file mode 100644 index 0000000000..266c88fe9a --- /dev/null +++ b/browser/test/Services/Language/LanguageEditorIntegrationTests.ts @@ -0,0 +1,179 @@ +/** + * LanguageEditorIntegrationTests + */ + +import * as assert from "assert" + +import * as Language from "./../../../src/Services/Language" + +import * as Mocks from "./../../Mocks" + +describe("LanguageEditorIntegration", () => { + const clock: any = global["clock"] // tslint:disable-line + const waitForPromiseResolution: any = global["waitForPromiseResolution"] // tslint:disable-line + + // Mocks + let mockConfiguration: Mocks.MockConfiguration + let mockEditor: Mocks.MockEditor + let mockDefinitionRequestor: Mocks.MockDefinitionRequestor + let mockHoverRequestor: Mocks.MockHoverRequestor + + // Class under test + let languageEditorIntegration: Language.LanguageEditorIntegration + + beforeEach(() => { + mockConfiguration = new Mocks.MockConfiguration({ + "editor.quickInfo.delay": 500, + "editor.quickInfo.enabled": true, + }) + + mockEditor = new Mocks.MockEditor() + mockDefinitionRequestor = new Mocks.MockDefinitionRequestor() + mockHoverRequestor = new Mocks.MockHoverRequestor() + languageEditorIntegration = new Language.LanguageEditorIntegration(mockEditor, mockConfiguration as any, null, mockDefinitionRequestor, mockHoverRequestor) + }) + + afterEach(() => { + languageEditorIntegration.dispose() + }) + + it("shows hover and definition", async () => { + let showDefinitionCount = 0 + let showHoverCount = 0 + + languageEditorIntegration.onShowDefinition.subscribe(() => showDefinitionCount++) + languageEditorIntegration.onShowHover.subscribe(() => showHoverCount++) + + mockEditor.simulateModeChange("normal") + mockEditor.simulateBufferEnter(new Mocks.MockBuffer()) + mockEditor.simulateCursorMoved(1, 1) + + clock.tick(501) // Account for the quickInfo.delay + + assert.strictEqual(mockDefinitionRequestor.pendingCallCount, 1) + assert.strictEqual(mockHoverRequestor.pendingCallCount, 1) + + // Resolve the calls + mockDefinitionRequestor.resolve({} as any) + mockHoverRequestor.resolve({} as any) + + await waitForPromiseResolution() + + clock.runAll() + + assert.strictEqual(showDefinitionCount, 1, "Definition was shown") + assert.strictEqual(showHoverCount, 1, "Hover was shown") + }) + + it("respects editor.quickInfo.delay setting for hover", () => { + + // Get the editor primed for a request + mockEditor.simulateModeChange("normal") + mockEditor.simulateBufferEnter(new Mocks.MockBuffer()) + mockEditor.simulateCursorMoved(1, 1) + + // There shouldn't be any requests yet, because + // we haven't hit the delay.. + assert.strictEqual(mockHoverRequestor.pendingCallCount, 0, "Should be no request queued yet...") + + // Tick just before the delay.... + clock.tick(499) + + assert.strictEqual(mockHoverRequestor.pendingCallCount, 0, "Should be no request queued, right before the time limit..") + + // Tick just after the delay... + clock.tick(2) + + // There should now be a request queued up + assert.strictEqual(mockHoverRequestor.pendingCallCount, 1, "Should now be a request pending, because we've exceeded the limit") + }) + + it("doesn't show slow hover response that completes after cursor moves", async () => { + mockEditor.simulateModeChange("normal") + mockEditor.simulateBufferEnter(new Mocks.MockBuffer()) + mockEditor.simulateCursorMoved(1, 1) + + let hoverShowCount = 0 + + languageEditorIntegration.onShowHover.subscribe(() => hoverShowCount++) + + // Go past the clock timer, so we should get a request now + clock.tick(501) + + assert.strictEqual(mockHoverRequestor.pendingCallCount, 1, "Verify we have a request queued up") + + // While the request is pending, lets move the cursor + + mockEditor.simulateCursorMoved(2, 2) + + // Complete the hover request, and let the promises drain + mockHoverRequestor.resolve({} as any) + await waitForPromiseResolution() + + // Let clock drain as well + clock.runAll() + + assert.strictEqual(hoverShowCount, 0, "Hover should never be shown, because the cursor moved.") + }) + + it("doesn't show slow hover response that completes after mode changes", async () => { + mockEditor.simulateModeChange("normal") + mockEditor.simulateBufferEnter(new Mocks.MockBuffer()) + mockEditor.simulateCursorMoved(1, 1) + + let hoverShowCount = 0 + + languageEditorIntegration.onShowHover.subscribe(() => hoverShowCount++) + + // Go past the clock timer, so we should get a request now + clock.tick(501) + + assert.strictEqual(mockHoverRequestor.pendingCallCount, 1, "Verify we have a request queued up") + + // While the request is pending, lets move the cursor + + mockEditor.simulateModeChange("insert") + + // Complete the hover request, and let the promises drain + mockHoverRequestor.resolve({} as any) + await waitForPromiseResolution() + + // Let clock drain as well + clock.runAll() + + assert.strictEqual(hoverShowCount, 0, "Hover should never be shown, because the cursor moved.") + }) + + it("hides hover on mode change", async () => { + let showHoverCount = 0 + let hideHoverCount = 0 + + languageEditorIntegration.onShowHover.subscribe(() => showHoverCount++) + languageEditorIntegration.onHideHover.subscribe(() => hideHoverCount++) + + mockEditor.simulateModeChange("normal") + mockEditor.simulateBufferEnter(new Mocks.MockBuffer()) + mockEditor.simulateCursorMoved(1, 1) + + clock.tick(501) // Account for the quickInfo.delay + + assert.strictEqual(mockHoverRequestor.pendingCallCount, 1) + + // Resolve the calls + mockHoverRequestor.resolve({} as any) + + await waitForPromiseResolution() + + clock.runAll() + + assert.strictEqual(showHoverCount, 1, "Hover was shown") + assert.strictEqual(hideHoverCount, 0, "No calls to hide hover yet") + + mockEditor.simulateModeChange("cmdline") + + clock.runAll() + + assert.strictEqual(showHoverCount, 1, "Hover show count should be unchanged") + assert.strictEqual(hideHoverCount, 1, "There should now be a call to hide the hover") + }) +}) diff --git a/browser/testHelpers.js b/browser/testHelpers.js new file mode 100644 index 0000000000..0224f77717 --- /dev/null +++ b/browser/testHelpers.js @@ -0,0 +1,38 @@ +const Module = require("module") +const originalRequire = Module.prototype.require + +if (global.window) { + + const originalSetTimeout = global.setTimeout + + const lolex = require("lolex") + const clock = lolex.install() + // const createMockRaf = require("mock-raf") + // const mockRaf = createMockRaf() + + // sinon.stub(window, "requestAnimationFrame", mockRaf.raf) + + // global.mockRaf = mockRaf + + console.log("clock installed") + + global.clock = clock + + global.waitForPromiseResolution = (promise) => { + + return new Promise((res) => { + originalSetTimeout(() => res(), 1) + }) + + } +} + +console.log("Hooking require, so that we don't import .less files") +Module.prototype.require = function() { + if (arguments[0].indexOf(".less") >= 0) { + console.warn("Skipping require for: " + arguments[0]) + return + } + + return originalRequire.apply(this, arguments) +} diff --git a/build/script/travis-build.sh b/build/script/travis-build.sh index 25369c9bce..014e6c66db 100755 --- a/build/script/travis-build.sh +++ b/build/script/travis-build.sh @@ -5,6 +5,12 @@ echo Travis build - detected OS is: $TRAVIS_OS_NAME node --version npm --version +if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + export DISPLAY=:99.0 + sh -e /etc/init.d/xvfb start + sleep 3 +fi + npm run build npm run test:unit npm run lint diff --git a/package.json b/package.json index 3fbe5bbf04..8f79b28524 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,7 @@ "artifactName": "${productName}-${version}-osx.${ext}", "category": "public.app-category.developer-tools", "target": [ - "dmg", - "zip" + "dmg" ], "files": [ "bin/osx/**/*" @@ -83,13 +82,14 @@ "build:test": "cd test && tsc -p tsconfig.json", "pack": "build --publish never", "copy-icons": "node build/CopyIcons.js", + "debug:test:unit:browser": "cd browser && tsc -p tsconfig.json && electron-mocha --interactive --debug --renderer --require testHelpers.js --recursive ../lib_test/browser/test", "dist:win": "build --arch ia32 --publish never", "pack:win": "node build/BuildSetupTemplate.js && innosetup-compiler dist/setup.iss --verbose --O=dist", "test": "npm run test:unit && npm run test:integration", "test:integration": "npm run build:test && mocha -t 30000 lib_test/test/CiTests.js", "test:stability": "npm run build:test && mocha -t 600000 --recursive lib_test/test/stability", "test:unit": "npm run test:unit:browser", - "test:unit:browser": "cd browser && tsc -p tsconfig.json && mocha --recursive ../lib_test/browser/test", + "test:unit:browser": "cd browser && tsc -p tsconfig.json && electron-mocha --renderer --require testHelpers.js --recursive ../lib_test/browser/test", "fix-lint": "npm run fix-lint:browser && npm run fix-lint:main && npm run fix-lint:test", "fix-lint:browser": "tslint --fix --project browser/tsconfig.json --config tslint.json && tslint --fix --project vim/core/oni-plugin-typescript/tsconfig.json --config tslint.json", "fix-lint:main": "tslint --fix --project main/tsconfig.json --config tslint.json", @@ -136,6 +136,7 @@ "@types/color": "2.0.0", "@types/jsdom": "11.0.0", "@types/lodash": "4.14.38", + "@types/lolex": "2.1.0", "@types/minimatch": "3.0.1", "@types/minimist": "1.1.29", "@types/mkdirp": "0.3.29", @@ -158,6 +159,7 @@ "electron": "1.8.1", "electron-builder": "19.46.4", "electron-devtools-installer": "2.2.0", + "electron-mocha": "5.0.0", "electron-rebuild": "1.6.0", "extract-zip": "1.6.0", "fs-extra": "4.0.2", @@ -169,6 +171,7 @@ "less-loader": "4.0.5", "less-plugin-autoprefix": "1.5.1", "lodash": "4.17.0", + "lolex": "2.3.1", "minimatch": "3.0.4", "mkdirp": "0.5.1", "mocha": "3.1.2", diff --git a/yarn.lock b/yarn.lock index f62fe3883b..fb2ac0b1f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,6 +58,10 @@ version "4.14.38" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.38.tgz#fcbd51e740c5e260652cad975dd26c5c4151cb11" +"@types/lolex@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/lolex/-/lolex-2.1.0.tgz#7a53611a6c970574173a7d92ce9a0da000652725" + "@types/minimatch@3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.1.tgz#b683eb60be358304ef146f5775db4c0e3696a550" @@ -1315,6 +1319,10 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + commander@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" @@ -1325,6 +1333,10 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.11.0: + version "2.12.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + commander@^2.9.0: version "2.12.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.1.tgz#468635c4168d06145b9323356d1da84d14ac4a7a" @@ -1712,7 +1724,7 @@ debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.5.1, debug@^2.6.3, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.0: +debug@3.1.0, debug@^3.0.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -1808,6 +1820,10 @@ diff@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" @@ -1982,6 +1998,16 @@ electron-download@^3.0.1, electron-download@^3.1.0: semver "^5.3.0" sumchecker "^1.2.0" +electron-mocha@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/electron-mocha/-/electron-mocha-5.0.0.tgz#415b86166a6bf80125fc4106ecc2545669c284ac" + dependencies: + commander "^2.11.0" + electron-window "^0.8.0" + fs-extra "^4.0.2" + mocha "^4.0.1" + which "^1.3.0" + electron-osx-sign@0.4.7: version "0.4.7" resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.7.tgz#1d75647a82748eacd48bea70616ec83ffade3ee5" @@ -2022,6 +2048,12 @@ electron-to-chromium@^1.2.7: version "1.3.27" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" +electron-window@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/electron-window/-/electron-window-0.8.1.tgz#16ca187eb4870b0679274fc8299c5960e6ab2c5e" + dependencies: + is-electron-renderer "^2.0.0" + electron@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.1.tgz#19b6f39f2013e204a91a60bc3086dc7a4a07ed88" @@ -2694,6 +2726,10 @@ graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +growl@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" @@ -2792,6 +2828,10 @@ hawk@~6.0.2: hoek "4.x.x" sntp "2.x.x" +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -3077,6 +3117,10 @@ is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" +is-electron-renderer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz#a469d056f975697c58c98c6023eb0aa79af895a2" + is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" @@ -3590,6 +3634,10 @@ lolex@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" +lolex@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.1.tgz#3d2319894471ea0950ef64692ead2a5318cff362" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -3798,6 +3846,21 @@ mocha@3.1.2: mkdirp "0.5.1" supports-color "3.1.2" +mocha@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.0.1.tgz#0aee5a95cf69a4618820f5e51fa31717117daf1b" + dependencies: + browser-stdout "1.3.0" + commander "2.11.0" + debug "3.1.0" + diff "3.3.1" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.3" + he "1.1.1" + mkdirp "0.5.1" + supports-color "4.4.0" + moment@^2.11.2: version "2.19.2" resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.2.tgz#8a7f774c95a64550b4c7ebd496683908f9419dbe" @@ -5764,6 +5827,12 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" +supports-color@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" @@ -6467,7 +6536,7 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@1, which@^1.2.9: +which@1, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: From c76f94743c9c5383feaa01503d9a60364bf536c0 Mon Sep 17 00:00:00 2001 From: Ryan C Date: Fri, 1 Dec 2017 19:27:32 +0000 Subject: [PATCH 56/63] [WIP] Implement External Pop Up Settings. (#1022) * Start to implement External Pop Up Settings. * Fix lint issues. * Swap config setup. * Removed unused option. * Apply change to new file. --- browser/src/Editor/NeovimPopupMenu.tsx | 1 + .../Services/Completion/CompletionProvider.ts | 2 +- .../Configuration/DefaultConfiguration.ts | 4 +--- .../Configuration/IConfigurationValues.ts | 22 +++++++++++-------- browser/src/neovim/NeovimInstance.ts | 15 +++++++++---- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/browser/src/Editor/NeovimPopupMenu.tsx b/browser/src/Editor/NeovimPopupMenu.tsx index 930bb91600..d663ac4bb5 100644 --- a/browser/src/Editor/NeovimPopupMenu.tsx +++ b/browser/src/Editor/NeovimPopupMenu.tsx @@ -52,6 +52,7 @@ export class NeovimPopupMenu { } private _renderCompletionMenu(selectedIndex: number): void { + let itemsToRender: IContextMenuItem[] = [] let adjustedIndex = selectedIndex diff --git a/browser/src/Services/Completion/CompletionProvider.ts b/browser/src/Services/Completion/CompletionProvider.ts index a1e0d63c18..e53ea99a80 100644 --- a/browser/src/Services/Completion/CompletionProvider.ts +++ b/browser/src/Services/Completion/CompletionProvider.ts @@ -15,7 +15,7 @@ import * as CompletionUtility from "./CompletionUtility" export const getCompletions = async (language: string, filePath: string, line: number, character: number): Promise => { - if (!configuration.getValue("editor.completions.enabled")) { + if (configuration.getValue("editor.completions.mode") != "oni") { return null } diff --git a/browser/src/Services/Configuration/DefaultConfiguration.ts b/browser/src/Services/Configuration/DefaultConfiguration.ts index d133118d66..9a10597d71 100644 --- a/browser/src/Services/Configuration/DefaultConfiguration.ts +++ b/browser/src/Services/Configuration/DefaultConfiguration.ts @@ -56,8 +56,6 @@ const BaseConfiguration: IConfigurationValues = { "oni.loadInitVim": false, - "oni.useExternalPopupMenu": true, - "oni.hideMenu": false, "oni.exclude": ["node_modules", ".git"], @@ -72,7 +70,7 @@ const BaseConfiguration: IConfigurationValues = { "editor.quickInfo.enabled": true, "editor.quickInfo.delay": 500, - "editor.completions.enabled": true, + "editor.completions.mode": "oni", "editor.errors.slideOnFocus": true, "editor.formatting.formatOnSwitchToNormalMode": false, diff --git a/browser/src/Services/Configuration/IConfigurationValues.ts b/browser/src/Services/Configuration/IConfigurationValues.ts index a253771f24..7e5db17d68 100644 --- a/browser/src/Services/Configuration/IConfigurationValues.ts +++ b/browser/src/Services/Configuration/IConfigurationValues.ts @@ -77,14 +77,6 @@ export interface IConfigurationValues { // Set this to a string to override the init.vim path. "oni.loadInitVim": string | boolean - // Sets the `popupmenu_external` option in Neovim - // This will override the default UI to show a consistent popupmenu, - // whether using Oni's completion mechanisms or VIMs - // - // Use caution when changing the `menuopt` parameters if using - // a custom init.vim, as that may cause problematic behavior - "oni.useExternalPopupMenu": boolean - // If true, hide Menu bar by default // (can still be activated by pressing 'Alt') "oni.hideMenu": boolean @@ -113,10 +105,22 @@ export interface IConfigurationValues { // Delay (in ms) for showing QuickInfo, when the cursor is on a term "editor.quickInfo.delay": number - "editor.completions.enabled": boolean "editor.errors.slideOnFocus": boolean "editor.formatting.formatOnSwitchToNormalMode": boolean // TODO: Make this setting reliable. If formatting is slow, it will hose edits... not fun + // Sets the `popupmenu_external` option in Neovim + // Valid options are "oni", "native" or "hidden", + // where "oni" uses the Oni stylised Popups, + // "native" uses the default Vim ones, + // and "hidden" disables the automatic pop-ups, but keeps the stylised tabs when invoked. + // + // This will override the default UI to show a consistent popupmenu, + // whether using Oni's completion mechanisms or VIMs + // + // Use caution when changing the `menuopt` parameters if using + // a custom init.vim, as that may cause problematic behavior + "editor.completions.mode": string + // If true (default), ligatures are enabled "editor.fontLigatures": boolean "editor.fontSize": string diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index dc0067c997..166f2382e0 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -650,24 +650,31 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { const version = await this.getApiVersion() const useNativeTabs = configuration.getValue("tabs.mode") === "native" + const useNativePopupWindows = configuration.getValue("editor.completions.mode") === "native" const externaliseTabline = !useNativeTabs + const externalisePopupWindows = !useNativePopupWindows console.log(`Neovim version reported as ${version.major}.${version.minor}.${version.patch}`) // tslint:disable-line no-console const startupOptions = this._getStartupOptionsForVersion(version.major, version.minor, version.patch, - externaliseTabline) + externaliseTabline, + externalisePopupWindows) await this._neovim.request("nvim_ui_attach", [columns, rows, startupOptions]) } - private _getStartupOptionsForVersion(major: number, minor: number, patch: number, shouldExtTabs: boolean) { + private _getStartupOptionsForVersion(major: number, + minor: number, + patch: number, + shouldExtTabs: boolean, + shouldExtPopups: boolean) { if (major >= 0 && minor >= 2 && patch >= 1) { return { rgb: true, - popupmenu_external: true, + popupmenu_external: shouldExtPopups, ext_tabline: shouldExtTabs, } } else if (major === 0 && minor === 2) { @@ -675,7 +682,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { // See #579 for more info on the manifestation. return { rgb: true, - popupmenu_external: true, + popupmenu_external: shouldExtPopups, } } else { throw new Error("Unsupported version of Neovim.") From 76bab4e3c8e416620be434d6dfc7de7e57ae87d8 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 1 Dec 2017 11:28:34 -0800 Subject: [PATCH 57/63] Fix lint issue --- browser/src/Services/Completion/CompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/src/Services/Completion/CompletionProvider.ts b/browser/src/Services/Completion/CompletionProvider.ts index e53ea99a80..363e46e5f6 100644 --- a/browser/src/Services/Completion/CompletionProvider.ts +++ b/browser/src/Services/Completion/CompletionProvider.ts @@ -15,7 +15,7 @@ import * as CompletionUtility from "./CompletionUtility" export const getCompletions = async (language: string, filePath: string, line: number, character: number): Promise => { - if (configuration.getValue("editor.completions.mode") != "oni") { + if (configuration.getValue("editor.completions.mode") !== "oni") { return null } From 34d4cd21e4ef70bfa4bc4558145a70003701679a Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 1 Dec 2017 16:26:09 -0800 Subject: [PATCH 58/63] Completion Improvements: Unit tests + Bug Fixes (#1049) * Factor language state to store * Hook up new LanguageEditorIntegration model to store * Update Language store * Add HoverRequestor * Hook up Definition end-to-end, addressing case where the definition underline is out-of-date * Hook up hover * Clear hover and definition on buffer enter (actually fixing 1006) * Fix diagnostics issue * Fix issue with finding diagnostics * First round of lint fixes * Refactor to enable some unit testing * Some major re-plumbing to expose a greater surface area for unit-testing * Stub out some additional tests * Stub out tests * Fix comment * Correct NeovimEditor's subscription to mode changed event * Start creating unit test mocks * Add electron-mocha * Add 'debug' command for unit tests * Get first test green * Get first test green * Create red test for slow hover response test, and make green * Remove extra console log * Fix lint issues, and update travis CI with xfvb * Create a 'HoverRenderer', and hook up to NeovimEditor * Hook up HoverRenderer and get quick info working again end-to-end * Write failing test to exercise that hover should be hidden on mode change * Make failing unit test green * Add case to exercise a slow response after mode changing * Get test case green * Expose an 'editor.quickInfo.show' command, that can be used to explicitly show hover, ignoring the enabled setting * Fix lint issues * Move xvfb initialization to script, only run for linux * Refactor + add seams to enable unit testing * Factor CompletionMenu out * Abstract out completion request/details to interface * Add comment regarding future refactoring * Remove now-unused code * Get simple completion case green * Add additional test cases * Set up test suite for completion behavior * Fix lint issues * Factor audit logic to store, get test passing * Get first-item test case green * Remove 'only' * Create failing unit test * Get completion configuration test green --- browser/src/Editor/CompletionMenu.ts | 48 ++++ browser/src/Editor/NeovimEditor.tsx | 22 +- browser/src/Editor/NeovimPopupMenu.tsx | 4 +- browser/src/Services/Completion/Completion.ts | 85 +++++-- .../src/Services/Completion/CompletionMenu.ts | 57 ----- .../Services/Completion/CompletionProvider.ts | 98 -------- .../Completion/CompletionSelectors.ts | 3 +- .../Services/Completion/CompletionStore.ts | 57 +++-- .../Completion/CompletionsRequestor.ts | 115 +++++++++ browser/src/Services/Completion/index.ts | 2 +- browser/test/Mocks/index.ts | 69 +++++- .../Services/Completion/CompletionTests.ts | 233 ++++++++++++++++++ 12 files changed, 600 insertions(+), 193 deletions(-) create mode 100644 browser/src/Editor/CompletionMenu.ts delete mode 100644 browser/src/Services/Completion/CompletionMenu.ts create mode 100644 browser/src/Services/Completion/CompletionsRequestor.ts create mode 100644 browser/test/Services/Completion/CompletionTests.ts diff --git a/browser/src/Editor/CompletionMenu.ts b/browser/src/Editor/CompletionMenu.ts new file mode 100644 index 0000000000..aa908adc05 --- /dev/null +++ b/browser/src/Editor/CompletionMenu.ts @@ -0,0 +1,48 @@ +/** + * CompletionMenu.ts + * + * This is the completion menu that integrates with the completion providers + * (which is primarily language server right now) + * It's really just glue between the ContextMenu and Completion store. + */ + +import * as types from "vscode-languageserver-types" + +import { Event, IEvent } from "oni-types" + +import { ContextMenu, contextMenuManager } from "./../Services/ContextMenu" + +export class CompletionMenu { + private _contextMenu: ContextMenu = null + private _onItemFocusedEvent: Event = new Event() + private _onItemSelectedEvent: Event = new Event() + + public get onItemFocused(): IEvent { + return this._onItemFocusedEvent + } + + public get onItemSelected(): IEvent { + return this._onItemSelectedEvent + } + + constructor() { + this._contextMenu = contextMenuManager.create() + + this._contextMenu.onSelectedItemChanged.subscribe((item) => this._onItemFocusedEvent.dispatch(item)) + this._contextMenu.onItemSelected.subscribe((item) => this._onItemSelectedEvent.dispatch(item)) + } + + public show(options: types.CompletionItem[], filterText: string): void { + if (this._contextMenu.isOpen()) { + this._contextMenu.setItems(options) + this._contextMenu.setFilter(filterText) + } else { + this._contextMenu.show(options, filterText) + } + } + + public hide(): void { + this._contextMenu.hide() + } + +} diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 6002c956dc..8c46b368e8 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -42,6 +42,7 @@ import { Editor, IEditor } from "./Editor" import { BufferManager } from "./BufferManager" import { listenForBufferUpdates } from "./BufferUpdates" +import { CompletionMenu } from "./CompletionMenu" import { HoverRenderer } from "./HoverRenderer" import { NeovimPopupMenu } from "./NeovimPopupMenu" import { NeovimSurface } from "./NeovimSurface" @@ -57,6 +58,7 @@ export class NeovimEditor extends Editor implements IEditor { private _neovimInstance: NeovimInstance private _renderer: INeovimRenderer private _screen: NeovimScreen + private _completionMenu: CompletionMenu private _popupMenu: NeovimPopupMenu private _colors: Colors // TODO: Factor this out to the UI 'Shell' @@ -230,7 +232,25 @@ export class NeovimEditor extends Editor implements IEditor { const textMateHighlightingEnabled = this._config.getValue("experimental.editor.textMateHighlighting.enabled") this._syntaxHighlighter = textMateHighlightingEnabled ? new SyntaxHighlighter() : new NullSyntaxHighlighter() - this._completion = new Completion(this) + this._completion = new Completion(this, languageManager, configuration) + this._completionMenu = new CompletionMenu() + + this._completion.onShowCompletionItems.subscribe((completions) => { + this._completionMenu.show(completions.filteredCompletions, completions.base) + }) + + this._completion.onHideCompletionItems.subscribe((completions) => { + this._completionMenu.hide() + }) + + this._completionMenu.onItemFocused.subscribe((item) => { + this._completion.resolveItem(item) + }) + + this._completionMenu.onItemSelected.subscribe((item) => { + this._completion.commitItem(item) + }) + this._languageIntegration = new LanguageEditorIntegration(this, this._config, languageManager) this._languageIntegration.onShowHover.subscribe((hover) => { diff --git a/browser/src/Editor/NeovimPopupMenu.tsx b/browser/src/Editor/NeovimPopupMenu.tsx index d663ac4bb5..0abaed65f5 100644 --- a/browser/src/Editor/NeovimPopupMenu.tsx +++ b/browser/src/Editor/NeovimPopupMenu.tsx @@ -63,7 +63,9 @@ export class NeovimPopupMenu { adjustedIndex = itemsToRender.length - 1 } - const completionElement = + const highlightColor = UI.store.getState()["contextMenu.highlight"] + + const completionElement = UI.Actions.showToolTip("nvim-popup", completionElement, { position: null, openDirection: 2, diff --git a/browser/src/Services/Completion/Completion.ts b/browser/src/Services/Completion/Completion.ts index b55336cc8d..4bce3b9cbb 100644 --- a/browser/src/Services/Completion/Completion.ts +++ b/browser/src/Services/Completion/Completion.ts @@ -3,33 +3,52 @@ */ import * as Oni from "oni-api" -import { IDisposable } from "oni-types" -import { Store } from "redux" -import { Subject } from "rxjs/Subject" +import { Event, IDisposable, IEvent } from "oni-types" +import { Store, Unsubscribe } from "redux" +import * as types from "vscode-languageserver-types" -import { createContextMenu } from "./CompletionMenu" +import { getFilteredCompletions } from "./CompletionSelectors" +import { ICompletionsRequestor, LanguageServiceCompletionsRequestor } from "./CompletionsRequestor" import { ICompletionState } from "./CompletionState" -import { CompletionAction, createStore } from "./CompletionStore" +import { createStore } from "./CompletionStore" + +import { Configuration } from "./../Configuration" +import { LanguageManager } from "./../Language" +import * as CompletionUtility from "./CompletionUtility" + +export interface ICompletionShowEventArgs { + filteredCompletions: types.CompletionItem[] + base: string +} export class Completion implements IDisposable { private _lastCursorPosition: Oni.Cursor private _store: Store + private _storeUnsubscribe: Unsubscribe = null private _subscriptions: IDisposable[] - private _throttledCursorUpdates: Subject = new Subject() + private _onShowCompletionItemsEvent: Event = new Event() + private _onHideCompletionItemsEvent: Event = new Event() + + public get onShowCompletionItems(): IEvent { + return this._onShowCompletionItemsEvent + } + + public get onHideCompletionItems(): IEvent { + return this._onHideCompletionItemsEvent + } constructor( private _editor: Oni.Editor, + private _languageManager: LanguageManager, + private _configuration: Configuration, + private _completionsRequestor?: ICompletionsRequestor, ) { - this._store = createStore() - this._throttledCursorUpdates - .auditTime(10) - .subscribe((update: CompletionAction) => { - this._store.dispatch(update) - }) + this._completionsRequestor = this._completionsRequestor || new LanguageServiceCompletionsRequestor(this._languageManager) + this._store = createStore(this._languageManager, this._configuration, this._completionsRequestor) const sub1 = this._editor.onBufferEnter.subscribe((buf: Oni.Buffer) => { this._onBufferEnter(buf) @@ -48,8 +67,24 @@ export class Completion implements IDisposable { }) this._subscriptions = [sub1, sub2, sub3, sub4] + this._storeUnsubscribe = this._store.subscribe(() => this._onStateChanged(this._store.getState())) + } + + public resolveItem(completionItem: types.CompletionItem): void { + this._store.dispatch({ + type: "GET_COMPLETION_ITEM_DETAILS", + completionItem, + }) + } - createContextMenu(this._store) + public commitItem(completionItem: types.CompletionItem): void { + const state = this._store.getState() + this._store.dispatch({ + type: "COMMIT_COMPLETION", + meetLine: state.meetInfo.meetLine, + meetPosition: state.meetInfo.meetPosition, + completionText: CompletionUtility.getInsertText(completionItem), + }) } public dispose(): void { @@ -57,6 +92,25 @@ export class Completion implements IDisposable { this._subscriptions.forEach((disposable) => disposable.dispose()) this._subscriptions = null } + + if (this._storeUnsubscribe) { + this._storeUnsubscribe() + this._storeUnsubscribe = null + } + } + + private _onStateChanged(newState: ICompletionState): void { + + const filteredCompletions = getFilteredCompletions(newState) + + if (filteredCompletions && filteredCompletions.length) { + this._onShowCompletionItemsEvent.dispatch({ + filteredCompletions, + base: newState.meetInfo.meetBase, + }) + } else { + this._onHideCompletionItemsEvent.dispatch() + } } private _onCursorMoved(cursor: Oni.Cursor): void { @@ -93,7 +147,7 @@ export class Completion implements IDisposable { const newLine = firstChange.text if (range.start.line === this._lastCursorPosition.line) { - this._throttledCursorUpdates.next({ + this._store.dispatch({ type: "CURSOR_MOVED", line: this._lastCursorPosition.line, column: this._lastCursorPosition.column, @@ -106,7 +160,8 @@ export class Completion implements IDisposable { if (newMode === "insert" && this._lastCursorPosition) { const [latestLine] = await this._editor.activeBuffer.getLines(this._lastCursorPosition.line, this._lastCursorPosition.line + 1) - this._throttledCursorUpdates.next({ + + this._store.dispatch({ type: "CURSOR_MOVED", line: this._lastCursorPosition.line, column: this._lastCursorPosition.column, diff --git a/browser/src/Services/Completion/CompletionMenu.ts b/browser/src/Services/Completion/CompletionMenu.ts deleted file mode 100644 index 22c5b8e3a4..0000000000 --- a/browser/src/Services/Completion/CompletionMenu.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Completion.ts - */ - -import { Store } from "redux" -import * as types from "vscode-languageserver-types" - -import { ContextMenu, contextMenuManager } from "./../ContextMenu" - -import { getFilteredCompletions } from "./CompletionSelectors" -import { ICompletionState } from "./CompletionState" -import * as CompletionUtility from "./CompletionUtility" - -export const createContextMenu = (store: Store) => { - - const contextMenu = contextMenuManager.create() - - store.subscribe(() => { - render(contextMenu, store.getState()) - }) - - contextMenu.onSelectedItemChanged.subscribe((completionItem: types.Command) => { - - store.dispatch({ - type: "SELECT_ITEM", - completionItem, - }) - }) - - contextMenu.onItemSelected.subscribe((completionItem: types.CompletionItem) => { - - const state = store.getState() - - store.dispatch({ - type: "COMMIT_COMPLETION", - meetLine: state.meetInfo.meetLine, - meetPosition: state.meetInfo.meetPosition, - completionText: CompletionUtility.getInsertText(completionItem), - }) - - }) -} - -export const render = (contextMenu: ContextMenu, state: ICompletionState): void => { - const filteredCompletions = getFilteredCompletions(state) - - if (filteredCompletions && filteredCompletions.length) { - if (contextMenu.isOpen()) { - contextMenu.setItems(filteredCompletions) - contextMenu.setFilter(state.meetInfo.meetBase) - } else { - contextMenu.show(filteredCompletions, state.meetInfo.meetBase) - } - } else { - contextMenu.hide() - } -} diff --git a/browser/src/Services/Completion/CompletionProvider.ts b/browser/src/Services/Completion/CompletionProvider.ts index 363e46e5f6..30fb80d60a 100644 --- a/browser/src/Services/Completion/CompletionProvider.ts +++ b/browser/src/Services/Completion/CompletionProvider.ts @@ -4,75 +4,8 @@ import { editorManager } from "./../EditorManager" -import * as types from "vscode-languageserver-types" - -import * as Log from "./../../Log" -import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" -import { configuration } from "./../Configuration" -import { languageManager } from "./../Language" - import * as CompletionUtility from "./CompletionUtility" -export const getCompletions = async (language: string, filePath: string, line: number, character: number): Promise => { - - if (configuration.getValue("editor.completions.mode") !== "oni") { - return null - } - - if (Log.isDebugLoggingEnabled()) { - Log.debug(`[COMPLETION] Requesting completions at line ${line} and character ${character}`) - } - - const args = { - textDocument: { - uri: Helpers.wrapPathInFileUri(filePath), - }, - position: { - line, - character, - }, - } - let result = null - try { - result = await languageManager.sendLanguageServerRequest(language, filePath, "textDocument/completion", args) - } catch (ex) { - Log.verbose(ex) - } - - if (!result) { - return null - } - - const items = getCompletionItems(result) - - if (!items) { - return null - } - - if (Log.isDebugLoggingEnabled()) { - Log.debug(`[COMPLETION] Got completions: ${items.length}`) - } - - const completions = items.map((i) => _convertCompletionForContextMenu(i)) - - return completions -} - -export const resolveCompletionItem = async (language: string, filePath: string, completionItem: types.CompletionItem): Promise => { - let result - try { - result = await languageManager.sendLanguageServerRequest(language, filePath, "completionItem/resolve", completionItem) - } catch (ex) { - Log.verbose(ex) - } - - if (!result) { - return null - } - - return _convertCompletionForContextMenu(result) -} - export const commitCompletion = async (line: number, base: number, completion: string) => { const buffer = editorManager.activeEditor.activeBuffer const currentLines = await buffer.getLines(line, line + 1) @@ -90,34 +23,3 @@ export const commitCompletion = async (line: number, base: number, completion: s const cursorOffset = newLine.length - originalLine.length await buffer.setCursorPosition(line, column + cursorOffset) } - -const getCompletionItems = (items: types.CompletionItem[] | types.CompletionList): types.CompletionItem[] => { - if (!items) { - return [] - } - - if (Array.isArray(items)) { - return items - } else { - return items.items || [] - } -} - -const getCompletionDocumentation = (item: types.CompletionItem): string | null => { - if (item.documentation) { - return item.documentation - } else if (item.data && item.data.documentation) { - return item.data.documentation - } else { - return null - } -} - -const _convertCompletionForContextMenu = (completion: types.CompletionItem): any => ({ - label: completion.label, - detail: completion.detail, - documentation: getCompletionDocumentation(completion), - icon: CompletionUtility.convertKindToIconName(completion.kind), - insertText: completion.insertText, - rawCompletion: completion, -}) diff --git a/browser/src/Services/Completion/CompletionSelectors.ts b/browser/src/Services/Completion/CompletionSelectors.ts index 7724d03590..d5893468c3 100644 --- a/browser/src/Services/Completion/CompletionSelectors.ts +++ b/browser/src/Services/Completion/CompletionSelectors.ts @@ -46,7 +46,8 @@ export const getFilteredCompletions = (state: ICompletionState): types.Completio // If there is only one element, and it matches our base, // don't bother showing it.. - if (CompletionUtility.getInsertText(filteredCompletions[0]) === state.meetInfo.meetBase) { + if (CompletionUtility.getInsertText(filteredCompletions[0]) === state.meetInfo.meetBase + && filteredCompletions.length === 1) { return EmptyCompletions } diff --git a/browser/src/Services/Completion/CompletionStore.ts b/browser/src/Services/Completion/CompletionStore.ts index cb74d383ee..39b833011b 100644 --- a/browser/src/Services/Completion/CompletionStore.ts +++ b/browser/src/Services/Completion/CompletionStore.ts @@ -12,12 +12,14 @@ import { combineEpics, createEpicMiddleware, Epic } from "redux-observable" import { createStore as oniCreateStore } from "./../../Redux" -import { languageManager } from "./../Language" +import { Configuration } from "./../Configuration" +import { LanguageManager } from "./../Language" + +import { commitCompletion } from "./CompletionProvider" import * as CompletionSelects from "./CompletionSelectors" +import { ICompletionsRequestor } from "./CompletionsRequestor" import * as CompletionUtility from "./CompletionUtility" -import { commitCompletion, getCompletions, resolveCompletionItem } from "./CompletionProvider" - import { DefaultCompletionResults, DefaultCompletionState, DefaultCursorInfo, DefaultLastCompletionInfo, DefaultMeetInfo, ICompletionBufferInfo, ICompletionMeetInfo, ICompletionResults, ICompletionState, ICursorInfo, ILastCompletionInfo } from "./CompletionState" export type CompletionAction = { @@ -47,7 +49,7 @@ export type CompletionAction = { meetPosition: number completions: types.CompletionItem[], } | { - type: "SELECT_ITEM", + type: "GET_COMPLETION_ITEM_DETAILS", completionItem: types.CompletionItem, } | { type: "GET_COMPLETION_ITEM_DETAILS_RESULT" @@ -167,8 +169,10 @@ export const lastCompletionInfoReducer: Reducer = ( const nullAction: CompletionAction = { type: null } as CompletionAction -const getCompletionMeetEpic: Epic = (action$, store) => +const createGetCompletionMeetEpic = (languageManager: LanguageManager, configuration: Configuration): Epic => (action$, store) => action$.ofType("CURSOR_MOVED") + .filter(() => configuration.getValue("editor.completions.mode") === "oni") + .auditTime(10) .map((action: CompletionAction) => { const currentState: ICompletionState = store.getState() @@ -215,7 +219,7 @@ const commitCompletionEpic: Epic = (action$, await commitCompletion(action.meetLine, action.meetPosition, action.completionText) }).map(_ => nullAction) -const getCompletionsEpic: Epic = (action$, store) => +const createGetCompletionsEpic = (completionsRequestor: ICompletionsRequestor): Epic => (action$, store) => action$.ofType("MEET_CHANGED") .filter(() => store.getState().enabled) .filter((action) => { @@ -251,10 +255,10 @@ const getCompletionsEpic: Epic = (action$, s // Check if the meet is different from the last meet we queried const requestResult: Observable = Observable.defer(async () => { - const results = await getCompletions(state.bufferInfo.language, state.bufferInfo.filePath, action.currentMeet.meetLine, action.currentMeet.queryPosition) + const results = await completionsRequestor.getCompletions(state.bufferInfo.language, state.bufferInfo.filePath, action.currentMeet.meetLine, action.currentMeet.queryPosition) const completions = results || [] - return completions - + const orderedCompletions = orderCompletions(completions, action.currentMeet.meetBase) + return orderedCompletions }) const ret = requestResult.map((completions) => { @@ -269,18 +273,35 @@ const getCompletionsEpic: Epic = (action$, s return ret }) -const getCompletionDetailsEpic: Epic = (action$, store) => - action$.ofType("SELECT_ITEM") +export const orderCompletions = (completions: types.CompletionItem[], base: string): types.CompletionItem[] => { + if (!completions || !completions.length) { + return completions + } + + const anyCompletionsMatchCurrentBase = completions.find((item) => CompletionUtility.getInsertText(item) === base) + + if (!anyCompletionsMatchCurrentBase) { + return completions + } + + const filteredCompletions = completions.filter((item) => item !== anyCompletionsMatchCurrentBase) + + const ret = [anyCompletionsMatchCurrentBase, ...filteredCompletions] + return ret +} + +const createGetCompletionDetailsEpic = (completionsRequestor: ICompletionsRequestor): Epic => (action$, store) => + action$.ofType("GET_COMPLETION_ITEM_DETAILS") .switchMap((action) => { - if (action.type !== "SELECT_ITEM") { + if (action.type !== "GET_COMPLETION_ITEM_DETAILS") { return Observable.of(nullAction) } return Observable.defer(async () => { const state = store.getState() - const result = await resolveCompletionItem(state.bufferInfo.language, state.bufferInfo.filePath, action.completionItem) + const result = await completionsRequestor.getCompletionDetails(state.bufferInfo.language, state.bufferInfo.filePath, action.completionItem) return result }).map((itemResult: types.CompletionItem) => { if (itemResult) { @@ -310,13 +331,13 @@ const selectFirstItemEpic: Epic = (action$, } return { - type: "SELECT_ITEM", + type: "GET_COMPLETION_ITEM_DETAILS", completionItem: filteredItems[0], } as CompletionAction }) -export const createStore = (): Store => { +export const createStore = (languageManager: LanguageManager, configuration: Configuration, completionsRequestor: ICompletionsRequestor): Store => { return oniCreateStore("COMPLETION_STORE", combineReducers({ enabled: enabledReducer, @@ -329,9 +350,9 @@ export const createStore = (): Store => { DefaultCompletionState, [createEpicMiddleware(combineEpics( commitCompletionEpic, - getCompletionMeetEpic, - getCompletionsEpic, - getCompletionDetailsEpic, + createGetCompletionMeetEpic(languageManager, configuration), + createGetCompletionsEpic(completionsRequestor), + createGetCompletionDetailsEpic(completionsRequestor), selectFirstItemEpic, ))], ) diff --git a/browser/src/Services/Completion/CompletionsRequestor.ts b/browser/src/Services/Completion/CompletionsRequestor.ts new file mode 100644 index 0000000000..09db1df8c0 --- /dev/null +++ b/browser/src/Services/Completion/CompletionsRequestor.ts @@ -0,0 +1,115 @@ +/** + * CompletionsRequestor.ts + * + * Abstraction over the action of requesting completions + */ + +import * as types from "vscode-languageserver-types" + +import * as Log from "./../../Log" +import * as Helpers from "./../../Plugins/Api/LanguageClient/LanguageClientHelpers" + +import { LanguageManager } from "./../Language" + +import * as CompletionUtility from "./CompletionUtility" + +export interface ICompletionsRequestor { + getCompletions(fileLanguage: string, filePath: string, line: number, column: number): Promise + getCompletionDetails(fileLanguage: string, filePath: string, completionItem: types.CompletionItem): Promise +} + +export class LanguageServiceCompletionsRequestor implements ICompletionsRequestor { + + constructor( + private _languageManager: LanguageManager, + ) { } + + public async getCompletions(language: string, filePath: string, line: number, column: number): Promise { + if (Log.isDebugLoggingEnabled()) { + Log.debug(`[COMPLETION] Requesting completions at line ${line} and character ${column}`) + } + + const args = { + textDocument: { + uri: Helpers.wrapPathInFileUri(filePath), + }, + position: { + line, + character: column, + }, + } + let result = null + try { + result = await this._languageManager.sendLanguageServerRequest(language, filePath, "textDocument/completion", args) + } catch (ex) { + Log.verbose(ex) + } + + if (!result) { + return null + } + + const items = getCompletionItems(result) + + if (!items) { + return null + } + + if (Log.isDebugLoggingEnabled()) { + Log.debug(`[COMPLETION] Got completions: ${items.length}`) + } + + const completions = items.map((i) => _convertCompletionForContextMenu(i)) + + return completions + } + + public async getCompletionDetails(language: string, filePath: string, completionItem: types.CompletionItem): Promise { + let result + try { + result = await this._languageManager.sendLanguageServerRequest(language, filePath, "completionItem/resolve", completionItem) + } catch (ex) { + Log.verbose(ex) + } + + if (!result) { + return null + } + + return _convertCompletionForContextMenu(result) + } +} + +// TODO: Should this be moved to another level? Like over to the menu renderer? +// It'd be nice if this layer only cared about `types.CompletionItem` and didn't +// have to worry about presentational aspects.. +const _convertCompletionForContextMenu = (completion: types.CompletionItem): any => ({ + label: completion.label, + detail: completion.detail, + documentation: getCompletionDocumentation(completion), + icon: CompletionUtility.convertKindToIconName(completion.kind), + insertText: completion.insertText, + rawCompletion: completion, +}) + +const getCompletionDocumentation = (item: types.CompletionItem): string | null => { + if (item.documentation) { + return item.documentation + } else if (item.data && item.data.documentation) { + return item.data.documentation + } else { + return null + } +} + +const getCompletionItems = (items: types.CompletionItem[] | types.CompletionList): types.CompletionItem[] => { + if (!items) { + return [] + } + + if (Array.isArray(items)) { + return items + } else { + return items.items || [] + } +} diff --git a/browser/src/Services/Completion/index.ts b/browser/src/Services/Completion/index.ts index 99ada54975..72c78b885c 100644 --- a/browser/src/Services/Completion/index.ts +++ b/browser/src/Services/Completion/index.ts @@ -1,3 +1,3 @@ export * from "./Completion" -export * from "./CompletionMenu" +export * from "./CompletionsRequestor" export * from "./CompletionUtility" diff --git a/browser/test/Mocks/index.ts b/browser/test/Mocks/index.ts index 8afd18f7ec..eb44019c6c 100644 --- a/browser/test/Mocks/index.ts +++ b/browser/test/Mocks/index.ts @@ -5,6 +5,8 @@ * to exercise boundaries of class implementations */ +import * as types from "vscode-languageserver-types" + import { Editor } from "./../../src/Editor/Editor" import * as Language from "./../../src/Services/Language" import { createCompletablePromise, ICompletablePromise } from "./../../src/Utility" @@ -25,6 +27,9 @@ export class MockConfiguration { } export class MockEditor extends Editor { + + private _activeBuffer: MockBuffer = null + public simulateModeChange(newMode: string): void { this.setMode(newMode as any) } @@ -37,11 +42,73 @@ export class MockEditor extends Editor { } public simulateBufferEnter(buffer: MockBuffer): void { + this._activeBuffer = buffer this.notifyBufferEnter(buffer as any) } + + public setActiveBufferLine(line: number, lineContents: string): void { + this._activeBuffer.setLineSync(line, lineContents) + + this.notifyBufferChanged({ + buffer: this._activeBuffer as any, + contentChanges: [{ + range: types.Range.create(line, 0, line + 1, 0), + text: lineContents, + }], + }) + } } export class MockBuffer { + + public get language(): string { + return this._language + } + + public get filePath(): string { + return this._filePath + } + + public constructor( + private _language: string = "test_language", + private _filePath: string = "test_filepath", + private _lines: string[] = [], + ) { + } + + public setLinesSync(lines: string[]): void { + this._lines = lines + } + + public setLineSync(line: number, lineContents: string): void { + + while (this._lines.length <= line) { + this._lines.push("") + } + + this._lines[line] = lineContents + } + + public getLines(start: number = 0, end?: number): Promise { + if (typeof end !== "number") { + end = this._lines.length + } + + return Promise.resolve(this._lines.slice(start, end)) + } +} + +const DefaultCursorMatchRegEx = /[a-z]/i +const DefaultTriggerCharacters = ["."] + +export class MockLanguageManager { + public getTokenRegex(language: string): RegExp { + return DefaultCursorMatchRegEx + } + + public getCompletionTriggerCharacters(language: string): string[] { + return DefaultTriggerCharacters + } } export class MockRequestor { @@ -52,7 +119,7 @@ export class MockRequestor { return this._completablePromises.length } - public get(language: string, filePath: string, line: number, column: number): Promise { + public get(...args: any[]): Promise { const newPromise = createCompletablePromise() diff --git a/browser/test/Services/Completion/CompletionTests.ts b/browser/test/Services/Completion/CompletionTests.ts new file mode 100644 index 0000000000..1beb219ffa --- /dev/null +++ b/browser/test/Services/Completion/CompletionTests.ts @@ -0,0 +1,233 @@ +/** + * CompletionTests.ts + */ + +import * as assert from "assert" +import * as types from "vscode-languageserver-types" + +import * as Completion from "./../../../src/Services/Completion" + +import * as Mocks from "./../../Mocks" + +export class MockCompletionRequestor implements Completion.ICompletionsRequestor { + + private _completionsRequestor: Mocks.MockRequestor = new Mocks.MockRequestor() + private _completionDetailsRequestor: Mocks.MockRequestor = new Mocks.MockRequestor() + + public get completionsRequestor(): Mocks.MockRequestor { + return this._completionsRequestor + } + + public get completionDetailsRequestor(): Mocks.MockRequestor { + return this._completionDetailsRequestor + } + + public getCompletions(fileLanguage: string, filePath: string, line: number, column: number): Promise { + return this._completionsRequestor.get(fileLanguage, filePath, line, column) + } + + public getCompletionDetails(fileLanguage: string, filePath: string, completionItem: types.CompletionItem): Promise { + return this._completionDetailsRequestor.get(fileLanguage, filePath, completionItem) + } + +} + +const createMockCompletionItem = (label: string): types.CompletionItem => { + const ci: types.CompletionItem = { + label, + kind: types.CompletionItemKind.Variable, + } + return ci +} + +describe("Completion", () => { + const clock: any = global["clock"] // tslint:disable-line + const waitForPromiseResolution: any = global["waitForPromiseResolution"] // tslint:disable-line + + // Mocks + let mockConfiguration: Mocks.MockConfiguration + let mockEditor: Mocks.MockEditor + let mockLanguageManager: Mocks.MockLanguageManager + let mockCompletionRequestor: MockCompletionRequestor + + // Class under test + let completion: Completion.Completion + + beforeEach(() => { + mockConfiguration = new Mocks.MockConfiguration({ + "editor.completions.mode": "oni", + }) + + mockEditor = new Mocks.MockEditor() + mockLanguageManager = new Mocks.MockLanguageManager() + mockCompletionRequestor = new MockCompletionRequestor() + completion = new Completion.Completion(mockEditor, mockLanguageManager as any, mockConfiguration as any, mockCompletionRequestor) + }) + + afterEach(() => { + completion.dispose() + }) + + it("shows completions, filtered by base", async () => { + mockEditor.simulateBufferEnter(new Mocks.MockBuffer("typescript", "test1.ts", [])) + + // Switch to insert mode + mockEditor.simulateModeChange("insert") + + // Simulate typing + mockEditor.simulateCursorMoved(0, 1) + mockEditor.setActiveBufferLine(0, "w") + + clock.runAll() + + let lastItems: Completion.ICompletionShowEventArgs = null + completion.onShowCompletionItems.subscribe((items) => lastItems = items) + + // Validate we have a request for completions + assert.strictEqual(mockCompletionRequestor.completionsRequestor.pendingCallCount, 1, "There should be a request for completions queued") + + const completionResults = [ + createMockCompletionItem("win"), + createMockCompletionItem("window"), + ] + + mockCompletionRequestor.completionsRequestor.resolve(completionResults) + + await waitForPromiseResolution() + clock.runAll() + + assert.deepEqual(lastItems.filteredCompletions, completionResults, "There should now be completion results available") + assert.deepEqual(lastItems.base, "w", "The base should be set correctly") + }) + + it("doesn't fetch completions if 'editor.completions.mode' === 'hidden'", () => { + + mockConfiguration.setValue("editor.completions.mode", "hidden") + + mockEditor.simulateBufferEnter(new Mocks.MockBuffer("typescript", "test1.ts", [])) + + // Switch to insert mode + mockEditor.simulateModeChange("insert") + + // Simulate typing + mockEditor.simulateCursorMoved(0, 3) + mockEditor.setActiveBufferLine(0, "win") + + clock.runAll() + + // Validate we do not have requests for completion, because completions are turned off. + assert.strictEqual(mockCompletionRequestor.completionsRequestor.pendingCallCount, 0, "There should be no completion requests, because 'editor.completions.mode' is set to 'hidden'") + }) + + it("if there is a completion matching the base, it should be the first shown", async () => { + + mockEditor.simulateBufferEnter(new Mocks.MockBuffer("typescript", "test1.ts", [])) + + // Switch to insert mode + mockEditor.simulateModeChange("insert") + + // Simulate typing + mockEditor.simulateCursorMoved(0, 3) + mockEditor.setActiveBufferLine(0, "win") + + clock.runAll() + + let lastItems: Completion.ICompletionShowEventArgs = null + completion.onShowCompletionItems.subscribe((items) => lastItems = items) + + // Validate we have a request for completions + assert.strictEqual(mockCompletionRequestor.completionsRequestor.pendingCallCount, 1, "There should be a request for completions queued") + + const completionResults = [ + createMockCompletionItem("window"), + createMockCompletionItem("win"), + ] + + mockCompletionRequestor.completionsRequestor.resolve(completionResults) + + await waitForPromiseResolution() + clock.runAll() + + assert.strictEqual(lastItems.filteredCompletions.length, 2, "Completions were resolved successfully") + assert.deepEqual(lastItems.filteredCompletions[0], completionResults[1], "The second completion should be the first one shown, as it matches the base") + }) + + it("if mode changed while a request was in progress, there should be no completions shown", async () => { + mockEditor.simulateBufferEnter(new Mocks.MockBuffer("typescript", "test1.ts", [])) + + // Switch to insert mode + mockEditor.simulateModeChange("insert") + + // Simulate typing + mockEditor.simulateCursorMoved(0, 3) + mockEditor.setActiveBufferLine(0, "win") + + clock.runAll() + + let lastItems: Completion.ICompletionShowEventArgs = null + completion.onShowCompletionItems.subscribe((items) => lastItems = items) + + // Validate we have a request for completions + assert.strictEqual(mockCompletionRequestor.completionsRequestor.pendingCallCount, 1, "There should be a request for completions queued") + + // While the result is pending, we'll leave insert mode - + // we shouldn't get any completions, now! + + mockEditor.simulateModeChange("normal") + + clock.runAll() + + // Resolve the slow request... + const completionResults = [ + createMockCompletionItem("window"), + createMockCompletionItem("win"), + ] + + mockCompletionRequestor.completionsRequestor.resolve(completionResults) + + await waitForPromiseResolution() + clock.runAll() + + assert.strictEqual(lastItems, null, "Completions should be null, as we shouldn't have received them after the mode change") + }) + + it("if meet changed while the request was in progress, there should be no completions shown", async () => { + mockEditor.simulateBufferEnter(new Mocks.MockBuffer("typescript", "test1.ts", [])) + + // Switch to insert mode + mockEditor.simulateModeChange("insert") + + // Simulate typing + mockEditor.simulateCursorMoved(0, 3) + mockEditor.setActiveBufferLine(0, "win") + + clock.runAll() + + let lastItems: Completion.ICompletionShowEventArgs = null + completion.onShowCompletionItems.subscribe((items) => lastItems = items) + + // Validate we have a request for completions + assert.strictEqual(mockCompletionRequestor.completionsRequestor.pendingCallCount, 1, "There should be a request for completions queued") + + // While the result is pending, we'll keep typing... + // That first result should be ignored + + mockEditor.simulateCursorMoved(0, 5) + mockEditor.setActiveBufferLine(0, "win.s") + + clock.runAll() + + // Resolve the slow request... + const oldCompletionResults = [ + createMockCompletionItem("window"), + createMockCompletionItem("win"), + ] + + mockCompletionRequestor.completionsRequestor.resolve(oldCompletionResults) + + await waitForPromiseResolution() + clock.runAll() + + assert.strictEqual(lastItems, null, "Completions should be null, as the only request that was completed was outdated") + }) +}) From d7586420368e3863056895b8e603c2ec1f874388 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 1 Dec 2017 18:11:03 -0800 Subject: [PATCH 59/63] Automate demo video on website (#862) * Refactor out to test/common * Fix issues running integration tests * Restore tests * Add HeroDemo + DemoTest file * Disable demo, enable screenshot test * Add screenshot * Add demo files * Add hack to hook alert to know when test is completed * Fix linting * Fix stuff deleted in merge * Fix some issues with the test * Update screenshot to be named per platform, and add as artifact tow indows build too * Run demo screenshot generation * Stabilize test * Get better logging * Disable demo on OSX for now, since it still needs to be stabilized * Try bumping out timeout, to see if there is a timing issue with getting the results --- .travis.yml | 63 +++++++------- appveyor.yml | 4 + browser/src/Redux/ReduxLogger.ts | 24 ------ browser/src/Services/Automation.ts | 11 ++- browser/src/Services/Recorder.ts | 17 ++-- build/script/travis-build.sh | 1 + package.json | 3 +- test/CiTests.ts | 128 +---------------------------- test/Demo.ts | 20 +++++ test/ci/AutoCompletionTest.json | 38 +++++++++ test/common/Config.ts | 51 ++++++++++++ test/common/index.ts | 1 + test/common/runInProcTest.ts | 105 +++++++++++++++++++++++ test/demo/DemoCommon.ts | 17 ++++ test/demo/HeroDemo.ts | 64 +++++++++++++++ test/demo/HeroScreenshot.ts | 70 ++++++++++++++++ 16 files changed, 432 insertions(+), 185 deletions(-) delete mode 100644 browser/src/Redux/ReduxLogger.ts create mode 100644 test/Demo.ts create mode 100644 test/ci/AutoCompletionTest.json create mode 100644 test/common/Config.ts create mode 100644 test/common/runInProcTest.ts create mode 100644 test/demo/DemoCommon.ts create mode 100644 test/demo/HeroDemo.ts create mode 100644 test/demo/HeroScreenshot.ts diff --git a/.travis.yml b/.travis.yml index 978c9e82cf..5b42829bbd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,46 +1,51 @@ sudo: required dist: trusty - language: node_js - branches: - only: - - master - - /^release.*/ - + only: + - master + - /^release.*/ cache: yarn: true directories: - node_modules matrix: - include: - - os: linux - sudo: required - dist: trusty - node_js: 8 - - os: osx - node_js: 8 - + include: + - os: linux + sudo: required + dist: trusty + node_js: 8 + - os: osx + node_js: 8 addons: - apt: - packages: - - libxkbfile-dev - - libgnome-keyring-dev - - icnsutils - - graphicsmagick - - xz-utils - - rpm - - bsdtar - + apt: + packages: + - libxkbfile-dev + - libgnome-keyring-dev + - icnsutils + - graphicsmagick + - xz-utils + - rpm + - bsdtar install: - - npm install -g yarn - - yarn install - +- npm install -g yarn +- yarn install script: - - ./build/script/travis-build.sh - +- ./build/script/travis-build.sh deploy: + - provider: s3 + access_key_id: AKIAIPVCKNWKWB2XULQQ + secret_access_key: + secure: IKLeZsM1R8pq/eBqBCnsFe6iSF+ZHaokY6yBf6FtxaqHw7qJR3RQ9XI9N7mooKXOAsp7prDBNW6sdciGmzXpDW7myDz5eEfmVOIZxb6zq0XUwsikkgrzgS22bMkj32CZuRzR8agzF7US+G6OfVo+MIhChOPKBfqkbUbQdWm0tYX0NJsNyt8Ax8GdyzAj98cazw5tV2HWT7M11EKQCssc1CiFWqR51Zqmy34d/jEWJEe+P3avRDpNCJf6uuzfrtpn1swCb0EY7aZGDischXwRJDyZ6GXrjECxazN2T7JwcwKw/Y+XOeiwp5H+ell+1C/tZMXcn8OyOZurVQdG7MNGHil0Jt/t4QL6XpNXXF8I1k1LQDty7SPnZRKaAYo8rNyDFqGt5oVLvTm8GD9KjI4rGPt7VvzUQS5SITRnI1m6wq0YDdVqcR9/Z2cLmXHmzhOmB3FLCTKQXXCMaG1dAzlYQDOspo9RKr+nuDpherNMSiqSeVUM97UrfRQ2pC/JfoL/f6j2jt88Y7XfF9x48h+6Pm8ny5rlSaU4otnVpgAeoMEMED5s93zZrVxF7ydyZ0ZvBLKfK13mJwleCq3R1DbYStp1bor0MFwVoVRRRLcxIo6bhlmJsd0qhIFXL8BcE1wLzDITnXVxAxg9izRPYPcSgRLyjJ1SqaxoT89cO0YlNEU= + bucket: oni-media + local-dir: dist/media + acl: public_read + region: us-west-2 + skip_cleanup: true + on: + condition: $TRAVIS_OS_NAME = osx + repo: onivim/oni - provider: releases api_key: secure: AjQUeQNockqkBrVQCOQGyKq+sZ9C4SabSqp/bmXayKTB+7AmM8oohenxC09Sc4/dmIW1PQnDYL/4fjclJSRaywV5oiPqUnfhTveALkKFErmYnhA8oFi3VJYg4Tbszb2lYGITLOluuuAZGw67JZIuuiXzw/yOUfdWTmRCAVGzTmqkPsusYg56L4iRBWDwYQ3mhHsuNKFO7SIx1nJatj5hK9AkDJlcVilpA5IuWLWOHLY7nplFPUPUwMkRd99nifB7ITycbaAX4zLwp2U2wCb2uSTOzsFNfXykksf8AlreH0615Jb+T39/dDwQurDAQE3h+KUH5QhEvRJ1uphkGvx/x6Vn0LkJuSqS5DLeSATmVOVRK2f6AXcymvn/64qxizjlBR7bBoUxM55311qWJNKKk2FYFTAIW5fMzN0MRbaulpnpBwmhnBvd03rOMIghnvClHv2m8Eh5A6ppPnLcl2Vn7jsrqTmMm+PM1ppIWhCpvC7xn4digx1GGHXlYzfHkDxtnHwHcbj+WOkc+j4ha8Os+1ctdT3OJXz5rwW4viorSIhWryK+G36beguXe5YaoeMcK9Vzmb+S0lHdA7RuCWiJ31i/9ZMbzBhLkdcf/wfj9n3mkqmzvc4Uc1NM8FHQ23URsodSHpTdDi7q25Eqge/JP82AqJ2zAWA+QKVg54xCQQc= diff --git a/appveyor.yml b/appveyor.yml index 06cf4869ff..4f25f06179 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,6 +36,9 @@ artifacts: - path: dist/*.zip name: ProductZip + - path: dist/media/screenshot-win32.png + name: DemoScreenshot + deploy: provider: GitHub repository: onivim/oni @@ -62,6 +65,7 @@ test_script: - npm run pack:win # run integration tests - npm run test:integration + - npm run demo # Don't actually build. build: off diff --git a/browser/src/Redux/ReduxLogger.ts b/browser/src/Redux/ReduxLogger.ts deleted file mode 100644 index 4771814e4d..0000000000 --- a/browser/src/Redux/ReduxLogger.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * createStore - * - * Common utilities for creating a redux store with Oni - * - * Implementations some common functionality, like: - * - Logging - * - Throttled subscriptions - */ - -import { applyMiddleware, compose, createStore as reduxCreateStore, Middleware, Reducer, Store } from "redux" -import { batchedSubscribe } from "redux-batched-subscribe" - -import { RequestAnimationFrameNotifyBatcher } from "./RequestAnimationFrameNotifyBatcher" - -export const createStore = (name: string, reducer: Reducer, defaultState: TState, optionalMiddleware: Middleware[] = []): Store => { - - const composeEnhancers = window["__REDUX_DEVTOOLS_EXTENSION__COMPOSE__"] || compose // tslint:disable-line no-string-literal - const enhancer = composeEnhancers( - applyMiddleware(...optionalMiddleware), - batchedSubscribe(RequestAnimationFrameNotifyBatcher), - ) - return reduxCreateStore(reducer, defaultState, enhancer) -} diff --git a/browser/src/Services/Automation.ts b/browser/src/Services/Automation.ts index fd29115354..255c7da58e 100644 --- a/browser/src/Services/Automation.ts +++ b/browser/src/Services/Automation.ts @@ -23,6 +23,7 @@ import { Oni } from "./../Plugins/Api/Oni" export class Automation implements OniApi.Automation.Api { public sendKeys(keys: string): void { + Log.info("[AUTOMATION] Sending keys: " + keys) if (!inputManager.handleKey(keys)) { const anyEditor: any = editorManager.activeEditor as any @@ -31,21 +32,27 @@ export class Automation implements OniApi.Automation.Api { } public async sleep(time: number = 1000): Promise { + Log.info("[AUTOMATION] Sleeping for " + time + "ms") return new Promise((r) => window.setTimeout(() => r(), time)) } public async waitFor(condition: () => boolean, timeout: number = 5000): Promise { + Log.info("[AUTOMATION] Starting wait - limit: " + timeout) let time = 0 const interval = 1000 while (time <= timeout) { if (condition()) { + Log.info("[AUTOMATION] Wait condition met at: " + time) return } await this.sleep(interval) time += interval + Log.info("[AUTOMATION] Wait condition still not met: " + time + " / " + timeout) } + Log.info("[AUTOMATION]: waitFor timeout expired") + throw new Error("waitFor: Timeout expired") } @@ -56,10 +63,12 @@ export class Automation implements OniApi.Automation.Api { const testPath2 = testPath const loggingRedirector = new LoggingRedirector() - Log.enableDebugLogging() + Log.enableVerboseLogging() try { + Log.info("[AUTOMATION] Starting test: " + testPath) const testCase: any = Utility.nodeRequire(testPath2) await testCase.test(new Oni()) + Log.info("[AUTOMATION] Completed test: " + testPath) this._reportResult(true) } catch (ex) { this._reportResult(false, ex) diff --git a/browser/src/Services/Recorder.ts b/browser/src/Services/Recorder.ts index eaf8a2b423..4c8fcedaf7 100644 --- a/browser/src/Services/Recorder.ts +++ b/browser/src/Services/Recorder.ts @@ -67,13 +67,14 @@ class Recorder { return !!this._recorder } - public async stopRecording(): Promise { + public async stopRecording(fileName?: string): Promise { this._recorder.stop() const arrayBuffer = await toArrayBuffer(new Blob(this._blobs, {type: "video/webm"})) const buffer = toBuffer(arrayBuffer) - const videoFilePath = getOutputPath("oni-video", "webm") + fileName = fileName || getFileName("oni-video", "webm") + const videoFilePath = getOutputPath(fileName) // TODO: Finish making this async if (fs.existsSync(videoFilePath)) { @@ -87,12 +88,13 @@ class Recorder { alert("Recording saved to: " + videoFilePath) } - public takeScreenshot(scale: number = 1): void { + public takeScreenshot(fileName?: string, scale: number = 1): void { const webContents = require("electron").remote.getCurrentWebContents() webContents.capturePage((image) => { const pngBuffer = image.toPNG({ scaleFactor: scale}) - const screenshotPath = getOutputPath("oni-screenshot", "png") + fileName = fileName || getFileName("oni-screenshot", "png") + const screenshotPath = getOutputPath(fileName) fs.writeFileSync(screenshotPath, pngBuffer) if (configuration.getValue("recorder.copyScreenshotToClipboard")) { clipboard.writeImage(screenshotPath as any) @@ -135,9 +137,12 @@ const getDimensions = () => { } } -const getOutputPath = (fileBase: string, fileExtension: string) => { +const getFileName = (fileBase: string, fileExtension: string) => { + return `${fileBase}-${new Date().getTime()}.${fileExtension}` +} + +const getOutputPath = (fileName: string) => { const outputPath = configuration.getValue("recorder.outputPath") - const fileName = `${fileBase}-${new Date().getTime()}.${fileExtension}` return path.join(outputPath, fileName) } diff --git a/build/script/travis-build.sh b/build/script/travis-build.sh index 014e6c66db..a3fa71d43f 100755 --- a/build/script/travis-build.sh +++ b/build/script/travis-build.sh @@ -18,4 +18,5 @@ npm run pack if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then npm run test:integration + npm run demo fi diff --git a/package.json b/package.json index 8f79b28524..74fbb090f2 100644 --- a/package.json +++ b/package.json @@ -80,9 +80,9 @@ "build:plugins": "npm run build:plugin:oni-plugin-typescript", "build:plugin:oni-plugin-typescript": "cd vim/core/oni-plugin-typescript && npm run build", "build:test": "cd test && tsc -p tsconfig.json", - "pack": "build --publish never", "copy-icons": "node build/CopyIcons.js", "debug:test:unit:browser": "cd browser && tsc -p tsconfig.json && electron-mocha --interactive --debug --renderer --require testHelpers.js --recursive ../lib_test/browser/test", + "demo": "npm run build:test && mocha -t 30000 lib_test/test/Demo.js", "dist:win": "build --arch ia32 --publish never", "pack:win": "node build/BuildSetupTemplate.js && innosetup-compiler dist/setup.iss --verbose --O=dist", "test": "npm run test:unit && npm run test:integration", @@ -98,6 +98,7 @@ "lint:browser": "tslint --project browser/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", "lint:main": "tslint --project main/tsconfig.json --config tslint.json", "lint:test": "tslint --project test/tsconfig.json --config tslint.json && tslint vim/core/oni-plugin-typescript/src/**/*.ts", + "pack": "build --publish never", "start": "concurrently --kill-others \"npm run start-hot\" \"npm run watch:browser\" \"npm run watch:plugins\"", "start-hot": "cross-env NODE_ENV=development electron lib/main/src/main.js", "start-not-dev": "cross-env electron main.js", diff --git a/test/CiTests.ts b/test/CiTests.ts index a2045127d3..465ce5d8dc 100644 --- a/test/CiTests.ts +++ b/test/CiTests.ts @@ -5,7 +5,7 @@ import * as path from "path" import * as mkdirp from "mkdirp" -import { Oni } from "./common" +import { Oni, runInProcTest } from "./common" const LongTimeout = 5000 @@ -20,6 +20,8 @@ const CiTests = [ // tslint:disable:no-console +import * as Config from "./common/Config" + import * as Platform from "./../browser/src/Platform" export interface ITestCase { @@ -28,131 +30,9 @@ export interface ITestCase { configPath: string } -const normalizePath = (p) => p.split("\\").join("/") - -const loadTest = (testName: string): ITestCase => { - const ciPath = path.join(__dirname, "ci") - const testPath = path.join(ciPath, testName + ".js") - - const testMeta = require(testPath) - const testDescription = testMeta.settings || {} - - const normalizedMeta: ITestCase = { - name: testDescription.name || testName, - testPath: normalizePath(testPath), - configPath: testDescription.configPath ? normalizePath(path.join(ciPath, testDescription.configPath)) : "", - } - - return normalizedMeta -} - describe("ci tests", function() { // tslint:disable-line only-arrow-functions - const configFolder = Platform.isWindows() ? path.join(Platform.getUserHome(), "oni") : - path.join(Platform.getUserHome(), ".oni") - const configPath = path.join(configFolder, "config.js") - - const temporaryConfigPath = path.join(os.tmpdir(), "config.js") - - before(() => { - - if (!fs.existsSync(configFolder)) { - console.log("Config folder doesn't exist - creating.") - mkdirp.sync(configFolder) - console.log("Config folder created successfully.") - } - - if (fs.existsSync(configPath)) { - console.log("Backing up config to: " + temporaryConfigPath) - const configContents = fs.readFileSync(configPath, "utf8") - fs.writeFileSync(temporaryConfigPath, configContents) - console.log("Config backed up.") - console.log("Removing existing config..") - fs.unlinkSync(configPath) - console.log("Existing config removed") - } - }) - - after(() => { - if (fs.existsSync(temporaryConfigPath)) { - console.log("Restoring config from: " + temporaryConfigPath) - const configContents = fs.readFileSync(temporaryConfigPath, "utf8") - fs.writeFileSync(configPath, configContents) - console.log("Config restored to: " + configPath) - console.log("Deleting temporary config.") - fs.unlinkSync(temporaryConfigPath) - console.log("Temporary config successfuly deleted.") - } - }) - CiTests.forEach((test) => { - - describe(test, () => { - - // Retry up to two times - this.retries(2) - - const testCase = loadTest(test) - - let oni: Oni - - beforeEach(async () => { - - console.log("[BEFORE EACH]: " + test) - if (testCase.configPath) { - console.log("Writing config from: " + testCase.configPath) - const configContents = fs.readFileSync(testCase.configPath) - console.log("Writing config to: " + configPath) - fs.writeFileSync(configPath, configContents) - } - - oni = new Oni() - await oni.start() - }) - - afterEach(async () => { - console.log("[AFTER EACH]: " + test) - await oni.close() - - if (fs.existsSync(configPath)) { - console.log("--Removing existing config..") - fs.unlinkSync(configPath) - } - }) - - it("ci test: " + test, async () => { - console.log("[TEST]: " + test) - console.log("Waiting for editor element...") - await oni.client.waitForExist(".editor", LongTimeout) - console.log("Found editor element. Getting editor element text: ") - const text = await oni.client.getText(".editor") - console.log("Editor element text: " + text) - - console.log("Test path: " + testCase.testPath) // tslint:disable-line - - oni.client.execute("Oni.automation.runTest('" + testCase.testPath + "')") - - console.log("Waiting for result...") // tslint:disable-line - await oni.client.waitForExist(".automated-test-result", 30000) - const resultText = await oni.client.getText(".automated-test-result") - console.log("---RESULT") - console.log(resultText) // tslint:disable-line - console.log("---") - console.log("") - - console.log("Retrieving logs...") - - await oni.client.waitForExist(".automated-test-logs") - const clientLogs = await oni.client.getText(".automated-test-logs") - console.log("---LOGS (During run): ") - - const logs = JSON.parse(clientLogs).forEach((log) => console.log(log)) - - console.log("---") - - const result = JSON.parse(resultText) - assert.ok(result.passed) - }) - }) + runInProcTest(path.join(__dirname, "ci"), test) }) }) diff --git a/test/Demo.ts b/test/Demo.ts new file mode 100644 index 0000000000..ee18aa542f --- /dev/null +++ b/test/Demo.ts @@ -0,0 +1,20 @@ +import * as assert from "assert" +import * as path from "path" + +import { runInProcTest } from "./common" + +const DemoTests = [ + // "HeroDemo" + "HeroScreenshot", +] + +// tslint:disable:no-console + +describe("demo tests", function() { // tslint:disable-line only-arrow-functions + // Retry up to two times + this.retries(2) + + DemoTests.forEach((test) => { + runInProcTest(path.join(__dirname, "demo"), test) + }) +}) diff --git a/test/ci/AutoCompletionTest.json b/test/ci/AutoCompletionTest.json new file mode 100644 index 0000000000..bab7302f39 --- /dev/null +++ b/test/ci/AutoCompletionTest.json @@ -0,0 +1,38 @@ +/** + * Test scripts for QuickOpen + */ + +import * as assert from "assert" +import * as os from "os" +import * as path from "path" + +const getCompletionElement = () => { + + const elements = document.body.getElementsByClassName("autocompletion") + + if (!elements || !elements.length) { + return null + } else { + return elements[0] + } +} + +export const test = async (oni: any) => { + const dir = os.tmpdir() + const testFileName = `testFile-${new Date().getTime()}.ts` + const tempFilePath = path.join(dir, testFileName) + oni.automation.sendKeys(":e " + tempFilePath) + oni.automation.sendKeys("") + await oni.automation.sleep(500) + oni.automation.sendKeys("i") + oni.automation.sendKeys("window.a") + + // Wait for completion popup to show + await oni.automation.waitFor(() => getCompletionElement() !== null) + + // Check for 'alert' as an available completion + const completionElement = getCompletionElement() + const textContent = completionElement.textContent + + assert.ok(textContent.indexOf("alert") >= 0, "Verify 'alert' was presented as a completion") +} diff --git a/test/common/Config.ts b/test/common/Config.ts new file mode 100644 index 0000000000..b62813d8dd --- /dev/null +++ b/test/common/Config.ts @@ -0,0 +1,51 @@ +/** + * Utilities for working with configuration in tests + */ + +import * as fs from "fs" +import * as os from "os" +import * as path from "path" + +import * as mkdirp from "mkdirp" + +import * as Platform from "./../../browser/src/Platform" +// +// tslint:disable:no-console + +export const configFolder = Platform.isWindows() ? path.join(Platform.getUserHome(), "oni") : + path.join(Platform.getUserHome(), ".oni") +export const configPath = path.join(configFolder, "config.js") + +export const temporaryConfigPath = path.join(os.tmpdir(), "config.js") + +export const createConfigFolder = () => { + if (!fs.existsSync(configFolder)) { + console.log("Config folder doesn't exist - creating.") + mkdirp.sync(configFolder) + console.log("Config folder created successfully.") + } +} + +export const backupConfig = () => { + if (fs.existsSync(configPath)) { + console.log("Backing up config to: " + temporaryConfigPath) + const configContents = fs.readFileSync(configPath, "utf8") + fs.writeFileSync(temporaryConfigPath, configContents) + console.log("Config backed up.") + console.log("Removing existing config..") + fs.unlinkSync(configPath) + console.log("Existing config removed") + } +} + +export const restoreConfig = () => { + if (fs.existsSync(temporaryConfigPath)) { + console.log("Restoring config from: " + temporaryConfigPath) + const configContents = fs.readFileSync(temporaryConfigPath, "utf8") + fs.writeFileSync(configPath, configContents) + console.log("Config restored to: " + configPath) + console.log("Deleting temporary config.") + fs.unlinkSync(temporaryConfigPath) + console.log("Temporary config successfuly deleted.") + } +} diff --git a/test/common/index.ts b/test/common/index.ts index bf3fef6d2b..b10f82593e 100644 --- a/test/common/index.ts +++ b/test/common/index.ts @@ -1 +1,2 @@ export * from "./Oni" +export * from "./runInProcTest" diff --git a/test/common/runInProcTest.ts b/test/common/runInProcTest.ts new file mode 100644 index 0000000000..466e02b714 --- /dev/null +++ b/test/common/runInProcTest.ts @@ -0,0 +1,105 @@ +import * as assert from "assert" +import * as fs from "fs" +import * as path from "path" + +import * as Config from "./Config" +import { Oni } from "./Oni" + +// tslint:disable:no-console + +export interface ITestCase { + name: string + testPath: string + configPath: string +} + +const normalizePath = (p) => p.split("\\").join("/") + +const loadTest = (rootPath: string, testName: string): ITestCase => { + const testPath = path.join(rootPath, testName + ".js") + + const testMeta = require(testPath) + const testDescription = testMeta.settings || {} + + const normalizedMeta: ITestCase = { + name: testDescription.name || testName, + testPath: normalizePath(testPath), + configPath: testDescription.configPath ? normalizePath(path.join(rootPath, testDescription.configPath)) : "", + } + + return normalizedMeta +} + +export const runInProcTest = (rootPath: string, testName: string, timeout: number = 5000) => { + describe(testName, () => { + + const testCase = loadTest(rootPath, testName) + const configPath = Config.configPath + + let oni: Oni + + beforeEach(async () => { + console.log("[BEFORE EACH]: " + testName) + + Config.backupConfig() + + if (testCase.configPath) { + console.log("Writing config from: " + testCase.configPath) + const configContents = fs.readFileSync(testCase.configPath) + console.log("Writing config to: " + configPath) + fs.writeFileSync(configPath, configContents) + } + + oni = new Oni() + return oni.start(["test.txt"]) + }) + + afterEach(async () => { + console.log("[AFTER EACH]: " + testName) + await oni.close() + + if (fs.existsSync(configPath)) { + console.log("--Removing existing config..") + fs.unlinkSync(configPath) + } + + Config.restoreConfig() + }) + + it("ci test: " + testName, async () => { + console.log("[TEST]: " + testName) + console.log("Waiting for editor element...") + await oni.client.waitForExist(".editor", timeout) + + console.log("Found editor element. Getting editor element text: ") + const text = await oni.client.getText(".editor") + console.log("Editor element text: " + text) + + console.log("Test path: " + testCase.testPath) // tslint:disable-line + + oni.client.execute("Oni.automation.runTest('" + testCase.testPath + "')") + + console.log("Waiting for result...") // tslint:disable-line + await oni.client.waitForExist(".automated-test-result", 30000) + const resultText = await oni.client.getText(".automated-test-result") + + console.log("---RESULT") + console.log(resultText) // tslint:disable-line + console.log("---") + console.log("") + + console.log("Retrieving logs...") + + await oni.client.waitForExist(".automated-test-logs") + const clientLogs = await oni.client.getText(".automated-test-logs") + console.log("---LOGS (During run): ") + + const logs = JSON.parse(clientLogs).forEach((log) => console.log(log)) + + console.log("---") + + const result = JSON.parse(resultText) + assert.ok(result.passed) + }) + }) +} diff --git a/test/demo/DemoCommon.ts b/test/demo/DemoCommon.ts new file mode 100644 index 0000000000..59d65f95a5 --- /dev/null +++ b/test/demo/DemoCommon.ts @@ -0,0 +1,17 @@ +/** + * Script for hero screenshot on Oni's website and github + */ + +import * as path from "path" + +import * as mkdirp from "mkdirp" + +export const getRootPath = () => { + return path.join(__dirname, "..", "..", "..") +} + +export const getDistPath = () => { + const distPath = path.join(getRootPath(), "dist", "media") + mkdirp.sync(distPath) + return distPath +} diff --git a/test/demo/HeroDemo.ts b/test/demo/HeroDemo.ts new file mode 100644 index 0000000000..7e49b58880 --- /dev/null +++ b/test/demo/HeroDemo.ts @@ -0,0 +1,64 @@ +/** + * Script for demo on Oni's website + */ + +import * as assert from "assert" +import * as os from "os" +import * as path from "path" + +import { remote } from "electron" + +export const test = async (oni: any) => { + const shortDelay = async () => await oni.automation.sleep(500) + + const longDelay = async () => await oni.automation.sleep(1000) + + const simulateTyping = async (keys: string) => { + for (const key of keys) { + oni.automation.sendKeys(key) + await oni.automation.sleep(75 + Math.random() * 25) + } + } + + // Set window size + // remote.getCurrentWindow().setSize(640, 480) + oni.recorder.startRecording() + + await simulateTyping(":e HelloWorld.ts") + oni.automation.sendKeys("") + + await shortDelay() + + oni.automation.sendKeys("i") + await simulateTyping("const greeting = \"Hello World\";") + + oni.automation.sendKeys("") + + await simulateTyping("greeting = \"Hello again\";") + + await shortDelay() + + oni.automation.sendKeys("") + + await shortDelay() + + oni.automation.sendKeys("_") + + await longDelay() + + oni.automation.sendKeys("I") + await simulateTyping("const ") + oni.automation.sendKeys("") + oni.automation.sendKeys("e") + await simulateTyping("a2") + oni.automation.sendKeys("") + oni.automation.sendKeys("") + + await longDelay() + + oni.automation.sendKeys("o") + await simulateTyping("window.a") + await longDelay() + + await simulateTyping("lert(greeting)") +} diff --git a/test/demo/HeroScreenshot.ts b/test/demo/HeroScreenshot.ts new file mode 100644 index 0000000000..88932a371f --- /dev/null +++ b/test/demo/HeroScreenshot.ts @@ -0,0 +1,70 @@ +/** + * Script for hero screenshot on Oni's website and github + */ + +import * as assert from "assert" +import * as os from "os" +import * as path from "path" + +import { remote } from "electron" + +import { getDistPath, getRootPath } from "./DemoCommon" + +const getCompletionElement = () => { + + const elements = document.body.getElementsByClassName("autocompletion") + + if (!elements || !elements.length) { + return null + } else { + return elements[0] + } +} + +export const test = async (oni: any) => { + + let lastAlertText = null + window.alert = (myText) => lastAlertText = myText + + // Use the `Completion.ts` file as the screenshot source + remote.getCurrentWindow().setSize(800, 600) + + const outputPath = getDistPath() + + oni.configuration.setValues({"recorder.outputPath": outputPath}) + + const filePath = path.join(getRootPath(), "browser", "src", "Services", "Language", "LanguageStore.ts") + + oni.automation.sendKeys(":e WELCOME.md") + + await oni.automation.sleep(500) + + oni.automation.sendKeys(":e " + filePath + "") + + await oni.automation.sleep(500) + + oni.automation.sendKeys("/switchMap") + + await oni.automation.sleep(500) + + oni.automation.sendKeys("zz") + + await oni.automation.sleep(500) + + oni.automation.sendKeys("O") + oni.automation.sendKeys(".audi") + + await oni.automation.sleep(500) + + oni.automation.sendKeys("tTime((action") + + await oni.automation.sleep(500) + + await oni.automation.waitFor(() => getCompletionElement() !== null, 20000) + + await oni.automation.sleep(500) + + oni.recorder.takeScreenshot(`screenshot-${process.platform}.png`) + + await oni.automation.waitFor(() => lastAlertText !== null, 20000) +} From f00a2b6c2164f7bf929d6018d58451e37cd02c76 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 1 Dec 2017 18:56:13 -0800 Subject: [PATCH 60/63] Update to oni-api@0.0.7 (#1053) * Cherry-pick to bring in scroll event * Fix up remaining build issues * Fix lint error --- browser/src/Editor/Editor.ts | 9 +++++++++ browser/src/Editor/NeovimEditor.tsx | 9 +++++++++ browser/src/Services/EditorManager.ts | 6 ++++++ package.json | 2 +- yarn.lock | 6 +++--- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/browser/src/Editor/Editor.ts b/browser/src/Editor/Editor.ts index e7872aea8c..7c01d18adf 100644 --- a/browser/src/Editor/Editor.ts +++ b/browser/src/Editor/Editor.ts @@ -22,6 +22,7 @@ export class Editor implements Oni.Editor { private _onBufferLeaveEvent = new Event() private _onBufferChangedEvent = new Event() private _onBufferSavedEvent = new Event() + private _onBufferScrolledEvent = new Event() private _onCursorMoved = new Event() private _onModeChangedEvent = new Event() @@ -58,6 +59,10 @@ export class Editor implements Oni.Editor { return this._onBufferSavedEvent } + public get onBufferScrolled(): IEvent { + return this._onBufferScrolledEvent + } + public /* virtual */ openFile(filePath: string): Promise { return Promise.reject("Not implemented") } @@ -88,4 +93,8 @@ export class Editor implements Oni.Editor { protected notifyBufferSaved(bufferEvent: Oni.EditorBufferEventArgs): void { this._onBufferSavedEvent.dispatch(bufferEvent) } + + protected notifyBufferScrolled(bufferScrollEvent: Oni.EditorBufferScrolledEventArgs): void { + this._onBufferScrolledEvent.dispatch(bufferScrollEvent) + } } diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 8c46b368e8..5722e0447c 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -227,6 +227,15 @@ export class NeovimEditor extends Editor implements IEditor { this._syntaxHighlighter.notifyBufferUpdate(bufferUpdate) }) + this._neovimInstance.onScroll.subscribe((args: EventContext) => { + const convertedArgs: Oni.EditorBufferScrolledEventArgs = { + bufferTotalLines: args.bufferTotalLines, + windowTopLine: args.windowTopLine, + windowBottomLine: args.windowBottomLine, + } + this.notifyBufferScrolled(convertedArgs) + }) + addInsertModeLanguageFunctionality(this._cursorMovedI$, this._modeChanged$) const textMateHighlightingEnabled = this._config.getValue("experimental.editor.textMateHighlighting.enabled") diff --git a/browser/src/Services/EditorManager.ts b/browser/src/Services/EditorManager.ts index 765c5b4f0e..fd850cff2d 100644 --- a/browser/src/Services/EditorManager.ts +++ b/browser/src/Services/EditorManager.ts @@ -63,6 +63,7 @@ class AllEditors implements Oni.Editor { private _onBufferLeave = new Event() private _onBufferChanged = new Event() private _onBufferSaved = new Event() + private _onBufferScrolled = new Event() /** * API Methods @@ -123,6 +124,10 @@ class AllEditors implements Oni.Editor { return this._onBufferSaved } + public get onBufferScrolled(): IEvent { + return this._onBufferScrolled + } + public dispose(): void { // tslint:disable-line } @@ -140,6 +145,7 @@ class AllEditors implements Oni.Editor { this._subscriptions.push(newEditor.onBufferLeave.subscribe((val) => this._onBufferLeave.dispatch(val))) this._subscriptions.push(newEditor.onBufferChanged.subscribe((val) => this._onBufferChanged.dispatch(val))) this._subscriptions.push(newEditor.onBufferSaved.subscribe((val) => this._onBufferSaved.dispatch(val))) + this._subscriptions.push(newEditor.onBufferScrolled.subscribe((val) => this._onBufferScrolled.dispatch(val))) } public getUnderlyingEditor(): Oni.Editor { diff --git a/package.json b/package.json index 74fbb090f2..092079d079 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "minimist": "1.2.0", "msgpack-lite": "0.1.26", "ocaml-language-server": "1.0.12", - "oni-api": "0.0.6", + "oni-api": "0.0.7", "oni-neovim-binaries": "0.1.0", "oni-ripgrep": "0.0.3", "oni-types": "0.0.4", diff --git a/yarn.lock b/yarn.lock index fb2ac0b1f7..1ac8a819ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4145,9 +4145,9 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -oni-api@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.6.tgz#8f7e76394a86f564a3182ed1fb901397cb917aa2" +oni-api@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/oni-api/-/oni-api-0.0.7.tgz#190cdf07c5868b4be72d8c7cdec36ca4a1d565f6" oni-neovim-binaries@0.1.0: version "0.1.0" From 166cc7068a97236f41edc4bcd0311507db02d448 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 1 Dec 2017 19:29:59 -0800 Subject: [PATCH 61/63] Fix small bugs around configuring colors (#1052) * Fix case where colors from configuration weren't being properly respected * On Windows, the configuration can return null while the save is in progress - ignore in tht case * Fix case where configuration is actually null because it is not defined --- browser/src/Editor/NeovimEditor.tsx | 2 -- browser/src/Plugins/Api/Oni.ts | 5 ++--- browser/src/Services/Colors.ts | 10 ++++++++++ browser/src/Services/Configuration/Configuration.ts | 11 +++++++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/browser/src/Editor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor.tsx index 5722e0447c..8b84abd7ef 100644 --- a/browser/src/Editor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor.tsx @@ -384,13 +384,11 @@ export class NeovimEditor extends Editor implements IEditor { if (newTheme.baseVimTheme && newTheme.baseVimTheme !== this._currentColorScheme) { this._neovimInstance.command(":color " + newTheme.baseVimTheme) - UI.Actions.setColors(this._themeManager.getColors()) } }) if (this._themeManager.activeTheme && this._themeManager.activeTheme.baseVimTheme) { await this._neovimInstance.command(":color " + this._themeManager.activeTheme.baseVimTheme) - UI.Actions.setColors(this._themeManager.getColors()) } this._hasLoaded = true diff --git a/browser/src/Plugins/Api/Oni.ts b/browser/src/Plugins/Api/Oni.ts index 4f3a8f3de7..6d279d91ee 100644 --- a/browser/src/Plugins/Api/Oni.ts +++ b/browser/src/Plugins/Api/Oni.ts @@ -17,7 +17,7 @@ import { Services } from "./Services" import { Ui } from "./Ui" import { automation } from "./../../Services/Automation" -import { Colors } from "./../../Services/Colors" +import { Colors, getInstance as getColors } from "./../../Services/Colors" import { commandManager } from "./../../Services/CommandManager" import { configuration } from "./../../Services/Configuration" import { contextMenuManager } from "./../../Services/ContextMenu" @@ -27,7 +27,6 @@ import { languageManager } from "./../../Services/Language" import { menuManager } from "./../../Services/Menu" import { recorder } from "./../../Services/Recorder" import { statusBar } from "./../../Services/StatusBar" -import { getThemeManagerInstance } from "./../../Services/Themes" import { windowManager, WindowManager } from "./../../Services/WindowManager" import { workspace } from "./../../Services/Workspace" @@ -140,7 +139,7 @@ export class Oni extends EventEmitter implements OniApi.Plugin.Api { constructor() { super() - this._colors = new Colors(getThemeManagerInstance(), configuration) + this._colors = getColors() this._diagnostics = new Diagnostics() this._dependencies = new Dependencies() diff --git a/browser/src/Services/Colors.ts b/browser/src/Services/Colors.ts index 0cbf4ef467..dc942923e5 100644 --- a/browser/src/Services/Colors.ts +++ b/browser/src/Services/Colors.ts @@ -13,6 +13,16 @@ import { getThemeManagerInstance, ThemeManager } from "./Themes" export interface ColorsDictionary { [colorName: string]: string} +let _colors: Colors = null +export const getInstance = (): Colors => { + + if (_colors === null) { + _colors = new Colors() + } + + return _colors +} + export class Colors implements IDisposable { private _subscriptions: IDisposable[] = [] diff --git a/browser/src/Services/Configuration/Configuration.ts b/browser/src/Services/Configuration/Configuration.ts index b4821e9a6f..199349eacf 100644 --- a/browser/src/Services/Configuration/Configuration.ts +++ b/browser/src/Services/Configuration/Configuration.ts @@ -20,6 +20,7 @@ export class Configuration implements Oni.Configuration { private _onConfigurationChangedEvent: Event> = new Event>() private _oniApi: Oni.Plugin.Api = null private _config: IConfigurationValues = null + private _configEverHadValue: boolean = false private _setValues: { [configValue: string]: any } = { } @@ -109,10 +110,20 @@ export class Configuration implements Oni.Configuration { const previousConfig = this._config const userRuntimeConfigOrError = this.getUserRuntimeConfig() + + // If the configuration is null, but it had some value at some point, + // we assume this is due to reading while the file write is still in + // transition, and ignore it + if (userRuntimeConfigOrError === null && this._configEverHadValue) { + Log.info("Configuration was null; skipping") + return + } + if (isError(userRuntimeConfigOrError)) { Log.error(userRuntimeConfigOrError) this._config = { ...DefaultConfiguration, ...this._setValues } } else { + this._configEverHadValue = true this._config = { ...DefaultConfiguration, ...this._setValues, ...userRuntimeConfigOrError} } From 42ecacd4f7f6bf8518ac5146448a99afced62cf6 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Sat, 2 Dec 2017 17:35:12 -0800 Subject: [PATCH 62/63] TypeScript & JavaScript: Use "definition" instead of "typeDefinition" (#1054) * Add 'definition' method in TypeScriptServerHost * Use 'getDefinition' instead of 'getTypeDefinition' for more predictable go-to-definition behavior --- vim/core/oni-plugin-typescript/src/Definition.ts | 2 +- vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/vim/core/oni-plugin-typescript/src/Definition.ts b/vim/core/oni-plugin-typescript/src/Definition.ts index d72437b69d..6f35392ffe 100644 --- a/vim/core/oni-plugin-typescript/src/Definition.ts +++ b/vim/core/oni-plugin-typescript/src/Definition.ts @@ -21,7 +21,7 @@ export const getDefinition = (oni: Oni.Plugin.Api, host: TypeScriptServerHost) = const position: types.Position = payload.position const filePath = oni.language.unwrapFileUriPath(textDocument.uri) - const val: any = await host.getTypeDefinition(filePath, position.line + 1, position.character + 1) + const val: any = await host.getDefinition(filePath, position.line + 1, position.character + 1) const resultPos = val[0] diff --git a/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts b/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts index 79b69cc80e..f7704d8854 100644 --- a/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts +++ b/vim/core/oni-plugin-typescript/src/TypeScriptServerHost.ts @@ -97,6 +97,13 @@ export class TypeScriptServerHost extends events.EventEmitter { needFileNameList: true, }) } + public getDefinition(file: string, line: number, offset: number): Promise { + return this._makeTssRequest("definition", { + file, + line, + offset, + }) + } public getTypeDefinition(file: string, line: number, offset: number): Promise { return this._makeTssRequest("typeDefinition", { From cf531a4488544dcc755f521eeae754166e4c5906 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Sat, 2 Dec 2017 17:35:20 -0800 Subject: [PATCH 63/63] Performance - Typing Prediction: Fix whole-screen repaints (#1056) * Fix up rendering of predictions, in order to prevent whole-page repaints * Fix lint issues --- browser/src/UI/components/TypingPredictions.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/browser/src/UI/components/TypingPredictions.tsx b/browser/src/UI/components/TypingPredictions.tsx index dcab90847a..4dd2f65c50 100644 --- a/browser/src/UI/components/TypingPredictions.tsx +++ b/browser/src/UI/components/TypingPredictions.tsx @@ -53,13 +53,18 @@ class TypingPredictionView extends React.PureComponent { const elem = document.createElement("div") elem.className = "predicted-text" elem.style.position = "absolute" - elem.style.top = this.props.y.toString() + "px" - elem.style.left = (startX + idx * this.props.width).toString() + "px" + elem.style.top = "0px" + elem.style.left = (idx * this.props.width).toString() + "px" elem.style.width = (this.props.width.toString()) + "px" elem.style.height = (this.props.height.toString()) + "px" elem.style.lineHeight = this.props.height.toString() + "px" @@ -91,11 +96,13 @@ class TypingPredictionView extends React.PureComponent this._containerElement = elem}>