From f170d37479774c6fe15bb2aafff06e2a2a2258dd Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Mar 2013 07:39:32 +0100 Subject: [PATCH 001/281] Use cefode's CEF binary. --- Rakefile | 8 +++- script/download_cef | 91 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100755 script/download_cef diff --git a/Rakefile b/Rakefile index 704999599..fa4acf85a 100644 --- a/Rakefile +++ b/Rakefile @@ -20,7 +20,9 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - exit 1 unless system %{prebuilt-cef/script/download -f cef} + # TODO Use prebuilt-cef's script after https://github.com/github/prebuilt-cef/pull/2 is merged. + # exit 1 unless system %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{script/download_cef -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -28,7 +30,9 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - sh %{prebuilt-cef/script/download -s cef} + # TODO Use prebuilt-cef's script after https://github.com/github/prebuilt-cef/pull/2 is merged. + # sh %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{script/download_cef -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do diff --git a/script/download_cef b/script/download_cef new file mode 100755 index 000000000..5ba36bb92 --- /dev/null +++ b/script/download_cef @@ -0,0 +1,91 @@ +#!/bin/sh +#/ Usage: download [-f] [-s] [-b cef-branch] [-r cef-revision] [-d url/to/prebuilt/cef] path/for/extraction +#/ Download and extract prebuilt CEF. +#/ +#/ Options: +#/ -f Overwrite path/for/extraction if it already exists. +#/ -s Download debugging symbols as well. +#/ -b CEF branch. +#/ -r CEF revision. +#/ -d Where to download binaries. +#/ -h Show this message. + +set -e + +usage() { + grep '^#/' <"$0"| cut -c4- +} + +DISTURL="https://github-janky-artifacts.s3.amazonaws.com/prebuilt-cef" + +while getopts ":fsb:r:d:h" OPTION; do + case ${OPTION} in + f) + FORCE=1 + ;; + s) + SYMBOLS=1 + ;; + b) + CEF_BRANCH=${OPTARG} + ;; + r) + CEF_REVISION=${OPTARG} + ;; + d) + DISTURL=${OPTARG} + ;; + h) + usage + exit 0 + ;; + ?) + echo "Unknown option -${OPTARG}" + usage + exit 1 + ;; + esac +done + +shift $((OPTIND-1)) + +if [ -z "${1}" ]; then + usage + exit 1 +fi + +if [ "$(uname)" = "Darwin" ]; then + OS_TYPE=macosx +else + OS_TYPE=linux +fi +CEF_BASENAME="cef_binary_3.${CEF_BRANCH}.${CEF_REVISION}_${OS_TYPE}" +CEF_SYMBOLS_BASENAME="${CEF_BASENAME}_symbols" + +TEMP_DIR=$(mktemp -d -t prebuilt-cef-download.XXXXXX) +trap "rm -rf \"${TEMP_DIR}\"" EXIT + +# See if we've already downloaded this version. +grep -E "^CEF Version:[[:space:]]+3\.${CEF_BRANCH}\.${CEF_REVISION}$" "${1}/README.txt" >/dev/null 2>&1 || { + if [ -e "${1}" ] && [ "${FORCE}" != "1" ]; then + echo >&2 "Error: ${1} already exists. Pass -f if you want to overwrite it." + exit 1 + fi + + rm -rf "${1}" + mkdir -p "${1}" + + echo "Downloading/extracting CEF3 branch ${CEF_BRANCH} r${CEF_REVISION}..." + curl --progress-bar "${DISTURL}/${CEF_BASENAME}.zip" > "${TEMP_DIR}/cef.zip" + unzip -q "${TEMP_DIR}/cef.zip" -d "${TEMP_DIR}" + mv "${TEMP_DIR}/${CEF_BASENAME}"/* "${1}" +} + +if [ "${SYMBOLS}" != "1" ]; then + exit 0 +fi + +echo "Downloading/extracting symbols for CEF3 branch ${CEF_BRANCH} r${CEF_REVISION}..." +curl --progress-bar "${DISTURL}/${CEF_SYMBOLS_BASENAME}.zip" > "${TEMP_DIR}/symbols.zip" +unzip -q "${TEMP_DIR}/symbols.zip" -d "${TEMP_DIR}" +mv "${TEMP_DIR}/${CEF_SYMBOLS_BASENAME}"/* "${1}/Release" From cc4fea5e6720de9d375323ab28f49985694c7b6e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Mar 2013 08:14:15 +0100 Subject: [PATCH 002/281] Adopt to CEF's API change. --- native/atom_window_controller.mm | 60 +++++++++++++------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index eaf40f2c5..66f8185eb 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -204,42 +204,30 @@ - (void)populateBrowserSettings:(CefBrowserSettings &)settings { CefString(&settings.default_encoding) = "UTF-8"; - settings.remote_fonts_disabled = false; - settings.encoding_detector_enabled = false; - settings.javascript_disabled = false; - settings.javascript_open_windows_disallowed = false; - settings.javascript_close_windows_disallowed = false; - settings.javascript_access_clipboard_disallowed = false; - settings.dom_paste_disabled = true; - settings.caret_browsing_enabled = false; - settings.java_disabled = true; - settings.plugins_disabled = true; - settings.universal_access_from_file_urls_allowed = false; - settings.file_access_from_file_urls_allowed = false; - settings.web_security_disabled = true; - settings.xss_auditor_enabled = true; - settings.image_load_disabled = false; - settings.shrink_standalone_images_to_fit = false; - settings.site_specific_quirks_disabled = false; - settings.text_area_resize_disabled = false; - settings.page_cache_disabled = true; - settings.tab_to_links_disabled = true; - settings.hyperlink_auditing_disabled = true; - settings.user_style_sheet_enabled = false; - settings.author_and_user_styles_disabled = false; - settings.local_storage_disabled = false; - settings.databases_disabled = false; - settings.application_cache_disabled = false; - settings.webgl_disabled = false; - settings.accelerated_compositing_disabled = false; - settings.accelerated_layers_disabled = false; - settings.accelerated_video_disabled = false; - settings.accelerated_2d_canvas_disabled = false; -// settings.accelerated_painting_enabled = true; -// settings.accelerated_filters_enabled = true; - settings.accelerated_plugins_disabled = false; - settings.developer_tools_disabled = false; -// settings.fullscreen_enabled = true; + settings.remote_fonts = STATE_ENABLED; + settings.javascript = STATE_ENABLED; + settings.javascript_open_windows = STATE_ENABLED; + settings.javascript_close_windows = STATE_ENABLED; + settings.javascript_access_clipboard = STATE_ENABLED; + settings.javascript_dom_paste = STATE_DISABLED; + settings.caret_browsing = STATE_DISABLED; + settings.java = STATE_DISABLED; + settings.plugins = STATE_DISABLED; + settings.universal_access_from_file_urls = STATE_DISABLED; + settings.file_access_from_file_urls = STATE_DISABLED; + settings.web_security = STATE_DISABLED; + settings.image_loading = STATE_ENABLED; + settings.image_shrink_standalone_to_fit = STATE_DISABLED; + settings.text_area_resize = STATE_ENABLED; + settings.page_cache = STATE_DISABLED; + settings.tab_to_links = STATE_DISABLED; + settings.author_and_user_styles = STATE_ENABLED; + settings.local_storage = STATE_ENABLED; + settings.databases = STATE_ENABLED; + settings.application_cache = STATE_ENABLED; + settings.webgl = STATE_ENABLED; + settings.accelerated_compositing = STATE_ENABLED; + settings.developer_tools = STATE_ENABLED; } @end From 091851ee3d576d0dc97d196073dd95c38553a44f Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Mar 2013 09:05:02 +0100 Subject: [PATCH 003/281] First taste of node. --- src/stdlib/fs.coffee | 3 ++- src/stdlib/task-shell.coffee | 3 +++ static/index.html | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index cac22e5fe..62c7d1794 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -2,6 +2,7 @@ # http://ringojs.org/api/v0.8/fs/ _ = require 'underscore' +nodeFs = nodeRequire 'fs' module.exports = # Make the given path absolute by resolving it against the @@ -90,7 +91,7 @@ module.exports = # Open, read, and close a file, returning the file's contents. read: (path) -> - $native.read(path) + String nodeFs.readFileSync(path) # Returns an array of path components. If the path is absolute, the first # component will be an indicator of the root of the file system; for file diff --git a/src/stdlib/task-shell.coffee b/src/stdlib/task-shell.coffee index 458235e56..f4e583500 100644 --- a/src/stdlib/task-shell.coffee +++ b/src/stdlib/task-shell.coffee @@ -12,6 +12,9 @@ self.console = log: -> callTaskMethod 'log', arguments... error: -> callTaskMethod 'error', arguments... +self.nodeRequire = self.require +self.require = undefined + window.document = createElement: -> setAttribute: -> diff --git a/static/index.html b/static/index.html index 0e27bf115..960344d24 100644 --- a/static/index.html +++ b/static/index.html @@ -23,6 +23,9 @@ console.error(error.stack || error); } } + + window.nodeRequire = window.require; + window.require = undefined; From fe7f43155a4382ebfb81102908f8b45104d72bb7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Mar 2013 15:04:17 +0100 Subject: [PATCH 004/281] Use the dowload script of prebuilt-cef. --- Rakefile | 8 +--- prebuilt-cef | 2 +- script/download_cef | 91 --------------------------------------------- 3 files changed, 3 insertions(+), 98 deletions(-) delete mode 100755 script/download_cef diff --git a/Rakefile b/Rakefile index fa4acf85a..8e07e69e0 100644 --- a/Rakefile +++ b/Rakefile @@ -20,9 +20,7 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - # TODO Use prebuilt-cef's script after https://github.com/github/prebuilt-cef/pull/2 is merged. - # exit 1 unless system %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} - exit 1 unless system %{script/download_cef -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -30,9 +28,7 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - # TODO Use prebuilt-cef's script after https://github.com/github/prebuilt-cef/pull/2 is merged. - # sh %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} - sh %{script/download_cef -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do diff --git a/prebuilt-cef b/prebuilt-cef index c24e35c3e..59d147be2 160000 --- a/prebuilt-cef +++ b/prebuilt-cef @@ -1 +1 @@ -Subproject commit c24e35c3ed60952f9e3ed6b3a73e17f0714d147b +Subproject commit 59d147be26fc404ed0522729e363a324bff98b66 diff --git a/script/download_cef b/script/download_cef deleted file mode 100755 index 5ba36bb92..000000000 --- a/script/download_cef +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/sh -#/ Usage: download [-f] [-s] [-b cef-branch] [-r cef-revision] [-d url/to/prebuilt/cef] path/for/extraction -#/ Download and extract prebuilt CEF. -#/ -#/ Options: -#/ -f Overwrite path/for/extraction if it already exists. -#/ -s Download debugging symbols as well. -#/ -b CEF branch. -#/ -r CEF revision. -#/ -d Where to download binaries. -#/ -h Show this message. - -set -e - -usage() { - grep '^#/' <"$0"| cut -c4- -} - -DISTURL="https://github-janky-artifacts.s3.amazonaws.com/prebuilt-cef" - -while getopts ":fsb:r:d:h" OPTION; do - case ${OPTION} in - f) - FORCE=1 - ;; - s) - SYMBOLS=1 - ;; - b) - CEF_BRANCH=${OPTARG} - ;; - r) - CEF_REVISION=${OPTARG} - ;; - d) - DISTURL=${OPTARG} - ;; - h) - usage - exit 0 - ;; - ?) - echo "Unknown option -${OPTARG}" - usage - exit 1 - ;; - esac -done - -shift $((OPTIND-1)) - -if [ -z "${1}" ]; then - usage - exit 1 -fi - -if [ "$(uname)" = "Darwin" ]; then - OS_TYPE=macosx -else - OS_TYPE=linux -fi -CEF_BASENAME="cef_binary_3.${CEF_BRANCH}.${CEF_REVISION}_${OS_TYPE}" -CEF_SYMBOLS_BASENAME="${CEF_BASENAME}_symbols" - -TEMP_DIR=$(mktemp -d -t prebuilt-cef-download.XXXXXX) -trap "rm -rf \"${TEMP_DIR}\"" EXIT - -# See if we've already downloaded this version. -grep -E "^CEF Version:[[:space:]]+3\.${CEF_BRANCH}\.${CEF_REVISION}$" "${1}/README.txt" >/dev/null 2>&1 || { - if [ -e "${1}" ] && [ "${FORCE}" != "1" ]; then - echo >&2 "Error: ${1} already exists. Pass -f if you want to overwrite it." - exit 1 - fi - - rm -rf "${1}" - mkdir -p "${1}" - - echo "Downloading/extracting CEF3 branch ${CEF_BRANCH} r${CEF_REVISION}..." - curl --progress-bar "${DISTURL}/${CEF_BASENAME}.zip" > "${TEMP_DIR}/cef.zip" - unzip -q "${TEMP_DIR}/cef.zip" -d "${TEMP_DIR}" - mv "${TEMP_DIR}/${CEF_BASENAME}"/* "${1}" -} - -if [ "${SYMBOLS}" != "1" ]; then - exit 0 -fi - -echo "Downloading/extracting symbols for CEF3 branch ${CEF_BRANCH} r${CEF_REVISION}..." -curl --progress-bar "${DISTURL}/${CEF_SYMBOLS_BASENAME}.zip" > "${TEMP_DIR}/symbols.zip" -unzip -q "${TEMP_DIR}/symbols.zip" -d "${TEMP_DIR}" -mv "${TEMP_DIR}/${CEF_SYMBOLS_BASENAME}"/* "${1}/Release" From 07a8a35e4875adb2c97af6d739066b33530e8c69 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Mar 2013 14:28:53 -0800 Subject: [PATCH 005/281] Migrate fs.traverseTree to use Node's fs --- src/stdlib/fs.coffee | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 62c7d1794..5f0a7752d 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -121,7 +121,20 @@ module.exports = $native.getAllFilePathsAsync(rootPath, callback) traverseTree: (rootPath, onFile, onDirectory) -> - $native.traverseTree(rootPath, onFile, onDirectory) + return unless nodeFs.existsSync(rootPath) and nodeFs.statSync(rootPath).isDirectory() + + traverse = (rootPath, prefix, onFile, onDirectory) => + prefix = "#{prefix}/" if prefix + for file in nodeFs.readdirSync(rootPath) + relativePath = "#{prefix}#{file}" + absolutePath = @join(rootPath, file) + stats = nodeFs.statSync(absolutePath) + if stats.isDirectory() + traverse(absolutePath, relativePath, onFile, onDirectory) if onDirectory(relativePath) + else if stats.isFile() + onFile(relativePath) + + traverse(rootPath, '', onFile, onDirectory) lastModified: (path) -> $native.lastModified(path) From fbd6364f78b57beaae9f9b209905e02c383d236f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 5 Mar 2013 14:51:51 -0800 Subject: [PATCH 006/281] Redirect worker console to window console Use __defineGetter__ instead of setting a console property on self because cefode already defines a console via __defineGetter__ and we need to override it. --- src/stdlib/task-shell.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stdlib/task-shell.coffee b/src/stdlib/task-shell.coffee index f4e583500..5274f9c88 100644 --- a/src/stdlib/task-shell.coffee +++ b/src/stdlib/task-shell.coffee @@ -7,10 +7,11 @@ self.window = {} self.attachEvent = -> -self.console = +console = warn: -> callTaskMethod 'warn', arguments... log: -> callTaskMethod 'log', arguments... error: -> callTaskMethod 'error', arguments... +self.__defineGetter__ 'console', -> console self.nodeRequire = self.require self.require = undefined From ce2d0389e1e9d9cb5d6195226f1a7a76947a6cb8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Mar 2013 18:50:35 -0800 Subject: [PATCH 007/281] Use ctags node module Remove internal ctags code and defer to new node module for finding tags and listing tags. --- atom.gyp | 4 - native/atom_cef_render_process_handler.mm | 2 - native/atom_window_controller.mm | 3 + native/v8_extensions/readtags.c | 970 ------------------ native/v8_extensions/readtags.h | 252 ----- native/v8_extensions/tags.h | 26 - native/v8_extensions/tags.mm | 116 --- package.json | 3 +- script/bootstrap | 2 +- script/copy-files-to-bundle | 2 +- .../symbols-view/lib/load-tags-handler.coffee | 17 + .../symbols-view/lib/load-tags-task.coffee | 13 + .../symbols-view/lib/tag-reader.coffee | 13 +- 13 files changed, 43 insertions(+), 1380 deletions(-) delete mode 100644 native/v8_extensions/readtags.c delete mode 100644 native/v8_extensions/readtags.h delete mode 100644 native/v8_extensions/tags.h delete mode 100644 native/v8_extensions/tags.mm create mode 100644 src/packages/symbols-view/lib/load-tags-handler.coffee create mode 100644 src/packages/symbols-view/lib/load-tags-task.coffee diff --git a/atom.gyp b/atom.gyp index 1c8f40997..fbc623735 100644 --- a/atom.gyp +++ b/atom.gyp @@ -259,10 +259,6 @@ 'native/v8_extensions/onig_reg_exp.mm', 'native/v8_extensions/onig_scanner.h', 'native/v8_extensions/onig_scanner.mm', - 'native/v8_extensions/readtags.c', - 'native/v8_extensions/readtags.h', - 'native/v8_extensions/tags.h', - 'native/v8_extensions/tags.mm', ], 'link_settings': { 'libraries': [ diff --git a/native/atom_cef_render_process_handler.mm b/native/atom_cef_render_process_handler.mm index d36a6c235..93dad9451 100644 --- a/native/atom_cef_render_process_handler.mm +++ b/native/atom_cef_render_process_handler.mm @@ -4,7 +4,6 @@ #import "native/v8_extensions/onig_reg_exp.h" #import "native/v8_extensions/onig_scanner.h" #import "native/v8_extensions/git.h" -#import "native/v8_extensions/tags.h" #import "native/message_translation.h" #import "path_watcher.h" #import "atom_cef_render_process_handler.h" @@ -125,5 +124,4 @@ void AtomCefRenderProcessHandler::InjectExtensionsIntoV8Context(CefRefPtrCreateContextBinding(context); (new v8_extensions::OnigRegExp())->CreateContextBinding(context); (new v8_extensions::OnigScanner())->CreateContextBinding(context); - (new v8_extensions::Tags())->CreateContextBinding(context); } diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 66f8185eb..5e0375a35 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -49,6 +49,9 @@ _resourcePath = [_resourcePath stringByStandardizingPath]; [_resourcePath retain]; + NSString *nodePath = [NSString stringWithFormat:@"%@/node_modules", _resourcePath]; + setenv("NODE_PATH", [nodePath UTF8String], TRUE); + if (!background) { [self setShouldCascadeWindows:NO]; [self setWindowFrameAutosaveName:@"AtomWindow"]; diff --git a/native/v8_extensions/readtags.c b/native/v8_extensions/readtags.c deleted file mode 100644 index 4cab3f358..000000000 --- a/native/v8_extensions/readtags.c +++ /dev/null @@ -1,970 +0,0 @@ -/* -* $Id: readtags.c 592 2007-07-31 03:30:41Z dhiebert $ -* -* Copyright (c) 1996-2003, Darren Hiebert -* -* This source code is released into the public domain. -* -* This module contains functions for reading tag files. -*/ - -/* -* INCLUDE FILES -*/ -#include -#include -#include -#include -#include -#include /* to declare off_t */ - -#include "readtags.h" - -/* -* MACROS -*/ -#define TAB '\t' - - -/* -* DATA DECLARATIONS -*/ -typedef struct { - size_t size; - char *buffer; -} vstring; - -/* Information about current tag file */ -struct sTagFile { - /* has the file been opened and this structure initialized? */ - short initialized; - /* format of tag file */ - short format; - /* how is the tag file sorted? */ - sortType sortMethod; - /* pointer to file structure */ - FILE* fp; - /* file position of first character of `line' */ - off_t pos; - /* size of tag file in seekable positions */ - off_t size; - /* last line read */ - vstring line; - /* name of tag in last line read */ - vstring name; - /* defines tag search state */ - struct { - /* file position of last match for tag */ - off_t pos; - /* name of tag last searched for */ - char *name; - /* length of name for partial matches */ - size_t nameLength; - /* peforming partial match */ - short partial; - /* ignoring case */ - short ignorecase; - } search; - /* miscellaneous extension fields */ - struct { - /* number of entries in `list' */ - unsigned short max; - /* list of key value pairs */ - tagExtensionField *list; - } fields; - /* buffers to be freed at close */ - struct { - /* name of program author */ - char *author; - /* name of program */ - char *name; - /* URL of distribution */ - char *url; - /* program version */ - char *version; - } program; -}; - -/* -* DATA DEFINITIONS -*/ -const char *const EmptyString = ""; -const char *const PseudoTagPrefix = "!_"; - -/* -* FUNCTION DEFINITIONS -*/ - -/* - * Compare two strings, ignoring case. - * Return 0 for match, < 0 for smaller, > 0 for bigger - * Make sure case is folded to uppercase in comparison (like for 'sort -f') - * This makes a difference when one of the chars lies between upper and lower - * ie. one of the chars [ \ ] ^ _ ` for ascii. (The '_' in particular !) - */ -static int struppercmp (const char *s1, const char *s2) -{ - int result; - do - { - result = toupper ((int) *s1) - toupper ((int) *s2); - } while (result == 0 && *s1++ != '\0' && *s2++ != '\0'); - return result; -} - -static int strnuppercmp (const char *s1, const char *s2, size_t n) -{ - int result; - do - { - result = toupper ((int) *s1) - toupper ((int) *s2); - } while (result == 0 && --n > 0 && *s1++ != '\0' && *s2++ != '\0'); - return result; -} - -static int growString (vstring *s) -{ - int result = 0; - size_t newLength; - char *newLine; - if (s->size == 0) - { - newLength = 128; - newLine = (char*) malloc (newLength); - *newLine = '\0'; - } - else - { - newLength = 2 * s->size; - newLine = (char*) realloc (s->buffer, newLength); - } - if (newLine == NULL) - perror ("string too large"); - else - { - s->buffer = newLine; - s->size = newLength; - result = 1; - } - return result; -} - -/* Copy name of tag out of tag line */ -static void copyName (tagFile *const file) -{ - size_t length; - const char *end = strchr (file->line.buffer, '\t'); - if (end == NULL) - { - end = strchr (file->line.buffer, '\n'); - if (end == NULL) - end = strchr (file->line.buffer, '\r'); - } - if (end != NULL) - length = end - file->line.buffer; - else - length = strlen (file->line.buffer); - while (length >= file->name.size) - growString (&file->name); - strncpy (file->name.buffer, file->line.buffer, length); - file->name.buffer [length] = '\0'; -} - -static int readTagLineRaw (tagFile *const file) -{ - int result = 1; - int reReadLine; - - /* If reading the line places any character other than a null or a - * newline at the last character position in the buffer (one less than - * the buffer size), then we must resize the buffer and reattempt to read - * the line. - */ - do - { - char *const pLastChar = file->line.buffer + file->line.size - 2; - char *line; - - file->pos = ftell (file->fp); - reReadLine = 0; - *pLastChar = '\0'; - line = fgets (file->line.buffer, (int) file->line.size, file->fp); - if (line == NULL) - { - /* read error */ - if (! feof (file->fp)) - perror ("readTagLine"); - result = 0; - } - else if (*pLastChar != '\0' && - *pLastChar != '\n' && *pLastChar != '\r') - { - /* buffer overflow */ - growString (&file->line); - fseek (file->fp, file->pos, SEEK_SET); - reReadLine = 1; - } - else - { - size_t i = strlen (file->line.buffer); - while (i > 0 && - (file->line.buffer [i - 1] == '\n' || file->line.buffer [i - 1] == '\r')) - { - file->line.buffer [i - 1] = '\0'; - --i; - } - } - } while (reReadLine && result); - if (result) - copyName (file); - return result; -} - -static int readTagLine (tagFile *const file) -{ - int result; - do - { - result = readTagLineRaw (file); - } while (result && *file->name.buffer == '\0'); - return result; -} - -static tagResult growFields (tagFile *const file) -{ - tagResult result = TagFailure; - unsigned short newCount = (unsigned short) 2 * file->fields.max; - tagExtensionField *newFields = (tagExtensionField*) - realloc (file->fields.list, newCount * sizeof (tagExtensionField)); - if (newFields == NULL) - perror ("too many extension fields"); - else - { - file->fields.list = newFields; - file->fields.max = newCount; - result = TagSuccess; - } - return result; -} - -static void parseExtensionFields (tagFile *const file, tagEntry *const entry, - char *const string) -{ - char *p = string; - while (p != NULL && *p != '\0') - { - while (*p == TAB) - *p++ = '\0'; - if (*p != '\0') - { - char *colon; - char *field = p; - p = strchr (p, TAB); - if (p != NULL) - *p++ = '\0'; - colon = strchr (field, ':'); - if (colon == NULL) - entry->kind = field; - else - { - const char *key = field; - const char *value = colon + 1; - *colon = '\0'; - if (strcmp (key, "kind") == 0) - entry->kind = value; - else if (strcmp (key, "file") == 0) - entry->fileScope = 1; - else if (strcmp (key, "line") == 0) - entry->address.lineNumber = atol (value); - else - { - if (entry->fields.count == file->fields.max) - growFields (file); - file->fields.list [entry->fields.count].key = key; - file->fields.list [entry->fields.count].value = value; - ++entry->fields.count; - } - } - } - } -} - -static void parseTagLine (tagFile *file, tagEntry *const entry) -{ - int i; - char *p = file->line.buffer; - char *tab = strchr (p, TAB); - - entry->fields.list = NULL; - entry->fields.count = 0; - entry->kind = NULL; - entry->fileScope = 0; - - entry->name = p; - if (tab != NULL) - { - *tab = '\0'; - p = tab + 1; - entry->file = p; - tab = strchr (p, TAB); - if (tab != NULL) - { - int fieldsPresent; - *tab = '\0'; - p = tab + 1; - if (*p == '/' || *p == '?') - { - /* parse pattern */ - int delimiter = *(unsigned char*) p; - entry->address.lineNumber = 0; - entry->address.pattern = p; - do - { - p = strchr (p + 1, delimiter); - if (p == NULL) - break; - if (*(p - 1) != '\\') - break; - // Make sure preceding backslash isn't an escaped backslash by - // advancing backwards and counting the number of backslashes - int slashCount = 1; - while (*(p - slashCount - 1) == '\\') - slashCount++; - if (slashCount % 2 == 0) - break; - } while (1); - if (p == NULL) - { - /* invalid pattern */ - } - else - ++p; - } - else if (isdigit ((int) *(unsigned char*) p)) - { - /* parse line number */ - entry->address.pattern = p; - entry->address.lineNumber = atol (p); - while (isdigit ((int) *(unsigned char*) p)) - ++p; - } - else - { - /* invalid pattern */ - } - fieldsPresent = (strncmp (p, ";\"", 2) == 0); - *p = '\0'; - if (fieldsPresent) - parseExtensionFields (file, entry, p + 2); - } - } - if (entry->fields.count > 0) - entry->fields.list = file->fields.list; - for (i = entry->fields.count ; i < file->fields.max ; ++i) - { - file->fields.list [i].key = NULL; - file->fields.list [i].value = NULL; - } -} - -static char *duplicate (const char *str) -{ - char *result = NULL; - if (str != NULL) - { - result = strdup (str); - if (result == NULL) - perror (NULL); - } - return result; -} - -static void readPseudoTags (tagFile *const file, tagFileInfo *const info) -{ - fpos_t startOfLine; - const size_t prefixLength = strlen (PseudoTagPrefix); - if (info != NULL) - { - info->file.format = 1; - info->file.sort = TAG_UNSORTED; - info->program.author = NULL; - info->program.name = NULL; - info->program.url = NULL; - info->program.version = NULL; - } - while (1) - { - fgetpos (file->fp, &startOfLine); - if (! readTagLine (file)) - break; - if (strncmp (file->line.buffer, PseudoTagPrefix, prefixLength) != 0) - break; - else - { - tagEntry entry; - const char *key, *value; - parseTagLine (file, &entry); - key = entry.name + prefixLength; - value = entry.file; - if (strcmp (key, "TAG_FILE_SORTED") == 0) - file->sortMethod = (sortType) atoi (value); - else if (strcmp (key, "TAG_FILE_FORMAT") == 0) - file->format = (short) atoi (value); - else if (strcmp (key, "TAG_PROGRAM_AUTHOR") == 0) - file->program.author = duplicate (value); - else if (strcmp (key, "TAG_PROGRAM_NAME") == 0) - file->program.name = duplicate (value); - else if (strcmp (key, "TAG_PROGRAM_URL") == 0) - file->program.url = duplicate (value); - else if (strcmp (key, "TAG_PROGRAM_VERSION") == 0) - file->program.version = duplicate (value); - if (info != NULL) - { - info->file.format = file->format; - info->file.sort = file->sortMethod; - info->program.author = file->program.author; - info->program.name = file->program.name; - info->program.url = file->program.url; - info->program.version = file->program.version; - } - } - } - fsetpos (file->fp, &startOfLine); -} - -static void gotoFirstLogicalTag (tagFile *const file) -{ - fpos_t startOfLine; - const size_t prefixLength = strlen (PseudoTagPrefix); - rewind (file->fp); - while (1) - { - fgetpos (file->fp, &startOfLine); - if (! readTagLine (file)) - break; - if (strncmp (file->line.buffer, PseudoTagPrefix, prefixLength) != 0) - break; - } - fsetpos (file->fp, &startOfLine); -} - -static tagFile *initialize (const char *const filePath, tagFileInfo *const info) -{ - tagFile *result = (tagFile*) calloc ((size_t) 1, sizeof (tagFile)); - if (result != NULL) - { - growString (&result->line); - growString (&result->name); - result->fields.max = 20; - result->fields.list = (tagExtensionField*) calloc ( - result->fields.max, sizeof (tagExtensionField)); - result->fp = fopen (filePath, "r"); - if (result->fp == NULL) - { - free (result); - result = NULL; - info->status.error_number = errno; - } - else - { - fseek (result->fp, 0, SEEK_END); - result->size = ftell (result->fp); - rewind (result->fp); - readPseudoTags (result, info); - info->status.opened = 1; - result->initialized = 1; - } - } - return result; -} - -static void terminate (tagFile *const file) -{ - fclose (file->fp); - - free (file->line.buffer); - free (file->name.buffer); - free (file->fields.list); - - if (file->program.author != NULL) - free (file->program.author); - if (file->program.name != NULL) - free (file->program.name); - if (file->program.url != NULL) - free (file->program.url); - if (file->program.version != NULL) - free (file->program.version); - if (file->search.name != NULL) - free (file->search.name); - - memset (file, 0, sizeof (tagFile)); - - free (file); -} - -static tagResult readNext (tagFile *const file, tagEntry *const entry) -{ - tagResult result; - if (file == NULL || ! file->initialized) - result = TagFailure; - else if (! readTagLine (file)) - result = TagFailure; - else - { - if (entry != NULL) - parseTagLine (file, entry); - result = TagSuccess; - } - return result; -} - -static const char *readFieldValue ( - const tagEntry *const entry, const char *const key) -{ - const char *result = NULL; - int i; - if (strcmp (key, "kind") == 0) - result = entry->kind; - else if (strcmp (key, "file") == 0) - result = EmptyString; - else for (i = 0 ; i < entry->fields.count && result == NULL ; ++i) - if (strcmp (entry->fields.list [i].key, key) == 0) - result = entry->fields.list [i].value; - return result; -} - -static int readTagLineSeek (tagFile *const file, const off_t pos) -{ - int result = 0; - if (fseek (file->fp, pos, SEEK_SET) == 0) - { - result = readTagLine (file); /* read probable partial line */ - if (pos > 0 && result) - result = readTagLine (file); /* read complete line */ - } - return result; -} - -static int nameComparison (tagFile *const file) -{ - int result; - if (file->search.ignorecase) - { - if (file->search.partial) - result = strnuppercmp (file->search.name, file->name.buffer, - file->search.nameLength); - else - result = struppercmp (file->search.name, file->name.buffer); - } - else - { - if (file->search.partial) - result = strncmp (file->search.name, file->name.buffer, - file->search.nameLength); - else - result = strcmp (file->search.name, file->name.buffer); - } - return result; -} - -static void findFirstNonMatchBefore (tagFile *const file) -{ -#define JUMP_BACK 512 - int more_lines; - int comp; - off_t start = file->pos; - off_t pos = start; - do - { - if (pos < (off_t) JUMP_BACK) - pos = 0; - else - pos = pos - JUMP_BACK; - more_lines = readTagLineSeek (file, pos); - comp = nameComparison (file); - } while (more_lines && comp == 0 && pos > 0 && pos < start); -} - -static tagResult findFirstMatchBefore (tagFile *const file) -{ - tagResult result = TagFailure; - int more_lines; - off_t start = file->pos; - findFirstNonMatchBefore (file); - do - { - more_lines = readTagLine (file); - if (nameComparison (file) == 0) - result = TagSuccess; - } while (more_lines && result != TagSuccess && file->pos < start); - return result; -} - -static tagResult findBinary (tagFile *const file) -{ - tagResult result = TagFailure; - off_t lower_limit = 0; - off_t upper_limit = file->size; - off_t last_pos = 0; - off_t pos = upper_limit / 2; - while (result != TagSuccess) - { - if (! readTagLineSeek (file, pos)) - { - /* in case we fell off end of file */ - result = findFirstMatchBefore (file); - break; - } - else if (pos == last_pos) - { - /* prevent infinite loop if we backed up to beginning of file */ - break; - } - else - { - const int comp = nameComparison (file); - last_pos = pos; - if (comp < 0) - { - upper_limit = pos; - pos = lower_limit + ((upper_limit - lower_limit) / 2); - } - else if (comp > 0) - { - lower_limit = pos; - pos = lower_limit + ((upper_limit - lower_limit) / 2); - } - else if (pos == 0) - result = TagSuccess; - else - result = findFirstMatchBefore (file); - } - } - return result; -} - -static tagResult findSequential (tagFile *const file) -{ - tagResult result = TagFailure; - if (file->initialized) - { - while (result == TagFailure && readTagLine (file)) - { - if (nameComparison (file) == 0) - result = TagSuccess; - } - } - return result; -} - -static tagResult find (tagFile *const file, tagEntry *const entry, - const char *const name, const int options) -{ - tagResult result; - if (file->search.name != NULL) - free (file->search.name); - file->search.name = duplicate (name); - file->search.nameLength = strlen (name); - file->search.partial = (options & TAG_PARTIALMATCH) != 0; - file->search.ignorecase = (options & TAG_IGNORECASE) != 0; - fseek (file->fp, 0, SEEK_END); - file->size = ftell (file->fp); - rewind (file->fp); - if ((file->sortMethod == TAG_SORTED && !file->search.ignorecase) || - (file->sortMethod == TAG_FOLDSORTED && file->search.ignorecase)) - { -#ifdef DEBUG - printf ("\n"); -#endif - result = findBinary (file); - } - else - { -#ifdef DEBUG - printf ("\n"); -#endif - result = findSequential (file); - } - - if (result != TagSuccess) - file->search.pos = file->size; - else - { - file->search.pos = file->pos; - if (entry != NULL) - parseTagLine (file, entry); - } - return result; -} - -static tagResult findNext (tagFile *const file, tagEntry *const entry) -{ - tagResult result; - if ((file->sortMethod == TAG_SORTED && !file->search.ignorecase) || - (file->sortMethod == TAG_FOLDSORTED && file->search.ignorecase)) - { - result = tagsNext (file, entry); - if (result == TagSuccess && nameComparison (file) != 0) - result = TagFailure; - } - else - { - result = findSequential (file); - if (result == TagSuccess && entry != NULL) - parseTagLine (file, entry); - } - return result; -} - -/* -* EXTERNAL INTERFACE -*/ - -extern tagFile *tagsOpen (const char *const filePath, tagFileInfo *const info) -{ - return initialize (filePath, info); -} - -extern tagResult tagsSetSortType (tagFile *const file, const sortType type) -{ - tagResult result = TagFailure; - if (file != NULL && file->initialized) - { - file->sortMethod = type; - result = TagSuccess; - } - return result; -} - -extern tagResult tagsFirst (tagFile *const file, tagEntry *const entry) -{ - tagResult result = TagFailure; - if (file != NULL && file->initialized) - { - gotoFirstLogicalTag (file); - result = readNext (file, entry); - } - return result; -} - -extern tagResult tagsNext (tagFile *const file, tagEntry *const entry) -{ - tagResult result = TagFailure; - if (file != NULL && file->initialized) - result = readNext (file, entry); - return result; -} - -extern const char *tagsField (const tagEntry *const entry, const char *const key) -{ - const char *result = NULL; - if (entry != NULL) - result = readFieldValue (entry, key); - return result; -} - -extern tagResult tagsFind (tagFile *const file, tagEntry *const entry, - const char *const name, const int options) -{ - tagResult result = TagFailure; - if (file != NULL && file->initialized) - result = find (file, entry, name, options); - return result; -} - -extern tagResult tagsFindNext (tagFile *const file, tagEntry *const entry) -{ - tagResult result = TagFailure; - if (file != NULL && file->initialized) - result = findNext (file, entry); - return result; -} - -extern tagResult tagsClose (tagFile *const file) -{ - tagResult result = TagFailure; - if (file != NULL && file->initialized) - { - terminate (file); - result = TagSuccess; - } - return result; -} - -/* -* TEST FRAMEWORK -*/ - -#ifdef READTAGS_MAIN - -static const char *TagFileName = "tags"; -static const char *ProgramName; -static int extensionFields; -static int SortOverride; -static sortType SortMethod; - -static void printTag (const tagEntry *entry) -{ - int i; - int first = 1; - const char* separator = ";\""; - const char* const empty = ""; -/* "sep" returns a value only the first time it is evaluated */ -#define sep (first ? (first = 0, separator) : empty) - printf ("%s\t%s\t%s", - entry->name, entry->file, entry->address.pattern); - if (extensionFields) - { - if (entry->kind != NULL && entry->kind [0] != '\0') - printf ("%s\tkind:%s", sep, entry->kind); - if (entry->fileScope) - printf ("%s\tfile:", sep); -#if 0 - if (entry->address.lineNumber > 0) - printf ("%s\tline:%lu", sep, entry->address.lineNumber); -#endif - for (i = 0 ; i < entry->fields.count ; ++i) - printf ("%s\t%s:%s", sep, entry->fields.list [i].key, - entry->fields.list [i].value); - } - putchar ('\n'); -#undef sep -} - -static void findTag (const char *const name, const int options) -{ - tagFileInfo info; - tagEntry entry; - tagFile *const file = tagsOpen (TagFileName, &info); - if (file == NULL) - { - fprintf (stderr, "%s: cannot open tag file: %s: %s\n", - ProgramName, strerror (info.status.error_number), name); - exit (1); - } - else - { - if (SortOverride) - tagsSetSortType (file, SortMethod); - if (tagsFind (file, &entry, name, options) == TagSuccess) - { - do - { - printTag (&entry); - } while (tagsFindNext (file, &entry) == TagSuccess); - } - tagsClose (file); - } -} - -static void listTags (void) -{ - tagFileInfo info; - tagEntry entry; - tagFile *const file = tagsOpen (TagFileName, &info); - if (file == NULL) - { - fprintf (stderr, "%s: cannot open tag file: %s: %s\n", - ProgramName, strerror (info.status.error_number), TagFileName); - exit (1); - } - else - { - while (tagsNext (file, &entry) == TagSuccess) - printTag (&entry); - tagsClose (file); - } -} - -const char *const Usage = - "Find tag file entries matching specified names.\n\n" - "Usage: %s [-ilp] [-s[0|1]] [-t file] [name(s)]\n\n" - "Options:\n" - " -e Include extension fields in output.\n" - " -i Perform case-insensitive matching.\n" - " -l List all tags.\n" - " -p Perform partial matching.\n" - " -s[0|1|2] Override sort detection of tag file.\n" - " -t file Use specified tag file (default: \"tags\").\n" - "Note that options are acted upon as encountered, so order is significant.\n"; - -extern int main (int argc, char **argv) -{ - int options = 0; - int actionSupplied = 0; - int i; - ProgramName = argv [0]; - if (argc == 1) - { - fprintf (stderr, Usage, ProgramName); - exit (1); - } - for (i = 1 ; i < argc ; ++i) - { - const char *const arg = argv [i]; - if (arg [0] != '-') - { - findTag (arg, options); - actionSupplied = 1; - } - else - { - size_t j; - for (j = 1 ; arg [j] != '\0' ; ++j) - { - switch (arg [j]) - { - case 'e': extensionFields = 1; break; - case 'i': options |= TAG_IGNORECASE; break; - case 'p': options |= TAG_PARTIALMATCH; break; - case 'l': listTags (); actionSupplied = 1; break; - - case 't': - if (arg [j+1] != '\0') - { - TagFileName = arg + j + 1; - j += strlen (TagFileName); - } - else if (i + 1 < argc) - TagFileName = argv [++i]; - else - { - fprintf (stderr, Usage, ProgramName); - exit (1); - } - break; - case 's': - SortOverride = 1; - ++j; - if (arg [j] == '\0') - SortMethod = TAG_SORTED; - else if (strchr ("012", arg[j]) != NULL) - SortMethod = (sortType) (arg[j] - '0'); - else - { - fprintf (stderr, Usage, ProgramName); - exit (1); - } - break; - default: - fprintf (stderr, "%s: unknown option: %c\n", - ProgramName, arg[j]); - exit (1); - break; - } - } - } - } - if (! actionSupplied) - { - fprintf (stderr, - "%s: no action specified: specify tag name(s) or -l option\n", - ProgramName); - exit (1); - } - return 0; -} - -#endif - -/* vi:set tabstop=4 shiftwidth=4: */ diff --git a/native/v8_extensions/readtags.h b/native/v8_extensions/readtags.h deleted file mode 100644 index 724f250ad..000000000 --- a/native/v8_extensions/readtags.h +++ /dev/null @@ -1,252 +0,0 @@ -/* -* $Id: readtags.h 443 2006-05-30 04:37:13Z darren $ -* -* Copyright (c) 1996-2003, Darren Hiebert -* -* This source code is released for the public domain. -* -* This file defines the public interface for looking up tag entries in tag -* files. -* -* The functions defined in this interface are intended to provide tag file -* support to a software tool. The tag lookups provided are sufficiently fast -* enough to permit opening a sorted tag file, searching for a matching tag, -* then closing the tag file each time a tag is looked up (search times are -* on the order of hundreths of a second, even for huge tag files). This is -* the recommended use of this library for most tool applications. Adhering -* to this approach permits a user to regenerate a tag file at will without -* the tool needing to detect and resynchronize with changes to the tag file. -* Even for an unsorted 24MB tag file, tag searches take about one second. -*/ -#ifndef READTAGS_H -#define READTAGS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* -* MACROS -*/ - -/* Options for tagsSetSortType() */ -typedef enum { - TAG_UNSORTED, TAG_SORTED, TAG_FOLDSORTED -} sortType ; - -/* Options for tagsFind() */ -#define TAG_FULLMATCH 0x0 -#define TAG_PARTIALMATCH 0x1 - -#define TAG_OBSERVECASE 0x0 -#define TAG_IGNORECASE 0x2 - -/* -* DATA DECLARATIONS -*/ - -typedef enum { TagFailure = 0, TagSuccess = 1 } tagResult; - -struct sTagFile; - -typedef struct sTagFile tagFile; - -/* This structure contains information about the tag file. */ -typedef struct { - - struct { - /* was the tag file successfully opened? */ - int opened; - - /* errno value when 'opened' is false */ - int error_number; - } status; - - /* information about the structure of the tag file */ - struct { - /* format of tag file (1 = original, 2 = extended) */ - short format; - - /* how is the tag file sorted? */ - sortType sort; - } file; - - - /* information about the program which created this tag file */ - struct { - /* name of author of generating program (may be null) */ - const char *author; - - /* name of program (may be null) */ - const char *name; - - /* URL of distribution (may be null) */ - const char *url; - - /* program version (may be null) */ - const char *version; - } program; - -} tagFileInfo; - -/* This structure contains information about an extension field for a tag. - * These exist at the end of the tag in the form "key:value"). - */ -typedef struct { - - /* the key of the extension field */ - const char *key; - - /* the value of the extension field (may be an empty string) */ - const char *value; - -} tagExtensionField; - -/* This structure contains information about a specific tag. */ -typedef struct { - - /* name of tag */ - const char *name; - - /* path of source file containing definition of tag */ - const char *file; - - /* address for locating tag in source file */ - struct { - /* pattern for locating source line - * (may be NULL if not present) */ - const char *pattern; - - /* line number in source file of tag definition - * (may be zero if not known) */ - unsigned long lineNumber; - } address; - - /* kind of tag (may by name, character, or NULL if not known) */ - const char *kind; - - /* is tag of file-limited scope? */ - short fileScope; - - /* miscellaneous extension fields */ - struct { - /* number of entries in `list' */ - unsigned short count; - - /* list of key value pairs */ - tagExtensionField *list; - } fields; - -} tagEntry; - - -/* -* FUNCTION PROTOTYPES -*/ - -/* -* This function must be called before calling other functions in this -* library. It is passed the path to the tag file to read and a (possibly -* null) pointer to a structure which, if not null, will be populated with -* information about the tag file. If successful, the function will return a -* handle which must be supplied to other calls to read information from the -* tag file, and info.status.opened will be set to true. If unsuccessful, -* info.status.opened will be set to false and info.status.error_number will -* be set to the errno value representing the system error preventing the tag -* file from being successfully opened. -*/ -extern tagFile *tagsOpen (const char *const filePath, tagFileInfo *const info); - -/* -* This function allows the client to override the normal automatic detection -* of how a tag file is sorted. Permissible values for `type' are -* TAG_UNSORTED, TAG_SORTED, TAG_FOLDSORTED. Tag files in the new extended -* format contain a key indicating whether or not they are sorted. However, -* tag files in the original format do not contain such a key even when -* sorted, preventing this library from taking advantage of fast binary -* lookups. If the client knows that such an unmarked tag file is indeed -* sorted (or not), it can override the automatic detection. Note that -* incorrect lookup results will result if a tag file is marked as sorted when -* it actually is not. The function will return TagSuccess if called on an -* open tag file or TagFailure if not. -*/ -extern tagResult tagsSetSortType (tagFile *const file, const sortType type); - -/* -* Reads the first tag in the file, if any. It is passed the handle to an -* opened tag file and a (possibly null) pointer to a structure which, if not -* null, will be populated with information about the first tag file entry. -* The function will return TagSuccess another tag entry is found, or -* TagFailure if not (i.e. it reached end of file). -*/ -extern tagResult tagsFirst (tagFile *const file, tagEntry *const entry); - -/* -* Step to the next tag in the file, if any. It is passed the handle to an -* opened tag file and a (possibly null) pointer to a structure which, if not -* null, will be populated with information about the next tag file entry. The -* function will return TagSuccess another tag entry is found, or TagFailure -* if not (i.e. it reached end of file). It will always read the first tag in -* the file immediately after calling tagsOpen(). -*/ -extern tagResult tagsNext (tagFile *const file, tagEntry *const entry); - -/* -* Retrieve the value associated with the extension field for a specified key. -* It is passed a pointer to a structure already populated with values by a -* previous call to tagsNext(), tagsFind(), or tagsFindNext(), and a string -* containing the key of the desired extension field. If no such field of the -* specified key exists, the function will return null. -*/ -extern const char *tagsField (const tagEntry *const entry, const char *const key); - -/* -* Find the first tag matching `name'. The structure pointed to by `entry' -* will be populated with information about the tag file entry. If a tag file -* is sorted using the C locale, a binary search algorithm is used to search -* the tag file, resulting in very fast tag lookups, even in huge tag files. -* Various options controlling the matches can be combined by bit-wise or-ing -* certain values together. The available values are: -* -* TAG_PARTIALMATCH -* Tags whose leading characters match `name' will qualify. -* -* TAG_FULLMATCH -* Only tags whose full lengths match `name' will qualify. -* -* TAG_IGNORECASE -* Matching will be performed in a case-insenstive manner. Note that -* this disables binary searches of the tag file. -* -* TAG_OBSERVECASE -* Matching will be performed in a case-senstive manner. Note that -* this enables binary searches of the tag file. -* -* The function will return TagSuccess if a tag matching the name is found, or -* TagFailure if not. -*/ -extern tagResult tagsFind (tagFile *const file, tagEntry *const entry, const char *const name, const int options); - -/* -* Find the next tag matching the name and options supplied to the most recent -* call to tagsFind() for the same tag file. The structure pointed to by -* `entry' will be populated with information about the tag file entry. The -* function will return TagSuccess if another tag matching the name is found, -* or TagFailure if not. -*/ -extern tagResult tagsFindNext (tagFile *const file, tagEntry *const entry); - -/* -* Call tagsTerminate() at completion of reading the tag file, which will -* close the file and free any internal memory allocated. The function will -* return TagFailure is no file is currently open, TagSuccess otherwise. -*/ -extern tagResult tagsClose (tagFile *const file); - -#ifdef __cplusplus -}; -#endif - -#endif - -/* vi:set tabstop=4 shiftwidth=4: */ diff --git a/native/v8_extensions/tags.h b/native/v8_extensions/tags.h deleted file mode 100644 index e8c6627bf..000000000 --- a/native/v8_extensions/tags.h +++ /dev/null @@ -1,26 +0,0 @@ -#include "include/cef_base.h" -#include "include/cef_v8.h" -#include "readtags.h" - -namespace v8_extensions { - - class Tags : public CefV8Handler { - public: - Tags(); - void CreateContextBinding(CefRefPtr context); - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE; - - // Provide the reference counting implementation for this class. - IMPLEMENT_REFCOUNTING(Tags); - - private: - Tags(Tags const&); - void operator=(Tags const&); - CefRefPtr ParseEntry(tagEntry entry); - }; - -} diff --git a/native/v8_extensions/tags.mm b/native/v8_extensions/tags.mm deleted file mode 100644 index 2e826d323..000000000 --- a/native/v8_extensions/tags.mm +++ /dev/null @@ -1,116 +0,0 @@ -#import "tags.h" -#import - -namespace v8_extensions { - - Tags::Tags() : CefV8Handler() { - } - - void Tags::CreateContextBinding(CefRefPtr context) { - const char* methodNames[] = { "find", "getAllTagsAsync" }; - - CefRefPtr nativeObject = CefV8Value::CreateObject(NULL); - int arrayLength = sizeof(methodNames) / sizeof(const char *); - for (int i = 0; i < arrayLength; i++) { - const char *functionName = methodNames[i]; - CefRefPtr function = CefV8Value::CreateFunction(functionName, this); - nativeObject->SetValue(functionName, function, V8_PROPERTY_ATTRIBUTE_NONE); - } - - CefRefPtr global = context->GetGlobal(); - global->SetValue("$tags", nativeObject, V8_PROPERTY_ATTRIBUTE_NONE); - } - - CefRefPtr Tags::ParseEntry(tagEntry entry) { - CefRefPtr tagEntry = CefV8Value::CreateObject(NULL); - tagEntry->SetValue("name", CefV8Value::CreateString(entry.name), V8_PROPERTY_ATTRIBUTE_NONE); - tagEntry->SetValue("file", CefV8Value::CreateString(entry.file), V8_PROPERTY_ATTRIBUTE_NONE); - if (entry.address.pattern) { - tagEntry->SetValue("pattern", CefV8Value::CreateString(entry.address.pattern), V8_PROPERTY_ATTRIBUTE_NONE); - } - return tagEntry; - } - - bool Tags::Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - - @autoreleasepool { - if (name == "find") { - std::string path = arguments[0]->GetStringValue().ToString(); - std::string tag = arguments[1]->GetStringValue().ToString(); - tagFileInfo info; - tagFile* tagFile; - tagFile = tagsOpen(path.c_str(), &info); - if (info.status.opened) { - tagEntry entry; - std::vector> entries; - if (tagsFind(tagFile, &entry, tag.c_str(), TAG_FULLMATCH | TAG_OBSERVECASE) == TagSuccess) { - entries.push_back(ParseEntry(entry)); - while (tagsFindNext(tagFile, &entry) == TagSuccess) { - entries.push_back(ParseEntry(entry)); - } - } - - retval = CefV8Value::CreateArray(entries.size()); - for (int i = 0; i < entries.size(); i++) { - retval->SetValue(i, entries[i]); - } - tagsClose(tagFile); - } - return true; - } - - if (name == "getAllTagsAsync") { - std::string path = arguments[0]->GetStringValue().ToString(); - CefRefPtr callback = arguments[1]; - CefRefPtr context = CefV8Context::GetCurrentContext(); - - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(queue, ^{ - tagFileInfo info; - tagFile* tagFile; - tagFile = tagsOpen(path.c_str(), &info); - std::vector entries; - - if (info.status.opened) { - tagEntry entry; - while (tagsNext(tagFile, &entry) == TagSuccess) { - entry.name = strdup(entry.name); - entry.file = strdup(entry.file); - if (entry.address.pattern) { - entry.address.pattern = strdup(entry.address.pattern); - } - entries.push_back(entry); - } - tagsClose(tagFile); - } - - dispatch_queue_t mainQueue = dispatch_get_main_queue(); - dispatch_async(mainQueue, ^{ - context->Enter(); - CefRefPtr v8Tags = CefV8Value::CreateArray(entries.size()); - for (int i = 0; i < entries.size(); i++) { - v8Tags->SetValue(i, ParseEntry(entries[i])); - free((void*)entries[i].name); - free((void*)entries[i].file); - if (entries[i].address.pattern) { - free((void*)entries[i].address.pattern); - } - } - CefV8ValueList callbackArgs; - callbackArgs.push_back(v8Tags); - callback->ExecuteFunction(callback, callbackArgs); - context->Exit(); - }); - }); - return true; - } - - return false; - } - } - -} diff --git a/package.json b/package.json index 1893b5e86..dd2cd3c3b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version" : "0.0.0", "dependencies": { - "coffee-script": "1.5" + "coffee-script": "1.5", + "ctags": "0.1.0" }, "scripts": { diff --git a/script/bootstrap b/script/bootstrap index 1b9a93df1..465b8195d 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -18,6 +18,6 @@ exit_unless_npm_exists() { exit_unless_xcode_exists exit_unless_npm_exists -npm install +HOME=~/.cefode-gyp npm install --target=0.8.21 --dist-url=https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/dist --arch=ia32 git submodule --quiet sync git submodule --quiet update --recursive --init diff --git a/script/copy-files-to-bundle b/script/copy-files-to-bundle index c4eed5d02..8b91845f9 100755 --- a/script/copy-files-to-bundle +++ b/script/copy-files-to-bundle @@ -7,4 +7,4 @@ COMPILED_SOURCES_DIR="${1}" RESOUCES_PATH="$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH" # Copy non-coffee files into bundle -rsync --archive --recursive --exclude="src/**/*.coffee" --exclude="src/**/*.cson" src static vendor spec benchmark themes dot-atom atom.sh "${COMPILED_SOURCES_DIR}/" "$RESOUCES_PATH" +rsync --archive --recursive --exclude="src/**/*.coffee" --exclude="src/**/*.cson" node_modules src static vendor spec benchmark themes dot-atom atom.sh "${COMPILED_SOURCES_DIR}/" "$RESOUCES_PATH" diff --git a/src/packages/symbols-view/lib/load-tags-handler.coffee b/src/packages/symbols-view/lib/load-tags-handler.coffee new file mode 100644 index 000000000..a002ee263 --- /dev/null +++ b/src/packages/symbols-view/lib/load-tags-handler.coffee @@ -0,0 +1,17 @@ +ctags = nodeRequire 'ctags' +fs = require 'fs' + +module.exports = + getTagsFile: (path) -> + tagsFile = fs.join(path, "tags") + return tagsFile if fs.isFile(tagsFile) + + tagsFile = fs.join(path, "TAGS") + return tagsFile if fs.isFile(tagsFile) + + loadTags: (path) -> + tagsFile = @getTagsFile(path) + if tagsFile + callTaskMethod("tagsLoaded", ctags.getTags(tagsFile)) + else + callTaskMethod("tagsLoaded", []) diff --git a/src/packages/symbols-view/lib/load-tags-task.coffee b/src/packages/symbols-view/lib/load-tags-task.coffee new file mode 100644 index 000000000..99d8316d5 --- /dev/null +++ b/src/packages/symbols-view/lib/load-tags-task.coffee @@ -0,0 +1,13 @@ +Task = require 'task' + +module.exports = +class LoadTagsTask extends Task + constructor: (@callback) -> + super('symbols-view/lib/load-tags-handler') + + started: -> + @callWorkerMethod('loadTags', project.getPath()) + + tagsLoaded: (tags) -> + @done() + @callback(tags) diff --git a/src/packages/symbols-view/lib/tag-reader.coffee b/src/packages/symbols-view/lib/tag-reader.coffee index 86c96a892..f03c3e332 100644 --- a/src/packages/symbols-view/lib/tag-reader.coffee +++ b/src/packages/symbols-view/lib/tag-reader.coffee @@ -1,5 +1,7 @@ fs = require 'fs' $ = require 'jquery' +LoadTagsTask = require './load-tags-task' +ctags = nodeRequire 'ctags' module.exports = @@ -14,14 +16,11 @@ find: (editor) -> tagsFile = @getTagsFile(project) return [] unless tagsFile - $tags.find(tagsFile, word) or [] + ctags.findTag(tagsFile, word) getAllTags: (project, callback) -> deferred = $.Deferred() - tagsFile = @getTagsFile(project) - if tagsFile - $tags.getAllTagsAsync tagsFile, (tags) => - deferred.resolve(tags) - else - deferred.resolve([]) + callback = (tags=[]) => + deferred.resolve(tags) + new LoadTagsTask(callback).start() deferred.promise() From ea8068652b0dcd484d4a6056553d2a52d64ae27a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 10:18:08 -0800 Subject: [PATCH 008/281] Add oniguruma to package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index dd2cd3c3b..229724ffc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "dependencies": { "coffee-script": "1.5", - "ctags": "0.1.0" + "ctags": "0.1.0", + "oniguruma": "0.2.0" }, "scripts": { From d34796a78be8e9fff630aa7509d001d694d7a94f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 10:45:22 -0800 Subject: [PATCH 009/281] Use oniguruma node module This removes all internal native oniguruma sources and starts using the node module directly to create onig scanners and regexes. --- atom.gyp | 9 - native/atom_cef_render_process_handler.mm | 4 - .../CocoaOniguruma.framework/CocoaOniguruma | Bin 563988 -> 0 bytes .../Headers/OnigRegexp.h | 91 --- .../Headers/OnigRegexpUtility.h | 57 -- .../Headers/oniguruma.h | 770 ------------------ .../Resources/English.lproj/InfoPlist.strings | Bin 218 -> 0 bytes .../Resources/Info.plist | 38 - .../Versions/A/CocoaOniguruma | Bin 563988 -> 0 bytes .../Versions/A/Headers/OnigRegexp.h | 91 --- .../Versions/A/Headers/OnigRegexpUtility.h | 57 -- .../Versions/A/Headers/oniguruma.h | 770 ------------------ .../Resources/English.lproj/InfoPlist.strings | Bin 218 -> 0 bytes .../Versions/A/Resources/Info.plist | 38 - .../Versions/Current/CocoaOniguruma | Bin 563988 -> 0 bytes .../Versions/Current/Headers/OnigRegexp.h | 91 --- .../Current/Headers/OnigRegexpUtility.h | 57 -- .../Versions/Current/Headers/oniguruma.h | 770 ------------------ .../Resources/English.lproj/InfoPlist.strings | Bin 218 -> 0 bytes .../Versions/Current/Resources/Info.plist | 38 - .../linux/atom_cef_render_process_handler.cpp | 1 - native/v8_extensions/onig_reg_exp.h | 24 - native/v8_extensions/onig_reg_exp.mm | 106 --- native/v8_extensions/onig_reg_exp_linux.cpp | 228 ------ native/v8_extensions/onig_scanner.h | 24 - native/v8_extensions/onig_scanner.mm | 171 ---- package.json | 2 +- spec/stdlib/onig-reg-exp-spec.coffee | 6 +- src/app/language-mode.coffee | 12 +- src/app/text-mate-grammar.coffee | 7 +- src/stdlib/onig-reg-exp.coffee | 11 - src/stdlib/onig-scanner.coffee | 10 - 32 files changed, 13 insertions(+), 3470 deletions(-) delete mode 100755 native/frameworks/CocoaOniguruma.framework/CocoaOniguruma delete mode 100644 native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexp.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexpUtility.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Headers/oniguruma.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Resources/English.lproj/InfoPlist.strings delete mode 100644 native/frameworks/CocoaOniguruma.framework/Resources/Info.plist delete mode 100755 native/frameworks/CocoaOniguruma.framework/Versions/A/CocoaOniguruma delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexp.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexpUtility.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/oniguruma.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/English.lproj/InfoPlist.strings delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/Info.plist delete mode 100755 native/frameworks/CocoaOniguruma.framework/Versions/Current/CocoaOniguruma delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexp.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexpUtility.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/oniguruma.h delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings delete mode 100644 native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/Info.plist delete mode 100644 native/v8_extensions/onig_reg_exp.h delete mode 100644 native/v8_extensions/onig_reg_exp.mm delete mode 100644 native/v8_extensions/onig_reg_exp_linux.cpp delete mode 100644 native/v8_extensions/onig_scanner.h delete mode 100644 native/v8_extensions/onig_scanner.mm delete mode 100644 src/stdlib/onig-reg-exp.coffee delete mode 100644 src/stdlib/onig-scanner.coffee diff --git a/atom.gyp b/atom.gyp index fbc623735..93be1d16f 100644 --- a/atom.gyp +++ b/atom.gyp @@ -22,9 +22,6 @@ '@executable_path/libcef.dylib', '@rpath/Chromium Embedded Framework.framework/Libraries/libcef.dylib', '-change', - '@executable_path/../Frameworks/CocoaOniguruma.framework/Versions/A/CocoaOniguruma', - '@rpath/CocoaOniguruma.framework/Versions/A/CocoaOniguruma', - '-change', '@loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle', '@rpath/Sparkle.framework/Versions/A/Sparkle', '-change', @@ -142,7 +139,6 @@ 'files': [ '<(PRODUCT_DIR)/Atom Helper.app', '<(PRODUCT_DIR)/Atom.framework', - 'native/frameworks/CocoaOniguruma.framework', 'native/frameworks/Sparkle.framework', ], }, @@ -255,16 +251,11 @@ 'native/v8_extensions/git.mm', 'native/v8_extensions/native.h', 'native/v8_extensions/native.mm', - 'native/v8_extensions/onig_reg_exp.h', - 'native/v8_extensions/onig_reg_exp.mm', - 'native/v8_extensions/onig_scanner.h', - 'native/v8_extensions/onig_scanner.mm', ], 'link_settings': { 'libraries': [ '$(SDKROOT)/System/Library/Frameworks/AppKit.framework', 'git2/frameworks/libgit2.0.17.0.dylib', - 'native/frameworks/CocoaOniguruma.framework', 'native/frameworks/Sparkle.framework', ], }, diff --git a/native/atom_cef_render_process_handler.mm b/native/atom_cef_render_process_handler.mm index 93dad9451..428e9237f 100644 --- a/native/atom_cef_render_process_handler.mm +++ b/native/atom_cef_render_process_handler.mm @@ -1,8 +1,6 @@ #import #import "native/v8_extensions/atom.h" #import "native/v8_extensions/native.h" -#import "native/v8_extensions/onig_reg_exp.h" -#import "native/v8_extensions/onig_scanner.h" #import "native/v8_extensions/git.h" #import "native/message_translation.h" #import "path_watcher.h" @@ -122,6 +120,4 @@ void AtomCefRenderProcessHandler::InjectExtensionsIntoV8Context(CefRefPtrCreateContextBinding(context); (new v8_extensions::Native())->CreateContextBinding(context); (new v8_extensions::Git())->CreateContextBinding(context); - (new v8_extensions::OnigRegExp())->CreateContextBinding(context); - (new v8_extensions::OnigScanner())->CreateContextBinding(context); } diff --git a/native/frameworks/CocoaOniguruma.framework/CocoaOniguruma b/native/frameworks/CocoaOniguruma.framework/CocoaOniguruma deleted file mode 100755 index 3799f6f6b12ef6e74a754f9b5d9ba44383401df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563988 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 z zSG4sp)U!ym^q`Xi@5^KN`Ej2)KmWz55WlJzHY`cH%BQ2CjM{{-_# zPX9yj94|lf@Z+sGowGlY)4v3sv*l+V{?_J?oc^!jxk`TK;qPGn$mwr!59-9o&piBt z%pW=Zli+zqe&*qiV@@A{$mw4T&)f1d|1*CJd=URW`hz_Dr&@m^=lWTXxY`~i&lmIX zUuXWv>92hs{y$!R=HV}I{>bUy1D@mMXCD5i%+H*^f87`@W3uJ9+s*#R?>YTFy%sz}w4TPucYaS_kA8jv&V86Un)ETMZ)Qo}2Ox4j z##RsF|Am{B_?b6CK0)ip&FN(qX6#rtaxVMP!+6iuvdqJe(SYfk_Z9gN-iYwWG7!tg zV>tu)&foQAK92iuTGBV>Ttzbon`ry`BWHhhgQuhX%){T({E^dt2t2*zXCD4)=8v5I zW8le`pLzJ>GYlVZzLlT(pZVW}r_`P${b&AX{tfUnke_+@xlb_X z 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

qoz@@RH)aUMippMZ4r0X5qoUZQX048SUMphz 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 diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexp.h b/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexp.h deleted file mode 100644 index 84f24b46d..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexp.h +++ /dev/null @@ -1,91 +0,0 @@ -// CocoaOniguruma is copyrighted free software by Satoshi Nakagawa . -// You can redistribute it and/or modify it under the new BSD license. - -#import -#import "oniguruma.h" -#import "OnigRegexpUtility.h" - - -@class OnigResult; - -typedef enum { - OnigOptionNone = ONIG_OPTION_NONE, - OnigOptionIgnorecase = ONIG_OPTION_IGNORECASE, - OnigOptionExtend = ONIG_OPTION_EXTEND, - OnigOptionMultiline = ONIG_OPTION_MULTILINE, - OnigOptionSingleline = ONIG_OPTION_SINGLELINE, - OnigOptionFindLongest = ONIG_OPTION_FIND_LONGEST, - OnigOptionFindNotEmpty = ONIG_OPTION_FIND_NOT_EMPTY, - OnigOptionNegateSingleLine = ONIG_OPTION_NEGATE_SINGLELINE, - OnigOptionDontCaptureGroup = ONIG_OPTION_DONT_CAPTURE_GROUP, - OnigOptionCaptureGroup = ONIG_OPTION_CAPTURE_GROUP, - - /* options (search time) */ - OnigOptionNotbol = ONIG_OPTION_NOTBOL, - OnigOptionNoteol = ONIG_OPTION_NOTEOL, - OnigOptionPosixRegion = ONIG_OPTION_POSIX_REGION, - OnigOptionMaxbit = ONIG_OPTION_MAXBIT -} OnigOption; - -@interface OnigRegexp : NSObject -{ - regex_t* _entity; - NSString* _expression; -} - -+ (OnigRegexp*)compile:(NSString*)expression; -+ (OnigRegexp*)compile:(NSString*)expression error:(NSError **)error; -+ (OnigRegexp*)compileIgnorecase:(NSString*)expression; -+ (OnigRegexp*)compileIgnorecase:(NSString*)expression error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline extended:(BOOL)extended; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline extended:(BOOL)extended error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression options:(OnigOption)options; -+ (OnigRegexp*)compile:(NSString*)expression options:(OnigOption)options error:(NSError **)error; - -- (OnigResult*)search:(NSString*)target; -- (OnigResult*)search:(NSString*)target start:(int)start; -- (OnigResult*)search:(NSString*)target start:(int)start end:(int)end; -- (OnigResult*)search:(NSString*)target range:(NSRange)range; - -- (OnigResult*)match:(NSString*)target; -- (OnigResult*)match:(NSString*)target start:(int)start; - -- (NSUInteger)captureCount; -- (NSString*)expression; - -@end - - -@interface OnigResult : NSObject -{ - OnigRegexp* _expression; - OnigRegion* _region; - NSString* _target; - NSMutableArray* _captureNames; -} - -- (NSString*)target; - -- (int)count; -- (NSString*)stringAt:(int)index; -- (NSArray*)strings; -- (NSRange)rangeAt:(int)index; -- (int)locationAt:(int)index; -- (int)lengthAt:(int)index; - -- (NSString*)body; -- (NSRange)bodyRange; - -- (NSString*)preMatch; -- (NSString*)postMatch; - -// named capture support -- (NSArray*)captureNames; -- (int)indexForName:(NSString*)name; -- (NSIndexSet*)indexesForName:(NSString*)name; -- (NSString*)stringForName:(NSString*)name; -- (NSArray*)stringsForName:(NSString*)name; - -@end diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexpUtility.h b/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexpUtility.h deleted file mode 100644 index 245ebae3d..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/OnigRegexpUtility.h +++ /dev/null @@ -1,57 +0,0 @@ -// CocoaOniguruma is copyrighted free software by Satoshi Nakagawa . -// You can redistribute it and/or modify it under the new BSD license. - -#import -#import "oniguruma.h" -#import "OnigRegexp.h" - - -@class OnigRegexp; -@class OnigResult; - - -@interface NSString (OnigRegexpUtility) - -// pattern is OnigRegexp or NSString - -- (NSRange)rangeOfRegexp:(id)pattern; - -// based on ruby's split - -- (NSArray*)split; -- (NSArray*)splitByRegexp:(id)pattern; -- (NSArray*)splitByRegexp:(id)pattern limit:(int)limit; - -// based on ruby's gsub - -- (NSString*)replaceByRegexp:(id)pattern with:(NSString*)string; -- (NSString*)replaceAllByRegexp:(id)pattern with:(NSString*)string; - -- (NSString*)replaceByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; -- (NSString*)replaceAllByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; - -#if defined(NS_BLOCKS_AVAILABLE) -- (NSString*)replaceByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -- (NSString*)replaceAllByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -#endif - -@end - - -@interface NSMutableString (OnigRegexpUtility) - -// pattern is OnigRegexp or NSString - -// based on ruby's gsub - -- (NSMutableString*)replaceByRegexp:(id)pattern with:(NSString*)string; -- (NSMutableString*)replaceAllByRegexp:(id)pattern with:(NSString*)string; - -- (NSMutableString*)replaceByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; -- (NSMutableString*)replaceAllByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; - -#if defined(NS_BLOCKS_AVAILABLE) -- (NSMutableString*)replaceByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -- (NSMutableString*)replaceAllByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -#endif -@end diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/oniguruma.h b/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/oniguruma.h deleted file mode 100644 index 8c6322c9b..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/A/Headers/oniguruma.h +++ /dev/null @@ -1,770 +0,0 @@ -#ifndef ONIGURUMA_H -#define ONIGURUMA_H -/********************************************************************** - oniguruma.h - Oniguruma (regular expression library) -**********************************************************************/ -/*- - * Copyright (c) 2002-2009 K.Kosako - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ONIGURUMA -#define ONIGURUMA_VERSION_MAJOR 5 -#define ONIGURUMA_VERSION_MINOR 9 -#define ONIGURUMA_VERSION_TEENY 2 - -#ifdef __cplusplus -# ifndef HAVE_PROTOTYPES -# define HAVE_PROTOTYPES 1 -# endif -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -/* escape Mac OS X/Xcode 2.4/gcc 4.0.1 problem */ -#if defined(__APPLE__) && defined(__GNUC__) && __GNUC__ >= 4 -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#ifdef HAVE_STDARG_H -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#ifndef P_ -#if defined(__STDC__) || defined(_WIN32) -# define P_(args) args -#else -# define P_(args) () -#endif -#endif - -#ifndef PV_ -#ifdef HAVE_STDARG_PROTOTYPES -# define PV_(args) args -#else -# define PV_(args) () -#endif -#endif - -#ifndef ONIG_EXTERN -#if defined(_WIN32) && !defined(__GNUC__) -#if defined(EXPORT) || defined(RUBY_EXPORT) -#define ONIG_EXTERN extern __declspec(dllexport) -#else -#define ONIG_EXTERN extern __declspec(dllimport) -#endif -#endif -#endif - -#ifndef ONIG_EXTERN -#define ONIG_EXTERN extern -#endif - -/* PART: character encoding */ - -#ifndef ONIG_ESCAPE_UCHAR_COLLISION -#define UChar OnigUChar -#endif - -typedef unsigned char OnigUChar; -typedef unsigned long OnigCodePoint; -typedef unsigned int OnigCtype; -typedef unsigned int OnigDistance; - -#define ONIG_INFINITE_DISTANCE ~((OnigDistance )0) - -typedef unsigned int OnigCaseFoldType; /* case fold flag */ - -ONIG_EXTERN OnigCaseFoldType OnigDefaultCaseFoldFlag; - -/* #define ONIGENC_CASE_FOLD_HIRAGANA_KATAKANA (1<<1) */ -/* #define ONIGENC_CASE_FOLD_KATAKANA_WIDTH (1<<2) */ -#define ONIGENC_CASE_FOLD_TURKISH_AZERI (1<<20) -#define INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR (1<<30) - -#define ONIGENC_CASE_FOLD_MIN INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR -#define ONIGENC_CASE_FOLD_DEFAULT OnigDefaultCaseFoldFlag - - -#define ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN 3 -#define ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM 13 -/* 13 => Unicode:0x1ffc */ - -/* code range */ -#define ONIGENC_CODE_RANGE_NUM(range) ((int )range[0]) -#define ONIGENC_CODE_RANGE_FROM(range,i) range[((i)*2) + 1] -#define ONIGENC_CODE_RANGE_TO(range,i) range[((i)*2) + 2] - -typedef struct { - int byte_len; /* argument(original) character(s) byte length */ - int code_len; /* number of code */ - OnigCodePoint code[ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN]; -} OnigCaseFoldCodeItem; - -typedef struct { - OnigCodePoint esc; - OnigCodePoint anychar; - OnigCodePoint anytime; - OnigCodePoint zero_or_one_time; - OnigCodePoint one_or_more_time; - OnigCodePoint anychar_anytime; -} OnigMetaCharTableType; - -typedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg); - -typedef struct OnigEncodingTypeST { - int (*mbc_enc_len)(const OnigUChar* p); - const char* name; - int max_enc_len; - int min_enc_len; - int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end); - OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end); - int (*code_to_mbclen)(OnigCodePoint code); - int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf); - int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to); - int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg); - int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[]); - int (*property_name_to_ctype)(struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end); - int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype); - int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]); - OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p); - int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end); -} OnigEncodingType; - -typedef OnigEncodingType* OnigEncoding; - -ONIG_EXTERN OnigEncodingType OnigEncodingASCII; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_BE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_LE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_BE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_LE; - -#define ONIG_ENCODING_ASCII (&OnigEncodingASCII) -#define ONIG_ENCODING_UTF16_BE (&OnigEncodingUTF16_BE) -#define ONIG_ENCODING_UTF16_LE (&OnigEncodingUTF16_LE) -#define ONIG_ENCODING_UTF32_BE (&OnigEncodingUTF32_BE) -#define ONIG_ENCODING_UTF32_LE (&OnigEncodingUTF32_LE) - -#define ONIG_ENCODING_UNDEF ((OnigEncoding )0) - - -/* work size */ -#define ONIGENC_CODE_TO_MBC_MAXLEN 7 -#define ONIGENC_MBC_CASE_FOLD_MAXLEN 18 -/* 18: 6(max-byte) * 3(case-fold chars) */ - -/* character types */ -#define ONIGENC_CTYPE_NEWLINE 0 -#define ONIGENC_CTYPE_ALPHA 1 -#define ONIGENC_CTYPE_BLANK 2 -#define ONIGENC_CTYPE_CNTRL 3 -#define ONIGENC_CTYPE_DIGIT 4 -#define ONIGENC_CTYPE_GRAPH 5 -#define ONIGENC_CTYPE_LOWER 6 -#define ONIGENC_CTYPE_PRINT 7 -#define ONIGENC_CTYPE_PUNCT 8 -#define ONIGENC_CTYPE_SPACE 9 -#define ONIGENC_CTYPE_UPPER 10 -#define ONIGENC_CTYPE_XDIGIT 11 -#define ONIGENC_CTYPE_WORD 12 -#define ONIGENC_CTYPE_ALNUM 13 /* alpha || digit */ -#define ONIGENC_CTYPE_ASCII 14 -#define ONIGENC_MAX_STD_CTYPE ONIGENC_CTYPE_ASCII - - -#define onig_enc_len(enc,p,end) ONIGENC_MBC_ENC_LEN(enc,p) - -#define ONIGENC_IS_UNDEF(enc) ((enc) == ONIG_ENCODING_UNDEF) -#define ONIGENC_IS_SINGLEBYTE(enc) (ONIGENC_MBC_MAXLEN(enc) == 1) -#define ONIGENC_IS_MBC_HEAD(enc,p) (ONIGENC_MBC_ENC_LEN(enc,p) != 1) -#define ONIGENC_IS_MBC_ASCII(p) (*(p) < 128) -#define ONIGENC_IS_CODE_ASCII(code) ((code) < 128) -#define ONIGENC_IS_MBC_WORD(enc,s,end) \ - ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end)) - - -#define ONIGENC_NAME(enc) ((enc)->name) - -#define ONIGENC_MBC_CASE_FOLD(enc,flag,pp,end,buf) \ - (enc)->mbc_case_fold(flag,(const OnigUChar** )pp,end,buf) -#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \ - (enc)->is_allowed_reverse_match(s,end) -#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \ - (enc)->left_adjust_char_head(start, s) -#define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \ - (enc)->apply_all_case_fold(case_fold_flag,f,arg) -#define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \ - (enc)->get_case_fold_codes_by_str(case_fold_flag,p,end,acs) -#define ONIGENC_STEP_BACK(enc,start,s,n) \ - onigenc_step_back((enc),(start),(s),(n)) - -#define ONIGENC_MBC_ENC_LEN(enc,p) (enc)->mbc_enc_len(p) -#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len) -#define ONIGENC_MBC_MAXLEN_DIST(enc) ONIGENC_MBC_MAXLEN(enc) -#define ONIGENC_MBC_MINLEN(enc) ((enc)->min_enc_len) -#define ONIGENC_IS_MBC_NEWLINE(enc,p,end) (enc)->is_mbc_newline((p),(end)) -#define ONIGENC_MBC_TO_CODE(enc,p,end) (enc)->mbc_to_code((p),(end)) -#define ONIGENC_CODE_TO_MBCLEN(enc,code) (enc)->code_to_mbclen(code) -#define ONIGENC_CODE_TO_MBC(enc,code,buf) (enc)->code_to_mbc(code,buf) -#define ONIGENC_PROPERTY_NAME_TO_CTYPE(enc,p,end) \ - (enc)->property_name_to_ctype(enc,p,end) - -#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) (enc)->is_code_ctype(code,ctype) - -#define ONIGENC_IS_CODE_NEWLINE(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_NEWLINE) -#define ONIGENC_IS_CODE_GRAPH(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH) -#define ONIGENC_IS_CODE_PRINT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT) -#define ONIGENC_IS_CODE_ALNUM(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM) -#define ONIGENC_IS_CODE_ALPHA(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA) -#define ONIGENC_IS_CODE_LOWER(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER) -#define ONIGENC_IS_CODE_UPPER(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER) -#define ONIGENC_IS_CODE_CNTRL(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL) -#define ONIGENC_IS_CODE_PUNCT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT) -#define ONIGENC_IS_CODE_SPACE(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE) -#define ONIGENC_IS_CODE_BLANK(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK) -#define ONIGENC_IS_CODE_DIGIT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT) -#define ONIGENC_IS_CODE_XDIGIT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT) -#define ONIGENC_IS_CODE_WORD(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD) - -#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,sbout,ranges) \ - (enc)->get_ctype_code_range(ctype,sbout,ranges) - -ONIG_EXTERN -OnigUChar* onigenc_step_back P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, int n)); - - -/* encoding API */ -ONIG_EXTERN -int onigenc_init P_((void)); -ONIG_EXTERN -int onigenc_set_default_encoding P_((OnigEncoding enc)); -ONIG_EXTERN -OnigEncoding onigenc_get_default_encoding P_((void)); -ONIG_EXTERN -void onigenc_set_default_caseconv_table P_((const OnigUChar* table)); -ONIG_EXTERN -OnigUChar* onigenc_get_right_adjust_char_head_with_prev P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar** prev)); -ONIG_EXTERN -OnigUChar* onigenc_get_prev_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -OnigUChar* onigenc_get_left_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -OnigUChar* onigenc_get_right_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -int onigenc_strlen P_((OnigEncoding enc, const OnigUChar* p, const OnigUChar* end)); -ONIG_EXTERN -int onigenc_strlen_null P_((OnigEncoding enc, const OnigUChar* p)); -ONIG_EXTERN -int onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p)); - - - -/* PART: regular expression */ - -/* config parameters */ -#define ONIG_NREGION 10 -#define ONIG_MAX_BACKREF_NUM 1000 -#define ONIG_MAX_REPEAT_NUM 100000 -#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000 -/* constants */ -#define ONIG_MAX_ERROR_MESSAGE_LEN 90 - -typedef unsigned int OnigOptionType; - -#define ONIG_OPTION_DEFAULT ONIG_OPTION_NONE - -/* options */ -#define ONIG_OPTION_NONE 0U -#define ONIG_OPTION_IGNORECASE 1U -#define ONIG_OPTION_EXTEND (ONIG_OPTION_IGNORECASE << 1) -#define ONIG_OPTION_MULTILINE (ONIG_OPTION_EXTEND << 1) -#define ONIG_OPTION_SINGLELINE (ONIG_OPTION_MULTILINE << 1) -#define ONIG_OPTION_FIND_LONGEST (ONIG_OPTION_SINGLELINE << 1) -#define ONIG_OPTION_FIND_NOT_EMPTY (ONIG_OPTION_FIND_LONGEST << 1) -#define ONIG_OPTION_NEGATE_SINGLELINE (ONIG_OPTION_FIND_NOT_EMPTY << 1) -#define ONIG_OPTION_DONT_CAPTURE_GROUP (ONIG_OPTION_NEGATE_SINGLELINE << 1) -#define ONIG_OPTION_CAPTURE_GROUP (ONIG_OPTION_DONT_CAPTURE_GROUP << 1) -/* options (search time) */ -#define ONIG_OPTION_NOTBOL (ONIG_OPTION_CAPTURE_GROUP << 1) -#define ONIG_OPTION_NOTEOL (ONIG_OPTION_NOTBOL << 1) -#define ONIG_OPTION_POSIX_REGION (ONIG_OPTION_NOTEOL << 1) -#define ONIG_OPTION_MAXBIT ONIG_OPTION_POSIX_REGION /* limit */ - -#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt)) -#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt)) -#define ONIG_IS_OPTION_ON(options,option) ((options) & (option)) - -/* syntax */ -typedef struct { - unsigned int op; - unsigned int op2; - unsigned int behavior; - OnigOptionType options; /* default option */ - OnigMetaCharTableType meta_char_table; -} OnigSyntaxType; - -ONIG_EXTERN OnigSyntaxType OnigSyntaxASIS; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended; -ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs; -ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep; -ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex; -ONIG_EXTERN OnigSyntaxType OnigSyntaxJava; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl_NG; -ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby; - -/* predefined syntaxes (see regsyntax.c) */ -#define ONIG_SYNTAX_ASIS (&OnigSyntaxASIS) -#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic) -#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended) -#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs) -#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep) -#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex) -#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava) -#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl) -#define ONIG_SYNTAX_PERL_NG (&OnigSyntaxPerl_NG) -#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby) - -/* default syntax */ -ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax; -#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax - -/* syntax (operators) */ -#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS (1U<<0) -#define ONIG_SYN_OP_DOT_ANYCHAR (1U<<1) /* . */ -#define ONIG_SYN_OP_ASTERISK_ZERO_INF (1U<<2) /* * */ -#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF (1U<<3) -#define ONIG_SYN_OP_PLUS_ONE_INF (1U<<4) /* + */ -#define ONIG_SYN_OP_ESC_PLUS_ONE_INF (1U<<5) -#define ONIG_SYN_OP_QMARK_ZERO_ONE (1U<<6) /* ? */ -#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE (1U<<7) -#define ONIG_SYN_OP_BRACE_INTERVAL (1U<<8) /* {lower,upper} */ -#define ONIG_SYN_OP_ESC_BRACE_INTERVAL (1U<<9) /* \{lower,upper\} */ -#define ONIG_SYN_OP_VBAR_ALT (1U<<10) /* | */ -#define ONIG_SYN_OP_ESC_VBAR_ALT (1U<<11) /* \| */ -#define ONIG_SYN_OP_LPAREN_SUBEXP (1U<<12) /* (...) */ -#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP (1U<<13) /* \(...\) */ -#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR (1U<<14) /* \A, \Z, \z */ -#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR (1U<<15) /* \G */ -#define ONIG_SYN_OP_DECIMAL_BACKREF (1U<<16) /* \num */ -#define ONIG_SYN_OP_BRACKET_CC (1U<<17) /* [...] */ -#define ONIG_SYN_OP_ESC_W_WORD (1U<<18) /* \w, \W */ -#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END (1U<<19) /* \<. \> */ -#define ONIG_SYN_OP_ESC_B_WORD_BOUND (1U<<20) /* \b, \B */ -#define ONIG_SYN_OP_ESC_S_WHITE_SPACE (1U<<21) /* \s, \S */ -#define ONIG_SYN_OP_ESC_D_DIGIT (1U<<22) /* \d, \D */ -#define ONIG_SYN_OP_LINE_ANCHOR (1U<<23) /* ^, $ */ -#define ONIG_SYN_OP_POSIX_BRACKET (1U<<24) /* [:xxxx:] */ -#define ONIG_SYN_OP_QMARK_NON_GREEDY (1U<<25) /* ??,*?,+?,{n,m}? */ -#define ONIG_SYN_OP_ESC_CONTROL_CHARS (1U<<26) /* \n,\r,\t,\a ... */ -#define ONIG_SYN_OP_ESC_C_CONTROL (1U<<27) /* \cx */ -#define ONIG_SYN_OP_ESC_OCTAL3 (1U<<28) /* \OOO */ -#define ONIG_SYN_OP_ESC_X_HEX2 (1U<<29) /* \xHH */ -#define ONIG_SYN_OP_ESC_X_BRACE_HEX8 (1U<<30) /* \x{7HHHHHHH} */ - -#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE (1U<<0) /* \Q...\E */ -#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT (1U<<1) /* (?...) */ -#define ONIG_SYN_OP2_OPTION_PERL (1U<<2) /* (?imsx),(?-imsx) */ -#define ONIG_SYN_OP2_OPTION_RUBY (1U<<3) /* (?imx), (?-imx) */ -#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT (1U<<4) /* ?+,*+,++ */ -#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL (1U<<5) /* {n,m}+ */ -#define ONIG_SYN_OP2_CCLASS_SET_OP (1U<<6) /* [...&&..[..]..] */ -#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP (1U<<7) /* (?...) */ -#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF (1U<<8) /* \k */ -#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL (1U<<9) /* \g, \g */ -#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY (1U<<10) /* (?@..),(?@..) */ -#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1U<<11) /* \C-x */ -#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META (1U<<12) /* \M-x */ -#define ONIG_SYN_OP2_ESC_V_VTAB (1U<<13) /* \v as VTAB */ -#define ONIG_SYN_OP2_ESC_U_HEX4 (1U<<14) /* \uHHHH */ -#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR (1U<<15) /* \`, \' */ -#define ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY (1U<<16) /* \p{...}, \P{...} */ -#define ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT (1U<<17) /* \p{^..}, \P{^..} */ -/* #define ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS (1U<<18) */ -#define ONIG_SYN_OP2_ESC_H_XDIGIT (1U<<19) /* \h, \H */ -#define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE (1U<<20) /* \ */ - -/* syntax (behavior) */ -#define ONIG_SYN_CONTEXT_INDEP_ANCHORS (1U<<31) /* not implemented */ -#define ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS (1U<<0) /* ?, *, +, {n,m} */ -#define ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS (1U<<1) /* error or ignore */ -#define ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP (1U<<2) /* ...)... */ -#define ONIG_SYN_ALLOW_INVALID_INTERVAL (1U<<3) /* {??? */ -#define ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV (1U<<4) /* {,n} => {0,n} */ -#define ONIG_SYN_STRICT_CHECK_BACKREF (1U<<5) /* /(\1)/,/\1()/ ..*/ -#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1U<<6) /* (?<=a|bc) */ -#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP (1U<<7) /* see doc/RE */ -#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1U<<8) /* (?)(?) */ -#define ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY (1U<<9) /* a{n}?=(?:a{n})? */ - -/* syntax (behavior) in char class [...] */ -#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1U<<20) /* [^...] */ -#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC (1U<<21) /* [..\w..] etc.. */ -#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1U<<22) -#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC (1U<<23) /* [0-9-a]=[0-9\-a] */ -/* syntax (behavior) warning */ -#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED (1U<<24) /* [,-,] */ -#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT (1U<<25) /* (?:a*)+ */ - -/* meta character specifiers (onig_set_meta_char()) */ -#define ONIG_META_CHAR_ESCAPE 0 -#define ONIG_META_CHAR_ANYCHAR 1 -#define ONIG_META_CHAR_ANYTIME 2 -#define ONIG_META_CHAR_ZERO_OR_ONE_TIME 3 -#define ONIG_META_CHAR_ONE_OR_MORE_TIME 4 -#define ONIG_META_CHAR_ANYCHAR_ANYTIME 5 - -#define ONIG_INEFFECTIVE_META_CHAR 0 - -/* error codes */ -#define ONIG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -1000) -/* normal return */ -#define ONIG_NORMAL 0 -#define ONIG_MISMATCH -1 -#define ONIG_NO_SUPPORT_CONFIG -2 - -/* internal error */ -#define ONIGERR_MEMORY -5 -#define ONIGERR_TYPE_BUG -6 -#define ONIGERR_PARSER_BUG -11 -#define ONIGERR_STACK_BUG -12 -#define ONIGERR_UNDEFINED_BYTECODE -13 -#define ONIGERR_UNEXPECTED_BYTECODE -14 -#define ONIGERR_MATCH_STACK_LIMIT_OVER -15 -#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21 -#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22 -/* general error */ -#define ONIGERR_INVALID_ARGUMENT -30 -/* syntax error */ -#define ONIGERR_END_PATTERN_AT_LEFT_BRACE -100 -#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET -101 -#define ONIGERR_EMPTY_CHAR_CLASS -102 -#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS -103 -#define ONIGERR_END_PATTERN_AT_ESCAPE -104 -#define ONIGERR_END_PATTERN_AT_META -105 -#define ONIGERR_END_PATTERN_AT_CONTROL -106 -#define ONIGERR_META_CODE_SYNTAX -108 -#define ONIGERR_CONTROL_CODE_SYNTAX -109 -#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110 -#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111 -#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112 -#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113 -#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114 -#define ONIGERR_NESTED_REPEAT_OPERATOR -115 -#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS -116 -#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117 -#define ONIGERR_END_PATTERN_IN_GROUP -118 -#define ONIGERR_UNDEFINED_GROUP_OPTION -119 -#define ONIGERR_INVALID_POSIX_BRACKET_TYPE -121 -#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN -122 -#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN -123 -/* values error (syntax error) */ -#define ONIGERR_TOO_BIG_NUMBER -200 -#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201 -#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202 -#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS -203 -#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204 -#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES -205 -#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING -206 -#define ONIGERR_TOO_BIG_BACKREF_NUMBER -207 -#define ONIGERR_INVALID_BACKREF -208 -#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED -209 -#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE -212 -#define ONIGERR_EMPTY_GROUP_NAME -214 -#define ONIGERR_INVALID_GROUP_NAME -215 -#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME -216 -#define ONIGERR_UNDEFINED_NAME_REFERENCE -217 -#define ONIGERR_UNDEFINED_GROUP_REFERENCE -218 -#define ONIGERR_MULTIPLEX_DEFINED_NAME -219 -#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL -220 -#define ONIGERR_NEVER_ENDING_RECURSION -221 -#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222 -#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223 -#define ONIGERR_INVALID_CODE_POINT_VALUE -400 -#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400 -#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401 -#define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION -402 -#define ONIGERR_INVALID_COMBINATION_OF_OPTIONS -403 - -/* errors related to thread */ -#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT -1001 - - -/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */ -#define ONIG_MAX_CAPTURE_HISTORY_GROUP 31 -#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \ - ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i]) - -typedef struct OnigCaptureTreeNodeStruct { - int group; /* group number */ - int beg; - int end; - int allocated; - int num_childs; - struct OnigCaptureTreeNodeStruct** childs; -} OnigCaptureTreeNode; - -/* match result region type */ -struct re_registers { - int allocated; - int num_regs; - int* beg; - int* end; - /* extended */ - OnigCaptureTreeNode* history_root; /* capture history tree root */ -}; - -/* capture tree traverse */ -#define ONIG_TRAVERSE_CALLBACK_AT_FIRST 1 -#define ONIG_TRAVERSE_CALLBACK_AT_LAST 2 -#define ONIG_TRAVERSE_CALLBACK_AT_BOTH \ - ( ONIG_TRAVERSE_CALLBACK_AT_FIRST | ONIG_TRAVERSE_CALLBACK_AT_LAST ) - - -#define ONIG_REGION_NOTPOS -1 - -typedef struct re_registers OnigRegion; - -typedef struct { - OnigEncoding enc; - OnigUChar* par; - OnigUChar* par_end; -} OnigErrorInfo; - -typedef struct { - int lower; - int upper; -} OnigRepeatRange; - -typedef void (*OnigWarnFunc) P_((const char* s)); -extern void onig_null_warn P_((const char* s)); -#define ONIG_NULL_WARN onig_null_warn - -#define ONIG_CHAR_TABLE_SIZE 256 - -/* regex_t state */ -#define ONIG_STATE_NORMAL 0 -#define ONIG_STATE_SEARCHING 1 -#define ONIG_STATE_COMPILING -1 -#define ONIG_STATE_MODIFY -2 - -#define ONIG_STATE(reg) \ - ((reg)->state > 0 ? ONIG_STATE_SEARCHING : (reg)->state) - -typedef struct re_pattern_buffer { - /* common members of BBuf(bytes-buffer) */ - unsigned char* p; /* compiled pattern */ - unsigned int used; /* used space for p */ - unsigned int alloc; /* allocated space for p */ - - int state; /* normal, searching, compiling */ - int num_mem; /* used memory(...) num counted from 1 */ - int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */ - int num_null_check; /* OP_NULL_CHECK_START/END id counter */ - int num_comb_exp_check; /* combination explosion check */ - int num_call; /* number of subexp call */ - unsigned int capture_history; /* (?@...) flag (1-31) */ - unsigned int bt_mem_start; /* need backtrack flag */ - unsigned int bt_mem_end; /* need backtrack flag */ - int stack_pop_level; - int repeat_range_alloc; - OnigRepeatRange* repeat_range; - - OnigEncoding enc; - OnigOptionType options; - OnigSyntaxType* syntax; - OnigCaseFoldType case_fold_flag; - void* name_table; - - /* optimization info (string search, char-map and anchors) */ - int optimize; /* optimize flag */ - int threshold_len; /* search str-length for apply optimize */ - int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */ - OnigDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */ - OnigDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */ - int sub_anchor; /* start-anchor for exact or map */ - unsigned char *exact; - unsigned char *exact_end; - unsigned char map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */ - int *int_map; /* BM skip for exact_len > 255 */ - int *int_map_backward; /* BM skip for backward search */ - OnigDistance dmin; /* min-distance of exact or map */ - OnigDistance dmax; /* max-distance of exact or map */ - - /* regex_t link chain */ - struct re_pattern_buffer* chain; /* escape compile-conflict */ -} OnigRegexType; - -typedef OnigRegexType* OnigRegex; - -#ifndef ONIG_ESCAPE_REGEX_T_COLLISION - typedef OnigRegexType regex_t; -#endif - - -typedef struct { - int num_of_elements; - OnigEncoding pattern_enc; - OnigEncoding target_enc; - OnigSyntaxType* syntax; - OnigOptionType option; - OnigCaseFoldType case_fold_flag; -} OnigCompileInfo; - -/* Oniguruma Native API */ -ONIG_EXTERN -int onig_init P_((void)); -ONIG_EXTERN -int onig_error_code_to_str PV_((OnigUChar* s, int err_code, ...)); -ONIG_EXTERN -void onig_set_warn_func P_((OnigWarnFunc f)); -ONIG_EXTERN -void onig_set_verb_warn_func P_((OnigWarnFunc f)); -ONIG_EXTERN -int onig_new P_((OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_reg_init P_((regex_t* reg, OnigOptionType option, OnigCaseFoldType case_fold_flag, OnigEncoding enc, OnigSyntaxType* syntax)); -int onig_new_without_alloc P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_new_deluxe P_((OnigRegex* reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo)); -ONIG_EXTERN -void onig_free P_((OnigRegex)); -ONIG_EXTERN -void onig_free_body P_((OnigRegex)); -ONIG_EXTERN -int onig_recompile P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_recompile_deluxe P_((OnigRegex reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_search P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option)); -ONIG_EXTERN -int onig_match P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* at, OnigRegion* region, OnigOptionType option)); -ONIG_EXTERN -OnigRegion* onig_region_new P_((void)); -ONIG_EXTERN -void onig_region_init P_((OnigRegion* region)); -ONIG_EXTERN -void onig_region_free P_((OnigRegion* region, int free_self)); -ONIG_EXTERN -void onig_region_copy P_((OnigRegion* to, OnigRegion* from)); -ONIG_EXTERN -void onig_region_clear P_((OnigRegion* region)); -ONIG_EXTERN -int onig_region_resize P_((OnigRegion* region, int n)); -ONIG_EXTERN -int onig_region_set P_((OnigRegion* region, int at, int beg, int end)); -ONIG_EXTERN -int onig_name_to_group_numbers P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, int** nums)); -ONIG_EXTERN -int onig_name_to_backref_number P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, OnigRegion *region)); -ONIG_EXTERN -int onig_foreach_name P_((OnigRegex reg, int (*func)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*), void* arg)); -ONIG_EXTERN -int onig_number_of_names P_((OnigRegex reg)); -ONIG_EXTERN -int onig_number_of_captures P_((OnigRegex reg)); -ONIG_EXTERN -int onig_number_of_capture_histories P_((OnigRegex reg)); -ONIG_EXTERN -OnigCaptureTreeNode* onig_get_capture_tree P_((OnigRegion* region)); -ONIG_EXTERN -int onig_capture_tree_traverse P_((OnigRegion* region, int at, int(*callback_func)(int,int,int,int,int,void*), void* arg)); -ONIG_EXTERN -int onig_noname_group_capture_is_active P_((OnigRegex reg)); -ONIG_EXTERN -OnigEncoding onig_get_encoding P_((OnigRegex reg)); -ONIG_EXTERN -OnigOptionType onig_get_options P_((OnigRegex reg)); -ONIG_EXTERN -OnigCaseFoldType onig_get_case_fold_flag P_((OnigRegex reg)); -ONIG_EXTERN -OnigSyntaxType* onig_get_syntax P_((OnigRegex reg)); -ONIG_EXTERN -int onig_set_default_syntax P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from)); -ONIG_EXTERN -unsigned int onig_get_syntax_op P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -unsigned int onig_get_syntax_op2 P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -unsigned int onig_get_syntax_behavior P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -OnigOptionType onig_get_syntax_options P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -void onig_set_syntax_op P_((OnigSyntaxType* syntax, unsigned int op)); -ONIG_EXTERN -void onig_set_syntax_op2 P_((OnigSyntaxType* syntax, unsigned int op2)); -ONIG_EXTERN -void onig_set_syntax_behavior P_((OnigSyntaxType* syntax, unsigned int behavior)); -ONIG_EXTERN -void onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options)); -ONIG_EXTERN -int onig_set_meta_char P_((OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code)); -ONIG_EXTERN -void onig_copy_encoding P_((OnigEncoding to, OnigEncoding from)); -ONIG_EXTERN -OnigCaseFoldType onig_get_default_case_fold_flag P_((void)); -ONIG_EXTERN -int onig_set_default_case_fold_flag P_((OnigCaseFoldType case_fold_flag)); -ONIG_EXTERN -unsigned int onig_get_match_stack_limit_size P_((void)); -ONIG_EXTERN -int onig_set_match_stack_limit_size P_((unsigned int size)); -ONIG_EXTERN -int onig_end P_((void)); -ONIG_EXTERN -const char* onig_version P_((void)); -ONIG_EXTERN -const char* onig_copyright P_((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ONIGURUMA_H */ diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/English.lproj/InfoPlist.strings b/native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/English.lproj/InfoPlist.strings deleted file mode 100644 index 39d5b82c7a6c406ab1adc9b76c29ce538c2bedea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmZvW%L>9U5Jk_Y1lQsZh$}Zjp@M!v+Da=vBHB{?dG(~-y0}SZ?wvFFeoBt)7`PF+ zbKvCNsEVuaEr|zjo}6jv=m~7pVsdKT$lkf^4yI;Kuzs1U?POl>*;rSSg8OnOndr;~ hO6!Yi)u@(JGV0G$Nq+ddW#$#E^oxm@Ny*=>`2l05C|Lji diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/Info.plist b/native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index ccdedf455..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - BuildMachineOSBuild - 11E2620 - CFBundleDevelopmentRegion - English - CFBundleExecutable - CocoaOniguruma - CFBundleIdentifier - net.limechat.CocoaOniguruma - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - CocoaOniguruma - CFBundlePackageType - FMWK - CFBundleSignature - ???? - CFBundleVersion - 1.0 - DTCompiler - - DTPlatformBuild - 4E3002 - DTPlatformVersion - GM - DTSDKBuild - 11E2620 - DTSDKName - - DTXcode - 0433 - DTXcodeBuild - 4E3002 - - diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/Current/CocoaOniguruma b/native/frameworks/CocoaOniguruma.framework/Versions/Current/CocoaOniguruma deleted file mode 100755 index 3799f6f6b12ef6e74a754f9b5d9ba44383401df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563988 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 z zSG4sp)U!ym^q`Xi@5^KN`Ej2)KmWz55WlJzHY`cH%BQ2CjM{{-_# zPX9yj94|lf@Z+sGowGlY)4v3sv*l+V{?_J?oc^!jxk`TK;qPGn$mwr!59-9o&piBt z%pW=Zli+zqe&*qiV@@A{$mw4T&)f1d|1*CJd=URW`hz_Dr&@m^=lWTXxY`~i&lmIX zUuXWv>92hs{y$!R=HV}I{>bUy1D@mMXCD5i%+H*^f87`@W3uJ9+s*#R?>YTFy%sz}w4TPucYaS_kA8jv&V86Un)ETMZ)Qo}2Ox4j z##RsF|Am{B_?b6CK0)ip&FN(qX6#rtaxVMP!+6iuvdqJe(SYfk_Z9gN-iYwWG7!tg zV>tu)&foQAK92iuTGBV>Ttzbon`ry`BWHhhgQuhX%){T({E^dt2t2*zXCD4)=8v5I zW8le`pLzJ>GYlVZzLlT(pZVW}r_`P${b&AX{tfUnke_+@xlb_X z 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

qoz@@RH)aUMippMZ4r0X5qoUZQX048SUMphz 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 diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexp.h b/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexp.h deleted file mode 100644 index 84f24b46d..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexp.h +++ /dev/null @@ -1,91 +0,0 @@ -// CocoaOniguruma is copyrighted free software by Satoshi Nakagawa . -// You can redistribute it and/or modify it under the new BSD license. - -#import -#import "oniguruma.h" -#import "OnigRegexpUtility.h" - - -@class OnigResult; - -typedef enum { - OnigOptionNone = ONIG_OPTION_NONE, - OnigOptionIgnorecase = ONIG_OPTION_IGNORECASE, - OnigOptionExtend = ONIG_OPTION_EXTEND, - OnigOptionMultiline = ONIG_OPTION_MULTILINE, - OnigOptionSingleline = ONIG_OPTION_SINGLELINE, - OnigOptionFindLongest = ONIG_OPTION_FIND_LONGEST, - OnigOptionFindNotEmpty = ONIG_OPTION_FIND_NOT_EMPTY, - OnigOptionNegateSingleLine = ONIG_OPTION_NEGATE_SINGLELINE, - OnigOptionDontCaptureGroup = ONIG_OPTION_DONT_CAPTURE_GROUP, - OnigOptionCaptureGroup = ONIG_OPTION_CAPTURE_GROUP, - - /* options (search time) */ - OnigOptionNotbol = ONIG_OPTION_NOTBOL, - OnigOptionNoteol = ONIG_OPTION_NOTEOL, - OnigOptionPosixRegion = ONIG_OPTION_POSIX_REGION, - OnigOptionMaxbit = ONIG_OPTION_MAXBIT -} OnigOption; - -@interface OnigRegexp : NSObject -{ - regex_t* _entity; - NSString* _expression; -} - -+ (OnigRegexp*)compile:(NSString*)expression; -+ (OnigRegexp*)compile:(NSString*)expression error:(NSError **)error; -+ (OnigRegexp*)compileIgnorecase:(NSString*)expression; -+ (OnigRegexp*)compileIgnorecase:(NSString*)expression error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline extended:(BOOL)extended; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline extended:(BOOL)extended error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression options:(OnigOption)options; -+ (OnigRegexp*)compile:(NSString*)expression options:(OnigOption)options error:(NSError **)error; - -- (OnigResult*)search:(NSString*)target; -- (OnigResult*)search:(NSString*)target start:(int)start; -- (OnigResult*)search:(NSString*)target start:(int)start end:(int)end; -- (OnigResult*)search:(NSString*)target range:(NSRange)range; - -- (OnigResult*)match:(NSString*)target; -- (OnigResult*)match:(NSString*)target start:(int)start; - -- (NSUInteger)captureCount; -- (NSString*)expression; - -@end - - -@interface OnigResult : NSObject -{ - OnigRegexp* _expression; - OnigRegion* _region; - NSString* _target; - NSMutableArray* _captureNames; -} - -- (NSString*)target; - -- (int)count; -- (NSString*)stringAt:(int)index; -- (NSArray*)strings; -- (NSRange)rangeAt:(int)index; -- (int)locationAt:(int)index; -- (int)lengthAt:(int)index; - -- (NSString*)body; -- (NSRange)bodyRange; - -- (NSString*)preMatch; -- (NSString*)postMatch; - -// named capture support -- (NSArray*)captureNames; -- (int)indexForName:(NSString*)name; -- (NSIndexSet*)indexesForName:(NSString*)name; -- (NSString*)stringForName:(NSString*)name; -- (NSArray*)stringsForName:(NSString*)name; - -@end diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexpUtility.h b/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexpUtility.h deleted file mode 100644 index 245ebae3d..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/OnigRegexpUtility.h +++ /dev/null @@ -1,57 +0,0 @@ -// CocoaOniguruma is copyrighted free software by Satoshi Nakagawa . -// You can redistribute it and/or modify it under the new BSD license. - -#import -#import "oniguruma.h" -#import "OnigRegexp.h" - - -@class OnigRegexp; -@class OnigResult; - - -@interface NSString (OnigRegexpUtility) - -// pattern is OnigRegexp or NSString - -- (NSRange)rangeOfRegexp:(id)pattern; - -// based on ruby's split - -- (NSArray*)split; -- (NSArray*)splitByRegexp:(id)pattern; -- (NSArray*)splitByRegexp:(id)pattern limit:(int)limit; - -// based on ruby's gsub - -- (NSString*)replaceByRegexp:(id)pattern with:(NSString*)string; -- (NSString*)replaceAllByRegexp:(id)pattern with:(NSString*)string; - -- (NSString*)replaceByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; -- (NSString*)replaceAllByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; - -#if defined(NS_BLOCKS_AVAILABLE) -- (NSString*)replaceByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -- (NSString*)replaceAllByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -#endif - -@end - - -@interface NSMutableString (OnigRegexpUtility) - -// pattern is OnigRegexp or NSString - -// based on ruby's gsub - -- (NSMutableString*)replaceByRegexp:(id)pattern with:(NSString*)string; -- (NSMutableString*)replaceAllByRegexp:(id)pattern with:(NSString*)string; - -- (NSMutableString*)replaceByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; -- (NSMutableString*)replaceAllByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; - -#if defined(NS_BLOCKS_AVAILABLE) -- (NSMutableString*)replaceByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -- (NSMutableString*)replaceAllByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -#endif -@end diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/oniguruma.h b/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/oniguruma.h deleted file mode 100644 index 8c6322c9b..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Headers/oniguruma.h +++ /dev/null @@ -1,770 +0,0 @@ -#ifndef ONIGURUMA_H -#define ONIGURUMA_H -/********************************************************************** - oniguruma.h - Oniguruma (regular expression library) -**********************************************************************/ -/*- - * Copyright (c) 2002-2009 K.Kosako - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ONIGURUMA -#define ONIGURUMA_VERSION_MAJOR 5 -#define ONIGURUMA_VERSION_MINOR 9 -#define ONIGURUMA_VERSION_TEENY 2 - -#ifdef __cplusplus -# ifndef HAVE_PROTOTYPES -# define HAVE_PROTOTYPES 1 -# endif -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -/* escape Mac OS X/Xcode 2.4/gcc 4.0.1 problem */ -#if defined(__APPLE__) && defined(__GNUC__) && __GNUC__ >= 4 -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#ifdef HAVE_STDARG_H -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#ifndef P_ -#if defined(__STDC__) || defined(_WIN32) -# define P_(args) args -#else -# define P_(args) () -#endif -#endif - -#ifndef PV_ -#ifdef HAVE_STDARG_PROTOTYPES -# define PV_(args) args -#else -# define PV_(args) () -#endif -#endif - -#ifndef ONIG_EXTERN -#if defined(_WIN32) && !defined(__GNUC__) -#if defined(EXPORT) || defined(RUBY_EXPORT) -#define ONIG_EXTERN extern __declspec(dllexport) -#else -#define ONIG_EXTERN extern __declspec(dllimport) -#endif -#endif -#endif - -#ifndef ONIG_EXTERN -#define ONIG_EXTERN extern -#endif - -/* PART: character encoding */ - -#ifndef ONIG_ESCAPE_UCHAR_COLLISION -#define UChar OnigUChar -#endif - -typedef unsigned char OnigUChar; -typedef unsigned long OnigCodePoint; -typedef unsigned int OnigCtype; -typedef unsigned int OnigDistance; - -#define ONIG_INFINITE_DISTANCE ~((OnigDistance )0) - -typedef unsigned int OnigCaseFoldType; /* case fold flag */ - -ONIG_EXTERN OnigCaseFoldType OnigDefaultCaseFoldFlag; - -/* #define ONIGENC_CASE_FOLD_HIRAGANA_KATAKANA (1<<1) */ -/* #define ONIGENC_CASE_FOLD_KATAKANA_WIDTH (1<<2) */ -#define ONIGENC_CASE_FOLD_TURKISH_AZERI (1<<20) -#define INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR (1<<30) - -#define ONIGENC_CASE_FOLD_MIN INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR -#define ONIGENC_CASE_FOLD_DEFAULT OnigDefaultCaseFoldFlag - - -#define ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN 3 -#define ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM 13 -/* 13 => Unicode:0x1ffc */ - -/* code range */ -#define ONIGENC_CODE_RANGE_NUM(range) ((int )range[0]) -#define ONIGENC_CODE_RANGE_FROM(range,i) range[((i)*2) + 1] -#define ONIGENC_CODE_RANGE_TO(range,i) range[((i)*2) + 2] - -typedef struct { - int byte_len; /* argument(original) character(s) byte length */ - int code_len; /* number of code */ - OnigCodePoint code[ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN]; -} OnigCaseFoldCodeItem; - -typedef struct { - OnigCodePoint esc; - OnigCodePoint anychar; - OnigCodePoint anytime; - OnigCodePoint zero_or_one_time; - OnigCodePoint one_or_more_time; - OnigCodePoint anychar_anytime; -} OnigMetaCharTableType; - -typedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg); - -typedef struct OnigEncodingTypeST { - int (*mbc_enc_len)(const OnigUChar* p); - const char* name; - int max_enc_len; - int min_enc_len; - int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end); - OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end); - int (*code_to_mbclen)(OnigCodePoint code); - int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf); - int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to); - int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg); - int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[]); - int (*property_name_to_ctype)(struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end); - int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype); - int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]); - OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p); - int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end); -} OnigEncodingType; - -typedef OnigEncodingType* OnigEncoding; - -ONIG_EXTERN OnigEncodingType OnigEncodingASCII; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_BE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_LE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_BE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_LE; - -#define ONIG_ENCODING_ASCII (&OnigEncodingASCII) -#define ONIG_ENCODING_UTF16_BE (&OnigEncodingUTF16_BE) -#define ONIG_ENCODING_UTF16_LE (&OnigEncodingUTF16_LE) -#define ONIG_ENCODING_UTF32_BE (&OnigEncodingUTF32_BE) -#define ONIG_ENCODING_UTF32_LE (&OnigEncodingUTF32_LE) - -#define ONIG_ENCODING_UNDEF ((OnigEncoding )0) - - -/* work size */ -#define ONIGENC_CODE_TO_MBC_MAXLEN 7 -#define ONIGENC_MBC_CASE_FOLD_MAXLEN 18 -/* 18: 6(max-byte) * 3(case-fold chars) */ - -/* character types */ -#define ONIGENC_CTYPE_NEWLINE 0 -#define ONIGENC_CTYPE_ALPHA 1 -#define ONIGENC_CTYPE_BLANK 2 -#define ONIGENC_CTYPE_CNTRL 3 -#define ONIGENC_CTYPE_DIGIT 4 -#define ONIGENC_CTYPE_GRAPH 5 -#define ONIGENC_CTYPE_LOWER 6 -#define ONIGENC_CTYPE_PRINT 7 -#define ONIGENC_CTYPE_PUNCT 8 -#define ONIGENC_CTYPE_SPACE 9 -#define ONIGENC_CTYPE_UPPER 10 -#define ONIGENC_CTYPE_XDIGIT 11 -#define ONIGENC_CTYPE_WORD 12 -#define ONIGENC_CTYPE_ALNUM 13 /* alpha || digit */ -#define ONIGENC_CTYPE_ASCII 14 -#define ONIGENC_MAX_STD_CTYPE ONIGENC_CTYPE_ASCII - - -#define onig_enc_len(enc,p,end) ONIGENC_MBC_ENC_LEN(enc,p) - -#define ONIGENC_IS_UNDEF(enc) ((enc) == ONIG_ENCODING_UNDEF) -#define ONIGENC_IS_SINGLEBYTE(enc) (ONIGENC_MBC_MAXLEN(enc) == 1) -#define ONIGENC_IS_MBC_HEAD(enc,p) (ONIGENC_MBC_ENC_LEN(enc,p) != 1) -#define ONIGENC_IS_MBC_ASCII(p) (*(p) < 128) -#define ONIGENC_IS_CODE_ASCII(code) ((code) < 128) -#define ONIGENC_IS_MBC_WORD(enc,s,end) \ - ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end)) - - -#define ONIGENC_NAME(enc) ((enc)->name) - -#define ONIGENC_MBC_CASE_FOLD(enc,flag,pp,end,buf) \ - (enc)->mbc_case_fold(flag,(const OnigUChar** )pp,end,buf) -#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \ - (enc)->is_allowed_reverse_match(s,end) -#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \ - (enc)->left_adjust_char_head(start, s) -#define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \ - (enc)->apply_all_case_fold(case_fold_flag,f,arg) -#define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \ - (enc)->get_case_fold_codes_by_str(case_fold_flag,p,end,acs) -#define ONIGENC_STEP_BACK(enc,start,s,n) \ - onigenc_step_back((enc),(start),(s),(n)) - -#define ONIGENC_MBC_ENC_LEN(enc,p) (enc)->mbc_enc_len(p) -#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len) -#define ONIGENC_MBC_MAXLEN_DIST(enc) ONIGENC_MBC_MAXLEN(enc) -#define ONIGENC_MBC_MINLEN(enc) ((enc)->min_enc_len) -#define ONIGENC_IS_MBC_NEWLINE(enc,p,end) (enc)->is_mbc_newline((p),(end)) -#define ONIGENC_MBC_TO_CODE(enc,p,end) (enc)->mbc_to_code((p),(end)) -#define ONIGENC_CODE_TO_MBCLEN(enc,code) (enc)->code_to_mbclen(code) -#define ONIGENC_CODE_TO_MBC(enc,code,buf) (enc)->code_to_mbc(code,buf) -#define ONIGENC_PROPERTY_NAME_TO_CTYPE(enc,p,end) \ - (enc)->property_name_to_ctype(enc,p,end) - -#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) (enc)->is_code_ctype(code,ctype) - -#define ONIGENC_IS_CODE_NEWLINE(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_NEWLINE) -#define ONIGENC_IS_CODE_GRAPH(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH) -#define ONIGENC_IS_CODE_PRINT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT) -#define ONIGENC_IS_CODE_ALNUM(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM) -#define ONIGENC_IS_CODE_ALPHA(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA) -#define ONIGENC_IS_CODE_LOWER(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER) -#define ONIGENC_IS_CODE_UPPER(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER) -#define ONIGENC_IS_CODE_CNTRL(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL) -#define ONIGENC_IS_CODE_PUNCT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT) -#define ONIGENC_IS_CODE_SPACE(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE) -#define ONIGENC_IS_CODE_BLANK(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK) -#define ONIGENC_IS_CODE_DIGIT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT) -#define ONIGENC_IS_CODE_XDIGIT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT) -#define ONIGENC_IS_CODE_WORD(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD) - -#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,sbout,ranges) \ - (enc)->get_ctype_code_range(ctype,sbout,ranges) - -ONIG_EXTERN -OnigUChar* onigenc_step_back P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, int n)); - - -/* encoding API */ -ONIG_EXTERN -int onigenc_init P_((void)); -ONIG_EXTERN -int onigenc_set_default_encoding P_((OnigEncoding enc)); -ONIG_EXTERN -OnigEncoding onigenc_get_default_encoding P_((void)); -ONIG_EXTERN -void onigenc_set_default_caseconv_table P_((const OnigUChar* table)); -ONIG_EXTERN -OnigUChar* onigenc_get_right_adjust_char_head_with_prev P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar** prev)); -ONIG_EXTERN -OnigUChar* onigenc_get_prev_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -OnigUChar* onigenc_get_left_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -OnigUChar* onigenc_get_right_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -int onigenc_strlen P_((OnigEncoding enc, const OnigUChar* p, const OnigUChar* end)); -ONIG_EXTERN -int onigenc_strlen_null P_((OnigEncoding enc, const OnigUChar* p)); -ONIG_EXTERN -int onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p)); - - - -/* PART: regular expression */ - -/* config parameters */ -#define ONIG_NREGION 10 -#define ONIG_MAX_BACKREF_NUM 1000 -#define ONIG_MAX_REPEAT_NUM 100000 -#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000 -/* constants */ -#define ONIG_MAX_ERROR_MESSAGE_LEN 90 - -typedef unsigned int OnigOptionType; - -#define ONIG_OPTION_DEFAULT ONIG_OPTION_NONE - -/* options */ -#define ONIG_OPTION_NONE 0U -#define ONIG_OPTION_IGNORECASE 1U -#define ONIG_OPTION_EXTEND (ONIG_OPTION_IGNORECASE << 1) -#define ONIG_OPTION_MULTILINE (ONIG_OPTION_EXTEND << 1) -#define ONIG_OPTION_SINGLELINE (ONIG_OPTION_MULTILINE << 1) -#define ONIG_OPTION_FIND_LONGEST (ONIG_OPTION_SINGLELINE << 1) -#define ONIG_OPTION_FIND_NOT_EMPTY (ONIG_OPTION_FIND_LONGEST << 1) -#define ONIG_OPTION_NEGATE_SINGLELINE (ONIG_OPTION_FIND_NOT_EMPTY << 1) -#define ONIG_OPTION_DONT_CAPTURE_GROUP (ONIG_OPTION_NEGATE_SINGLELINE << 1) -#define ONIG_OPTION_CAPTURE_GROUP (ONIG_OPTION_DONT_CAPTURE_GROUP << 1) -/* options (search time) */ -#define ONIG_OPTION_NOTBOL (ONIG_OPTION_CAPTURE_GROUP << 1) -#define ONIG_OPTION_NOTEOL (ONIG_OPTION_NOTBOL << 1) -#define ONIG_OPTION_POSIX_REGION (ONIG_OPTION_NOTEOL << 1) -#define ONIG_OPTION_MAXBIT ONIG_OPTION_POSIX_REGION /* limit */ - -#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt)) -#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt)) -#define ONIG_IS_OPTION_ON(options,option) ((options) & (option)) - -/* syntax */ -typedef struct { - unsigned int op; - unsigned int op2; - unsigned int behavior; - OnigOptionType options; /* default option */ - OnigMetaCharTableType meta_char_table; -} OnigSyntaxType; - -ONIG_EXTERN OnigSyntaxType OnigSyntaxASIS; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended; -ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs; -ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep; -ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex; -ONIG_EXTERN OnigSyntaxType OnigSyntaxJava; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl_NG; -ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby; - -/* predefined syntaxes (see regsyntax.c) */ -#define ONIG_SYNTAX_ASIS (&OnigSyntaxASIS) -#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic) -#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended) -#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs) -#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep) -#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex) -#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava) -#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl) -#define ONIG_SYNTAX_PERL_NG (&OnigSyntaxPerl_NG) -#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby) - -/* default syntax */ -ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax; -#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax - -/* syntax (operators) */ -#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS (1U<<0) -#define ONIG_SYN_OP_DOT_ANYCHAR (1U<<1) /* . */ -#define ONIG_SYN_OP_ASTERISK_ZERO_INF (1U<<2) /* * */ -#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF (1U<<3) -#define ONIG_SYN_OP_PLUS_ONE_INF (1U<<4) /* + */ -#define ONIG_SYN_OP_ESC_PLUS_ONE_INF (1U<<5) -#define ONIG_SYN_OP_QMARK_ZERO_ONE (1U<<6) /* ? */ -#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE (1U<<7) -#define ONIG_SYN_OP_BRACE_INTERVAL (1U<<8) /* {lower,upper} */ -#define ONIG_SYN_OP_ESC_BRACE_INTERVAL (1U<<9) /* \{lower,upper\} */ -#define ONIG_SYN_OP_VBAR_ALT (1U<<10) /* | */ -#define ONIG_SYN_OP_ESC_VBAR_ALT (1U<<11) /* \| */ -#define ONIG_SYN_OP_LPAREN_SUBEXP (1U<<12) /* (...) */ -#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP (1U<<13) /* \(...\) */ -#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR (1U<<14) /* \A, \Z, \z */ -#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR (1U<<15) /* \G */ -#define ONIG_SYN_OP_DECIMAL_BACKREF (1U<<16) /* \num */ -#define ONIG_SYN_OP_BRACKET_CC (1U<<17) /* [...] */ -#define ONIG_SYN_OP_ESC_W_WORD (1U<<18) /* \w, \W */ -#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END (1U<<19) /* \<. \> */ -#define ONIG_SYN_OP_ESC_B_WORD_BOUND (1U<<20) /* \b, \B */ -#define ONIG_SYN_OP_ESC_S_WHITE_SPACE (1U<<21) /* \s, \S */ -#define ONIG_SYN_OP_ESC_D_DIGIT (1U<<22) /* \d, \D */ -#define ONIG_SYN_OP_LINE_ANCHOR (1U<<23) /* ^, $ */ -#define ONIG_SYN_OP_POSIX_BRACKET (1U<<24) /* [:xxxx:] */ -#define ONIG_SYN_OP_QMARK_NON_GREEDY (1U<<25) /* ??,*?,+?,{n,m}? */ -#define ONIG_SYN_OP_ESC_CONTROL_CHARS (1U<<26) /* \n,\r,\t,\a ... */ -#define ONIG_SYN_OP_ESC_C_CONTROL (1U<<27) /* \cx */ -#define ONIG_SYN_OP_ESC_OCTAL3 (1U<<28) /* \OOO */ -#define ONIG_SYN_OP_ESC_X_HEX2 (1U<<29) /* \xHH */ -#define ONIG_SYN_OP_ESC_X_BRACE_HEX8 (1U<<30) /* \x{7HHHHHHH} */ - -#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE (1U<<0) /* \Q...\E */ -#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT (1U<<1) /* (?...) */ -#define ONIG_SYN_OP2_OPTION_PERL (1U<<2) /* (?imsx),(?-imsx) */ -#define ONIG_SYN_OP2_OPTION_RUBY (1U<<3) /* (?imx), (?-imx) */ -#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT (1U<<4) /* ?+,*+,++ */ -#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL (1U<<5) /* {n,m}+ */ -#define ONIG_SYN_OP2_CCLASS_SET_OP (1U<<6) /* [...&&..[..]..] */ -#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP (1U<<7) /* (?...) */ -#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF (1U<<8) /* \k */ -#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL (1U<<9) /* \g, \g */ -#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY (1U<<10) /* (?@..),(?@..) */ -#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1U<<11) /* \C-x */ -#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META (1U<<12) /* \M-x */ -#define ONIG_SYN_OP2_ESC_V_VTAB (1U<<13) /* \v as VTAB */ -#define ONIG_SYN_OP2_ESC_U_HEX4 (1U<<14) /* \uHHHH */ -#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR (1U<<15) /* \`, \' */ -#define ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY (1U<<16) /* \p{...}, \P{...} */ -#define ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT (1U<<17) /* \p{^..}, \P{^..} */ -/* #define ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS (1U<<18) */ -#define ONIG_SYN_OP2_ESC_H_XDIGIT (1U<<19) /* \h, \H */ -#define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE (1U<<20) /* \ */ - -/* syntax (behavior) */ -#define ONIG_SYN_CONTEXT_INDEP_ANCHORS (1U<<31) /* not implemented */ -#define ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS (1U<<0) /* ?, *, +, {n,m} */ -#define ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS (1U<<1) /* error or ignore */ -#define ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP (1U<<2) /* ...)... */ -#define ONIG_SYN_ALLOW_INVALID_INTERVAL (1U<<3) /* {??? */ -#define ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV (1U<<4) /* {,n} => {0,n} */ -#define ONIG_SYN_STRICT_CHECK_BACKREF (1U<<5) /* /(\1)/,/\1()/ ..*/ -#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1U<<6) /* (?<=a|bc) */ -#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP (1U<<7) /* see doc/RE */ -#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1U<<8) /* (?)(?) */ -#define ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY (1U<<9) /* a{n}?=(?:a{n})? */ - -/* syntax (behavior) in char class [...] */ -#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1U<<20) /* [^...] */ -#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC (1U<<21) /* [..\w..] etc.. */ -#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1U<<22) -#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC (1U<<23) /* [0-9-a]=[0-9\-a] */ -/* syntax (behavior) warning */ -#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED (1U<<24) /* [,-,] */ -#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT (1U<<25) /* (?:a*)+ */ - -/* meta character specifiers (onig_set_meta_char()) */ -#define ONIG_META_CHAR_ESCAPE 0 -#define ONIG_META_CHAR_ANYCHAR 1 -#define ONIG_META_CHAR_ANYTIME 2 -#define ONIG_META_CHAR_ZERO_OR_ONE_TIME 3 -#define ONIG_META_CHAR_ONE_OR_MORE_TIME 4 -#define ONIG_META_CHAR_ANYCHAR_ANYTIME 5 - -#define ONIG_INEFFECTIVE_META_CHAR 0 - -/* error codes */ -#define ONIG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -1000) -/* normal return */ -#define ONIG_NORMAL 0 -#define ONIG_MISMATCH -1 -#define ONIG_NO_SUPPORT_CONFIG -2 - -/* internal error */ -#define ONIGERR_MEMORY -5 -#define ONIGERR_TYPE_BUG -6 -#define ONIGERR_PARSER_BUG -11 -#define ONIGERR_STACK_BUG -12 -#define ONIGERR_UNDEFINED_BYTECODE -13 -#define ONIGERR_UNEXPECTED_BYTECODE -14 -#define ONIGERR_MATCH_STACK_LIMIT_OVER -15 -#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21 -#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22 -/* general error */ -#define ONIGERR_INVALID_ARGUMENT -30 -/* syntax error */ -#define ONIGERR_END_PATTERN_AT_LEFT_BRACE -100 -#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET -101 -#define ONIGERR_EMPTY_CHAR_CLASS -102 -#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS -103 -#define ONIGERR_END_PATTERN_AT_ESCAPE -104 -#define ONIGERR_END_PATTERN_AT_META -105 -#define ONIGERR_END_PATTERN_AT_CONTROL -106 -#define ONIGERR_META_CODE_SYNTAX -108 -#define ONIGERR_CONTROL_CODE_SYNTAX -109 -#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110 -#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111 -#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112 -#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113 -#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114 -#define ONIGERR_NESTED_REPEAT_OPERATOR -115 -#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS -116 -#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117 -#define ONIGERR_END_PATTERN_IN_GROUP -118 -#define ONIGERR_UNDEFINED_GROUP_OPTION -119 -#define ONIGERR_INVALID_POSIX_BRACKET_TYPE -121 -#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN -122 -#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN -123 -/* values error (syntax error) */ -#define ONIGERR_TOO_BIG_NUMBER -200 -#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201 -#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202 -#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS -203 -#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204 -#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES -205 -#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING -206 -#define ONIGERR_TOO_BIG_BACKREF_NUMBER -207 -#define ONIGERR_INVALID_BACKREF -208 -#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED -209 -#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE -212 -#define ONIGERR_EMPTY_GROUP_NAME -214 -#define ONIGERR_INVALID_GROUP_NAME -215 -#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME -216 -#define ONIGERR_UNDEFINED_NAME_REFERENCE -217 -#define ONIGERR_UNDEFINED_GROUP_REFERENCE -218 -#define ONIGERR_MULTIPLEX_DEFINED_NAME -219 -#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL -220 -#define ONIGERR_NEVER_ENDING_RECURSION -221 -#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222 -#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223 -#define ONIGERR_INVALID_CODE_POINT_VALUE -400 -#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400 -#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401 -#define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION -402 -#define ONIGERR_INVALID_COMBINATION_OF_OPTIONS -403 - -/* errors related to thread */ -#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT -1001 - - -/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */ -#define ONIG_MAX_CAPTURE_HISTORY_GROUP 31 -#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \ - ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i]) - -typedef struct OnigCaptureTreeNodeStruct { - int group; /* group number */ - int beg; - int end; - int allocated; - int num_childs; - struct OnigCaptureTreeNodeStruct** childs; -} OnigCaptureTreeNode; - -/* match result region type */ -struct re_registers { - int allocated; - int num_regs; - int* beg; - int* end; - /* extended */ - OnigCaptureTreeNode* history_root; /* capture history tree root */ -}; - -/* capture tree traverse */ -#define ONIG_TRAVERSE_CALLBACK_AT_FIRST 1 -#define ONIG_TRAVERSE_CALLBACK_AT_LAST 2 -#define ONIG_TRAVERSE_CALLBACK_AT_BOTH \ - ( ONIG_TRAVERSE_CALLBACK_AT_FIRST | ONIG_TRAVERSE_CALLBACK_AT_LAST ) - - -#define ONIG_REGION_NOTPOS -1 - -typedef struct re_registers OnigRegion; - -typedef struct { - OnigEncoding enc; - OnigUChar* par; - OnigUChar* par_end; -} OnigErrorInfo; - -typedef struct { - int lower; - int upper; -} OnigRepeatRange; - -typedef void (*OnigWarnFunc) P_((const char* s)); -extern void onig_null_warn P_((const char* s)); -#define ONIG_NULL_WARN onig_null_warn - -#define ONIG_CHAR_TABLE_SIZE 256 - -/* regex_t state */ -#define ONIG_STATE_NORMAL 0 -#define ONIG_STATE_SEARCHING 1 -#define ONIG_STATE_COMPILING -1 -#define ONIG_STATE_MODIFY -2 - -#define ONIG_STATE(reg) \ - ((reg)->state > 0 ? ONIG_STATE_SEARCHING : (reg)->state) - -typedef struct re_pattern_buffer { - /* common members of BBuf(bytes-buffer) */ - unsigned char* p; /* compiled pattern */ - unsigned int used; /* used space for p */ - unsigned int alloc; /* allocated space for p */ - - int state; /* normal, searching, compiling */ - int num_mem; /* used memory(...) num counted from 1 */ - int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */ - int num_null_check; /* OP_NULL_CHECK_START/END id counter */ - int num_comb_exp_check; /* combination explosion check */ - int num_call; /* number of subexp call */ - unsigned int capture_history; /* (?@...) flag (1-31) */ - unsigned int bt_mem_start; /* need backtrack flag */ - unsigned int bt_mem_end; /* need backtrack flag */ - int stack_pop_level; - int repeat_range_alloc; - OnigRepeatRange* repeat_range; - - OnigEncoding enc; - OnigOptionType options; - OnigSyntaxType* syntax; - OnigCaseFoldType case_fold_flag; - void* name_table; - - /* optimization info (string search, char-map and anchors) */ - int optimize; /* optimize flag */ - int threshold_len; /* search str-length for apply optimize */ - int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */ - OnigDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */ - OnigDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */ - int sub_anchor; /* start-anchor for exact or map */ - unsigned char *exact; - unsigned char *exact_end; - unsigned char map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */ - int *int_map; /* BM skip for exact_len > 255 */ - int *int_map_backward; /* BM skip for backward search */ - OnigDistance dmin; /* min-distance of exact or map */ - OnigDistance dmax; /* max-distance of exact or map */ - - /* regex_t link chain */ - struct re_pattern_buffer* chain; /* escape compile-conflict */ -} OnigRegexType; - -typedef OnigRegexType* OnigRegex; - -#ifndef ONIG_ESCAPE_REGEX_T_COLLISION - typedef OnigRegexType regex_t; -#endif - - -typedef struct { - int num_of_elements; - OnigEncoding pattern_enc; - OnigEncoding target_enc; - OnigSyntaxType* syntax; - OnigOptionType option; - OnigCaseFoldType case_fold_flag; -} OnigCompileInfo; - -/* Oniguruma Native API */ -ONIG_EXTERN -int onig_init P_((void)); -ONIG_EXTERN -int onig_error_code_to_str PV_((OnigUChar* s, int err_code, ...)); -ONIG_EXTERN -void onig_set_warn_func P_((OnigWarnFunc f)); -ONIG_EXTERN -void onig_set_verb_warn_func P_((OnigWarnFunc f)); -ONIG_EXTERN -int onig_new P_((OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_reg_init P_((regex_t* reg, OnigOptionType option, OnigCaseFoldType case_fold_flag, OnigEncoding enc, OnigSyntaxType* syntax)); -int onig_new_without_alloc P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_new_deluxe P_((OnigRegex* reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo)); -ONIG_EXTERN -void onig_free P_((OnigRegex)); -ONIG_EXTERN -void onig_free_body P_((OnigRegex)); -ONIG_EXTERN -int onig_recompile P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_recompile_deluxe P_((OnigRegex reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_search P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option)); -ONIG_EXTERN -int onig_match P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* at, OnigRegion* region, OnigOptionType option)); -ONIG_EXTERN -OnigRegion* onig_region_new P_((void)); -ONIG_EXTERN -void onig_region_init P_((OnigRegion* region)); -ONIG_EXTERN -void onig_region_free P_((OnigRegion* region, int free_self)); -ONIG_EXTERN -void onig_region_copy P_((OnigRegion* to, OnigRegion* from)); -ONIG_EXTERN -void onig_region_clear P_((OnigRegion* region)); -ONIG_EXTERN -int onig_region_resize P_((OnigRegion* region, int n)); -ONIG_EXTERN -int onig_region_set P_((OnigRegion* region, int at, int beg, int end)); -ONIG_EXTERN -int onig_name_to_group_numbers P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, int** nums)); -ONIG_EXTERN -int onig_name_to_backref_number P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, OnigRegion *region)); -ONIG_EXTERN -int onig_foreach_name P_((OnigRegex reg, int (*func)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*), void* arg)); -ONIG_EXTERN -int onig_number_of_names P_((OnigRegex reg)); -ONIG_EXTERN -int onig_number_of_captures P_((OnigRegex reg)); -ONIG_EXTERN -int onig_number_of_capture_histories P_((OnigRegex reg)); -ONIG_EXTERN -OnigCaptureTreeNode* onig_get_capture_tree P_((OnigRegion* region)); -ONIG_EXTERN -int onig_capture_tree_traverse P_((OnigRegion* region, int at, int(*callback_func)(int,int,int,int,int,void*), void* arg)); -ONIG_EXTERN -int onig_noname_group_capture_is_active P_((OnigRegex reg)); -ONIG_EXTERN -OnigEncoding onig_get_encoding P_((OnigRegex reg)); -ONIG_EXTERN -OnigOptionType onig_get_options P_((OnigRegex reg)); -ONIG_EXTERN -OnigCaseFoldType onig_get_case_fold_flag P_((OnigRegex reg)); -ONIG_EXTERN -OnigSyntaxType* onig_get_syntax P_((OnigRegex reg)); -ONIG_EXTERN -int onig_set_default_syntax P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from)); -ONIG_EXTERN -unsigned int onig_get_syntax_op P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -unsigned int onig_get_syntax_op2 P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -unsigned int onig_get_syntax_behavior P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -OnigOptionType onig_get_syntax_options P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -void onig_set_syntax_op P_((OnigSyntaxType* syntax, unsigned int op)); -ONIG_EXTERN -void onig_set_syntax_op2 P_((OnigSyntaxType* syntax, unsigned int op2)); -ONIG_EXTERN -void onig_set_syntax_behavior P_((OnigSyntaxType* syntax, unsigned int behavior)); -ONIG_EXTERN -void onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options)); -ONIG_EXTERN -int onig_set_meta_char P_((OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code)); -ONIG_EXTERN -void onig_copy_encoding P_((OnigEncoding to, OnigEncoding from)); -ONIG_EXTERN -OnigCaseFoldType onig_get_default_case_fold_flag P_((void)); -ONIG_EXTERN -int onig_set_default_case_fold_flag P_((OnigCaseFoldType case_fold_flag)); -ONIG_EXTERN -unsigned int onig_get_match_stack_limit_size P_((void)); -ONIG_EXTERN -int onig_set_match_stack_limit_size P_((unsigned int size)); -ONIG_EXTERN -int onig_end P_((void)); -ONIG_EXTERN -const char* onig_version P_((void)); -ONIG_EXTERN -const char* onig_copyright P_((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ONIGURUMA_H */ diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings b/native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings deleted file mode 100644 index 39d5b82c7a6c406ab1adc9b76c29ce538c2bedea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmZvW%L>9U5Jk_Y1lQsZh$}Zjp@M!v+Da=vBHB{?dG(~-y0}SZ?wvFFeoBt)7`PF+ zbKvCNsEVuaEr|zjo}6jv=m~7pVsdKT$lkf^4yI;Kuzs1U?POl>*;rSSg8OnOndr;~ hO6!Yi)u@(JGV0G$Nq+ddW#$#E^oxm@Ny*=>`2l05C|Lji diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/Info.plist b/native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/Info.plist deleted file mode 100644 index ccdedf455..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Versions/Current/Resources/Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - BuildMachineOSBuild - 11E2620 - CFBundleDevelopmentRegion - English - CFBundleExecutable - CocoaOniguruma - CFBundleIdentifier - net.limechat.CocoaOniguruma - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - CocoaOniguruma - CFBundlePackageType - FMWK - CFBundleSignature - ???? - CFBundleVersion - 1.0 - DTCompiler - - DTPlatformBuild - 4E3002 - DTPlatformVersion - GM - DTSDKBuild - 11E2620 - DTSDKName - - DTXcode - 0433 - DTXcodeBuild - 4E3002 - - diff --git a/native/linux/atom_cef_render_process_handler.cpp b/native/linux/atom_cef_render_process_handler.cpp index 84b66c5ea..33e1d4c73 100644 --- a/native/linux/atom_cef_render_process_handler.cpp +++ b/native/linux/atom_cef_render_process_handler.cpp @@ -9,7 +9,6 @@ void AtomCefRenderProcessHandler::OnWebKitInitialized() { new v8_extensions::Atom(); new v8_extensions::NativeHandler(); - new v8_extensions::OnigRegExp(); } void AtomCefRenderProcessHandler::OnContextCreated( diff --git a/native/v8_extensions/onig_reg_exp.h b/native/v8_extensions/onig_reg_exp.h deleted file mode 100644 index 4db0d0e32..000000000 --- a/native/v8_extensions/onig_reg_exp.h +++ /dev/null @@ -1,24 +0,0 @@ -#include "include/cef_base.h" -#include "include/cef_v8.h" - -namespace v8_extensions { - - class OnigRegExp : public CefV8Handler { - public: - OnigRegExp(); - void CreateContextBinding(CefRefPtr context); - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE; - - // Provide the reference counting implementation for this class. - IMPLEMENT_REFCOUNTING(OnigRegExp); - - private: - OnigRegExp(OnigRegExp const&); - void operator=(OnigRegExp const&); - }; - -} \ No newline at end of file diff --git a/native/v8_extensions/onig_reg_exp.mm b/native/v8_extensions/onig_reg_exp.mm deleted file mode 100644 index 21b59b342..000000000 --- a/native/v8_extensions/onig_reg_exp.mm +++ /dev/null @@ -1,106 +0,0 @@ -#import -#import -#import "CocoaOniguruma/OnigRegexp.h" -#import "include/cef_base.h" -#import "include/cef_v8.h" -#import "onig_reg_exp.h" - -namespace v8_extensions { - -extern NSString *stringFromCefV8Value(const CefRefPtr& value); - -class OnigRegExpUserData : public CefBase { -public: - OnigRegExpUserData(CefRefPtr source) { - NSString *sourceString = [NSString stringWithUTF8String:source->GetStringValue().ToString().c_str()]; - m_regex = [[OnigRegexp compile:sourceString] retain]; - } - - ~OnigRegExpUserData() { - [m_regex release]; - } - - CefRefPtr Search(CefRefPtr string, CefRefPtr index) { - OnigResult *result = [m_regex search:stringFromCefV8Value(string) start:index->GetIntValue()]; - - if ([result count] == 0) return CefV8Value::CreateNull(); - - CefRefPtr resultArray = CefV8Value::CreateArray(result.count); - CefRefPtr indicesArray = CefV8Value::CreateArray(result.count); - - for (int i = 0; i < [result count]; i++) { - resultArray->SetValue(i, CefV8Value::CreateString([[result stringAt:i] UTF8String])); - indicesArray->SetValue(i, CefV8Value::CreateInt([result locationAt:i])); - } - - resultArray->SetValue("index", CefV8Value::CreateInt([result locationAt:0]), V8_PROPERTY_ATTRIBUTE_NONE); - resultArray->SetValue("indices", indicesArray, V8_PROPERTY_ATTRIBUTE_NONE); - - return resultArray; - } - - CefRefPtr Test(CefRefPtr string, CefRefPtr index) { - OnigResult *result = [m_regex search:stringFromCefV8Value(string) start:index->GetIntValue()]; - return CefV8Value::CreateBool(result); - } - - OnigRegexp *m_regex; - - IMPLEMENT_REFCOUNTING(OnigRegexpUserData); -}; - -OnigRegExp::OnigRegExp() : CefV8Handler() { -} - -void OnigRegExp::CreateContextBinding(CefRefPtr context) { - const char* methodNames[] = { "search", "test", "buildOnigRegExp" }; - - CefRefPtr nativeObject = CefV8Value::CreateObject(NULL); - int arrayLength = sizeof(methodNames) / sizeof(const char *); - for (int i = 0; i < arrayLength; i++) { - const char *functionName = methodNames[i]; - CefRefPtr function = CefV8Value::CreateFunction(functionName, this); - nativeObject->SetValue(functionName, function, V8_PROPERTY_ATTRIBUTE_NONE); - } - - CefRefPtr global = context->GetGlobal(); - global->SetValue("$onigRegExp", nativeObject, V8_PROPERTY_ATTRIBUTE_NONE); -} - -bool OnigRegExp::Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - - @autoreleasepool { - if (name == "search") { - CefRefPtr string = arguments[0]; - CefRefPtr index = arguments.size() > 1 ? arguments[1] : CefV8Value::CreateInt(0); - OnigRegExpUserData *userData = (OnigRegExpUserData *)object->GetUserData().get(); - retval = userData->Search(string, index); - return true; - } - else if (name == "test") { - CefRefPtr string = arguments[0]; - CefRefPtr index = arguments.size() > 1 ? arguments[1] : CefV8Value::CreateInt(0); - OnigRegExpUserData *userData = (OnigRegExpUserData *)object->GetUserData().get(); - retval = userData->Test(string, index); - return true; - } - else if (name == "buildOnigRegExp") { - CefRefPtr pattern = arguments[0]; - CefRefPtr userData = new OnigRegExpUserData(pattern); - if (!userData->m_regex) { - exception = std::string("Failed to create OnigRegExp from pattern '") + pattern->GetStringValue().ToString() + "'"; - } - retval = CefV8Value::CreateObject(NULL); - retval->SetUserData((CefRefPtr)userData); - return true; - } - - return false; - } -} - -} // namespace v8_extensions \ No newline at end of file diff --git a/native/v8_extensions/onig_reg_exp_linux.cpp b/native/v8_extensions/onig_reg_exp_linux.cpp deleted file mode 100644 index 82f1db910..000000000 --- a/native/v8_extensions/onig_reg_exp_linux.cpp +++ /dev/null @@ -1,228 +0,0 @@ -#include "onig_reg_exp.h" -#include "include/cef_runnable.h" -#include -#include -#include -#include "io_utils.h" - -using namespace std; - -namespace v8_extensions { - -class OnigRegexpUserData: public CefBase { -public: - OnigRegexpUserData(CefRefPtr source) { - OnigErrorInfo error; - string input = source->GetStringValue().ToString(); - int length = input.length(); - UChar* pattern = (UChar*) input.c_str(); - int code = onig_new(®ex, pattern, pattern + length, - ONIG_OPTION_SINGLELINE, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, - &error); - if (code != ONIG_NORMAL) { - char errorText[ONIG_MAX_ERROR_MESSAGE_LEN]; - onig_error_code_to_str((OnigUChar*) errorText, code, &error); - cout << errorText << " for pattern: " << input << endl; - } - } - - ~OnigRegexpUserData() { - onig_free(regex); - } - - OnigRegion* SearchRegion(string input, int index) { - if (!regex) - return NULL; - - OnigRegion* region = onig_region_new(); - UChar* search = (UChar*) input.c_str(); - unsigned char* start = search + index; - unsigned char* end = search + input.length(); - int code = onig_search(regex, search, end, start, end, region, - ONIG_OPTION_NONE); - if (code >= 0) - return region; - else { - onig_region_free(region, 1); - return NULL; - } - } - - CefRefPtr Search(CefRefPtr argument, - CefRefPtr index) { - string input = argument->GetStringValue().ToString(); - OnigRegion* region = SearchRegion(input, index->GetIntValue()); - if (!region) - return CefV8Value::CreateNull(); - - CefRefPtr indices; - CefRefPtr resultArray = CefV8Value::CreateArray( - region->num_regs); - CefRefPtr indicesArray = CefV8Value::CreateArray( - region->num_regs); - for (int i = 0; i < region->num_regs; i++) { - int begin = region->beg[i]; - int end = region->end[i]; - resultArray->SetValue(i, - CefV8Value::CreateString(input.substr(begin, end - begin))); - indicesArray->SetValue(i, CefV8Value::CreateInt(begin)); - } - resultArray->SetValue("index", CefV8Value::CreateInt(region->beg[0]), - V8_PROPERTY_ATTRIBUTE_NONE); - resultArray->SetValue("indices", indicesArray, V8_PROPERTY_ATTRIBUTE_NONE); - onig_region_free(region, 1); - return resultArray; - } - - CefRefPtr Test(CefRefPtr argument, - CefRefPtr index) { - OnigRegion* region = SearchRegion(argument->GetStringValue().ToString(), - index->GetIntValue()); - CefRefPtr text = CefV8Value::CreateBool(region != NULL); - if (region) - onig_region_free(region, 1); - return text; - } - - CefRefPtr GetCaptureIndices(CefRefPtr argument, - CefRefPtr index) { - OnigRegion* region = SearchRegion(argument->GetStringValue().ToString(), - index->GetIntValue()); - CefRefPtr indices; - if (region) { - indices = BuildCaptureIndices(region); - onig_region_free(region, 1); - } else - indices = CefV8Value::CreateNull(); - return indices; - } - - CefRefPtr BuildCaptureIndices(OnigRegion *region) { - CefRefPtr array = CefV8Value::CreateArray(region->num_regs * 3); - int i = 0; - for (int index = 0; index < region->num_regs; index++) { - int begin = region->beg[index]; - int end = region->end[index]; - if (end - begin <= 0) - continue; - array->SetValue(i++, CefV8Value::CreateInt(index)); - array->SetValue(i++, CefV8Value::CreateInt(begin)); - array->SetValue(i++, CefV8Value::CreateInt(end)); - } - - return array; - } - - CefRefPtr CaptureCount() { - if (regex) - return CefV8Value::CreateInt(onig_number_of_captures(regex)); - else - return CefV8Value::CreateInt(0); - } - - regex_t* regex; - -IMPLEMENT_REFCOUNTING(OnigRegexpUserData) - ; -} -; - -OnigRegExp::OnigRegExp() : - CefV8Handler() { - string realFilePath = io_utils_real_app_path( - "/native/v8_extensions/onig_reg_exp.js"); - if (!realFilePath.empty()) { - string extensionCode; - if (io_utils_read(realFilePath, &extensionCode) > 0) - CefRegisterExtension("v8/onig-reg-exp", extensionCode, this); - } -} - -bool OnigRegExp::Execute(const CefString& name, - CefRefPtr object, const CefV8ValueList& arguments, - CefRefPtr& retval, CefString& exception) { - if (name == "captureIndices") { - CefRefPtr string = arguments[0]; - CefRefPtr index = arguments[1]; - CefRefPtr regexes = arguments[2]; - - int bestIndex = -1; - CefRefPtr captureIndicesForBestIndex; - CefRefPtr captureIndices; - - retval = CefV8Value::CreateObject(NULL); - for (int i = 0; i < regexes->GetArrayLength(); i++) { - OnigRegexpUserData *userData = - (OnigRegexpUserData *) regexes->GetValue(i)->GetUserData().get(); - captureIndices = userData->GetCaptureIndices(string, index); - if (captureIndices->IsNull()) - continue; - - if (bestIndex == -1 - || captureIndices->GetValue(1)->GetIntValue() - < captureIndicesForBestIndex->GetValue(1)->GetIntValue()) { - bestIndex = i; - captureIndicesForBestIndex = captureIndices; - if (captureIndices->GetValue(1)->GetIntValue() == 0) - break; // If the match starts at 0, just use it! - } - } - - if (bestIndex != -1) { - retval->SetValue("index", CefV8Value::CreateInt(bestIndex), - V8_PROPERTY_ATTRIBUTE_NONE); - retval->SetValue("captureIndices", captureIndicesForBestIndex, - V8_PROPERTY_ATTRIBUTE_NONE); - } - - return true; - - } - - if (name == "getCaptureIndices") { - CefRefPtr string = arguments[0]; - CefRefPtr index = - arguments.size() > 1 ? arguments[1] : CefV8Value::CreateInt(0); - OnigRegexpUserData *userData = - (OnigRegexpUserData *) object->GetUserData().get(); - retval = userData->GetCaptureIndices(string, index); - return true; - } - - if (name == "search") { - CefRefPtr string = arguments[0]; - CefRefPtr index = - arguments.size() > 1 ? arguments[1] : CefV8Value::CreateInt(0); - OnigRegexpUserData *userData = - (OnigRegexpUserData *) object->GetUserData().get(); - retval = userData->Search(string, index); - return true; - } - - if (name == "test") { - CefRefPtr string = arguments[0]; - CefRefPtr index = - arguments.size() > 1 ? arguments[1] : CefV8Value::CreateInt(0); - OnigRegexpUserData *userData = - (OnigRegexpUserData *) object->GetUserData().get(); - retval = userData->Test(string, index); - return true; - } - - if (name == "buildOnigRegExp") { - CefRefPtr userData = new OnigRegexpUserData(arguments[0]); - retval = CefV8Value::CreateObject(NULL); - retval->SetUserData(userData); - return true; - } - - if (name == "getCaptureCount") { - OnigRegexpUserData *userData = - (OnigRegexpUserData *) object->GetUserData().get(); - retval = userData->CaptureCount(); - return true; - } - - return false; -} -} diff --git a/native/v8_extensions/onig_scanner.h b/native/v8_extensions/onig_scanner.h deleted file mode 100644 index 33a2bb1af..000000000 --- a/native/v8_extensions/onig_scanner.h +++ /dev/null @@ -1,24 +0,0 @@ -#include "include/cef_base.h" -#include "include/cef_v8.h" - -namespace v8_extensions { - - class OnigScanner : public CefV8Handler { - public: - OnigScanner(); - void CreateContextBinding(CefRefPtr context); - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE; - - // Provide the reference counting implementation for this class. - IMPLEMENT_REFCOUNTING(OnigRegExp); - - private: - OnigScanner(OnigScanner const&); - void operator=(OnigScanner const&); - }; - -} \ No newline at end of file diff --git a/native/v8_extensions/onig_scanner.mm b/native/v8_extensions/onig_scanner.mm deleted file mode 100644 index 3a8db417f..000000000 --- a/native/v8_extensions/onig_scanner.mm +++ /dev/null @@ -1,171 +0,0 @@ -#import -#import -#import "CocoaOniguruma/OnigRegexp.h" -#import "include/cef_base.h" -#import "include/cef_v8.h" -#import "onig_scanner.h" - -namespace v8_extensions { - -using namespace std; -extern NSString *stringFromCefV8Value(const CefRefPtr& value); - -class OnigScannerUserData : public CefBase { - public: - OnigScannerUserData(CefRefPtr sources) { - int length = sources->GetArrayLength(); - - regExps.resize(length); - cachedResults.resize(length); - - for (int i = 0; i < length; i++) { - NSString *sourceString = stringFromCefV8Value(sources->GetValue(i)); - regExps[i] = [[OnigRegexp compile:sourceString] retain]; - } - } - - ~OnigScannerUserData() { - for (vector::iterator iter = regExps.begin(); iter < regExps.end(); iter++) { - [*iter release]; - } - for (vector::iterator iter = cachedResults.begin(); iter < cachedResults.end(); iter++) { - [*iter release]; - } - } - - CefRefPtr FindNextMatch(CefRefPtr v8String, CefRefPtr v8StartLocation) { - - std::string string = v8String->GetStringValue().ToString(); - int startLocation = v8StartLocation->GetIntValue(); - int bestIndex = -1; - int bestLocation = NULL; - OnigResult *bestResult = NULL; - - bool useCachedResults = (string == lastMatchedString && startLocation >= lastStartLocation); - lastStartLocation = startLocation; - - if (!useCachedResults) { - ClearCachedResults(); - lastMatchedString = string; - } - - vector::iterator iter = regExps.begin(); - int index = 0; - while (iter < regExps.end()) { - OnigRegexp *regExp = *iter; - - bool useCachedResult = false; - OnigResult *result = NULL; - - if (useCachedResults && index <= maxCachedIndex) { - result = cachedResults[index]; - useCachedResult = (result == NULL || [result locationAt:0] >= startLocation); - } - - if (!useCachedResult) { - result = [regExp search:[NSString stringWithUTF8String:string.c_str()] start:startLocation]; - cachedResults[index] = [result retain]; - maxCachedIndex = index; - } - - if ([result count] > 0) { - int location = [result locationAt:0]; - if (bestIndex == -1 || location < bestLocation) { - bestLocation = location; - bestResult = result; - bestIndex = index; - } - - if (location == startLocation) { - break; - } - } - - iter++; - index++; - } - - if (bestIndex >= 0) { - CefRefPtr result = CefV8Value::CreateObject(NULL); - result->SetValue("index", CefV8Value::CreateInt(bestIndex), V8_PROPERTY_ATTRIBUTE_NONE); - result->SetValue("captureIndices", CaptureIndicesForMatch(bestResult), V8_PROPERTY_ATTRIBUTE_NONE); - return result; - } else { - return CefV8Value::CreateNull(); - } - } - - void ClearCachedResults() { - maxCachedIndex = -1; - for (vector::iterator iter = cachedResults.begin(); iter < cachedResults.end(); iter++) { - [*iter release]; - *iter = NULL; - } - } - - CefRefPtr CaptureIndicesForMatch(OnigResult *result) { - CefRefPtr array = CefV8Value::CreateArray([result count] * 3); - int i = 0; - int resultCount = [result count]; - for (int index = 0; index < resultCount; index++) { - int captureLength = [result lengthAt:index]; - int captureStart = [result locationAt:index]; - - array->SetValue(i++, CefV8Value::CreateInt(index)); - array->SetValue(i++, CefV8Value::CreateInt(captureStart)); - array->SetValue(i++, CefV8Value::CreateInt(captureStart + captureLength)); - } - - return array; - } - - protected: - std::vector regExps; - std::string lastMatchedString; - std::vector cachedResults; - int maxCachedIndex; - int lastStartLocation; - - IMPLEMENT_REFCOUNTING(OnigRegexpUserData); -}; - -OnigScanner::OnigScanner() : CefV8Handler() { -} - -void OnigScanner::CreateContextBinding(CefRefPtr context) { - const char* methodNames[] = { "findNextMatch", "buildScanner" }; - - CefRefPtr nativeObject = CefV8Value::CreateObject(NULL); - int arrayLength = sizeof(methodNames) / sizeof(const char *); - for (int i = 0; i < arrayLength; i++) { - const char *functionName = methodNames[i]; - CefRefPtr function = CefV8Value::CreateFunction(functionName, this); - nativeObject->SetValue(functionName, function, V8_PROPERTY_ATTRIBUTE_NONE); - } - - CefRefPtr global = context->GetGlobal(); - global->SetValue("$onigScanner", nativeObject, V8_PROPERTY_ATTRIBUTE_NONE); -} - -bool OnigScanner::Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - @autoreleasepool { - if (name == "findNextMatch") { - OnigScannerUserData *userData = (OnigScannerUserData *)object->GetUserData().get(); - retval = userData->FindNextMatch(arguments[0], arguments[1]); - return true; - } - else if (name == "buildScanner") { - retval = CefV8Value::CreateObject(NULL); - retval->SetUserData(new OnigScannerUserData(arguments[0])); - return true; - } - - return false; - } -} - -} // namespace v8_extensions diff --git a/package.json b/package.json index 229724ffc..d8dabe22c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "dependencies": { "coffee-script": "1.5", "ctags": "0.1.0", - "oniguruma": "0.2.0" + "oniguruma": "0.3.0" }, "scripts": { diff --git a/spec/stdlib/onig-reg-exp-spec.coffee b/spec/stdlib/onig-reg-exp-spec.coffee index 7f43d47c7..b2d591b0f 100644 --- a/spec/stdlib/onig-reg-exp-spec.coffee +++ b/spec/stdlib/onig-reg-exp-spec.coffee @@ -1,15 +1,15 @@ -OnigRegExp = require 'onig-reg-exp' +{OnigRegExp} = nodeRequire 'oniguruma' describe "OnigRegExp", -> describe ".search(string, index)", -> it "returns an array of the match and all capture groups", -> - regex = OnigRegExp.create("\\w(\\d+)") + regex = new OnigRegExp("\\w(\\d+)") result = regex.search("----a123----") expect(result).toEqual ["a123", "123"] expect(result.index).toBe 4 expect(result.indices).toEqual [4, 5] it "returns null if it does not match", -> - regex = OnigRegExp.create("\\w(\\d+)") + regex = new OnigRegExp("\\w(\\d+)") result = regex.search("--------") expect(result).toBeNull() diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 848ae826f..80fcc301d 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -1,7 +1,7 @@ Range = require 'range' _ = require 'underscore' require 'underscore-extensions' -OnigRegExp = require 'onig-reg-exp' +{OnigRegExp} = nodeRequire 'oniguruma' module.exports = class LanguageMode @@ -30,13 +30,13 @@ class LanguageMode buffer = @editSession.buffer commentStartRegexString = _.escapeRegExp(commentStartString).replace(/(\s+)$/, '($1)?') - commentStartRegex = OnigRegExp.create("^(\\s*)(#{commentStartRegexString})") + commentStartRegex = new OnigRegExp("^(\\s*)(#{commentStartRegexString})") shouldUncomment = commentStartRegex.test(buffer.lineForRow(start)) if commentEndString = syntax.getProperty(scopes, "editor.commentEnd") if shouldUncomment commentEndRegexString = _.escapeRegExp(commentEndString).replace(/^(\s+)/, '($1)?') - commentEndRegex = OnigRegExp.create("(#{commentEndRegexString})(\\s*)$") + commentEndRegex = new OnigRegExp("(#{commentEndRegexString})(\\s*)$") startMatch = commentStartRegex.search(buffer.lineForRow(start)) endMatch = commentEndRegex.search(buffer.lineForRow(end)) if startMatch and endMatch @@ -152,12 +152,12 @@ class LanguageMode increaseIndentRegexForScopes: (scopes) -> if increaseIndentPattern = syntax.getProperty(scopes, 'editor.increaseIndentPattern') - OnigRegExp.create(increaseIndentPattern) + new OnigRegExp(increaseIndentPattern) decreaseIndentRegexForScopes: (scopes) -> if decreaseIndentPattern = syntax.getProperty(scopes, 'editor.decreaseIndentPattern') - OnigRegExp.create(decreaseIndentPattern) + new OnigRegExp(decreaseIndentPattern) foldEndRegexForScopes: (scopes) -> if foldEndPattern = syntax.getProperty(scopes, 'editor.foldEndPattern') - OnigRegExp.create(foldEndPattern) + new OnigRegExp(foldEndPattern) diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index 01acb2f77..9a9a78178 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -2,8 +2,7 @@ _ = require 'underscore' fs = require 'fs' plist = require 'plist' Token = require 'token' -OnigRegExp = require 'onig-reg-exp' -OnigScanner = require 'onig-scanner' +{OnigRegExp, OnigScanner} = nodeRequire 'oniguruma' module.exports = class TextMateGrammar @@ -28,7 +27,7 @@ class TextMateGrammar constructor: ({ @name, @fileTypes, @scopeName, patterns, repository, @foldingStopMarker, firstLineMatch}) -> @initialRule = new Rule(this, {@scopeName, patterns}) @repository = {} - @firstLineRegex = OnigRegExp.create(firstLineMatch) if firstLineMatch + @firstLineRegex = new OnigRegExp(firstLineMatch) if firstLineMatch @fileTypes ?= [] for name, data of repository @@ -111,7 +110,7 @@ class Rule regex = pattern.regexSource regexes.push regex if regex - regexScanner = OnigScanner.create(regexes) + regexScanner = new OnigScanner(regexes) regexScanner.patterns = patterns @scannersByBaseGrammarName[baseGrammar.name] = regexScanner unless anchored regexScanner diff --git a/src/stdlib/onig-reg-exp.coffee b/src/stdlib/onig-reg-exp.coffee deleted file mode 100644 index db7fa4632..000000000 --- a/src/stdlib/onig-reg-exp.coffee +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = -class OnigRegExp - @create: (source) -> - regexp = $onigRegExp.buildOnigRegExp(source); - regexp.constructor = OnigRegExp - regexp.__proto__ = OnigRegExp.prototype - regexp.source = source - regexp - - search: $onigRegExp.search - test: $onigRegExp.test diff --git a/src/stdlib/onig-scanner.coffee b/src/stdlib/onig-scanner.coffee deleted file mode 100644 index 80c457c2f..000000000 --- a/src/stdlib/onig-scanner.coffee +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = -class OnigScanner - @create: (sources) -> - scanner = $onigScanner.buildScanner(sources) - scanner.constructor = OnigScanner - scanner.__proto__ = OnigScanner.prototype - scanner.sources = sources - scanner - - findNextMatch: $onigScanner.findNextMatch From d59ae44914b5d13568e4ed33f30871bb38c6482b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 15:07:29 -0800 Subject: [PATCH 010/281] Upgrade oniguruma dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d8dabe22c..940117789 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "dependencies": { "coffee-script": "1.5", "ctags": "0.1.0", - "oniguruma": "0.3.0" + "oniguruma": "0.4.0" }, "scripts": { From 0b33c6473e8ba42b4912632d92f43ff0f9bc8468 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 15:58:30 -0800 Subject: [PATCH 011/281] Use child_process.spawn for ctags command --- .../symbols-view/lib/symbols-view.coffee | 4 +-- .../symbols-view/lib/tag-generator.coffee | 30 +++++++++++-------- .../spec/symbols-view-spec.coffee | 23 +++++++------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/packages/symbols-view/lib/symbols-view.coffee b/src/packages/symbols-view/lib/symbols-view.coffee index 10f347b66..4d5bbb5df 100644 --- a/src/packages/symbols-view/lib/symbols-view.coffee +++ b/src/packages/symbols-view/lib/symbols-view.coffee @@ -41,12 +41,10 @@ class SymbolsView extends SelectList @attach() populateFileSymbols: -> - tags = [] - callback = (tag) -> tags.push tag path = rootView.getActiveView().getPath() @list.empty() @setLoading("Generating symbols...") - new TagGenerator(path, callback).generate().done => + new TagGenerator(path).generate().done (tags) => if tags.length > 0 @miniEditor.show() @maxItem = Infinity diff --git a/src/packages/symbols-view/lib/tag-generator.coffee b/src/packages/symbols-view/lib/tag-generator.coffee index 7517d4dea..7a74de00f 100644 --- a/src/packages/symbols-view/lib/tag-generator.coffee +++ b/src/packages/symbols-view/lib/tag-generator.coffee @@ -1,10 +1,10 @@ Point = require 'point' -ChildProcess = require 'child-process' +ChildProcess = nodeRequire 'child_process' +$ = require 'jquery' module.exports = class TagGenerator - - constructor: (@path, @callback) -> + constructor: (@path) -> parseTagLine: (line) -> sections = line.split('\t') @@ -15,12 +15,18 @@ class TagGenerator null generate: -> - options = - bufferLines: true - stdout: (data) => - lines = data.split('\n') - for line in lines - tag = @parseTagLine(line) - @callback(tag) if tag - command = "#{require.resolve('ctags')} --fields=+KS -nf - #{@path}" - ChildProcess.exec(command, options) + command = "#{require.resolve('ctags')}" + args = ["--fields=+KS", "-nf", "-", "#{@path}"] + ctags = ChildProcess.spawn(command, args) + deferred = $.Deferred() + output = '' + ctags.stdout.setEncoding('utf8') + ctags.stdout.on 'data', (data) -> + output += data + ctags.stdout.on 'close', => + tags = [] + for line in output.split('\n') + tag = @parseTagLine(line) + tags.push(tag) if tag + deferred.resolve(tags) + deferred diff --git a/src/packages/symbols-view/spec/symbols-view-spec.coffee b/src/packages/symbols-view/spec/symbols-view-spec.coffee index 30d9f69be..b988d61c8 100644 --- a/src/packages/symbols-view/spec/symbols-view-spec.coffee +++ b/src/packages/symbols-view/spec/symbols-view-spec.coffee @@ -83,13 +83,12 @@ describe "SymbolsView", -> it "moves the cursor to the selected function", -> tags = [] + waitsForPromise -> - tags = [] path = require.resolve('fixtures/sample.js') - callback = (tag) -> - tags.push tag - generator = new TagGenerator(path, callback) - generator.generate() + generator = new TagGenerator(path) + generator.generate().done (generatedTags) -> + tags = generatedTags runs -> rootView.open('sample.js') @@ -108,10 +107,9 @@ describe "SymbolsView", -> waitsForPromise -> path = require.resolve('fixtures/sample.js') - callback = (tag) -> - tags.push tag - generator = new TagGenerator(path, callback) - generator.generate() + generator = new TagGenerator(path) + generator.generate().done (generatedTags) -> + tags = generatedTags runs -> expect(tags.length).toBe 2 @@ -125,10 +123,9 @@ describe "SymbolsView", -> waitsForPromise -> path = require.resolve('fixtures/sample.txt') - callback = (tag) -> - tags.push tag - generator = new TagGenerator(path, callback) - generator.generate() + generator = new TagGenerator(path) + generator.generate().done (generatedTags) -> + tags = generatedTags runs -> expect(tags.length).toBe 0 From beb0754faaffc0f97f2b747d3f2e7170713c7841 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 16:06:37 -0800 Subject: [PATCH 012/281] Use child_process.exec to chmod atom cli --- src/app/window.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/window.coffee b/src/app/window.coffee index 321a60f56..10e7fbf8f 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -1,6 +1,6 @@ fs = require 'fs' $ = require 'jquery' -ChildProcess = require 'child-process' +ChildProcess = nodeRequire 'child_process' require 'jquery-extensions' require 'underscore-extensions' require 'space-pen-extensions' From f3c2b41f4f7088715216ccb895f634d02186fab0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 16:11:00 -0800 Subject: [PATCH 013/281] :lipstick: --- src/packages/symbols-view/lib/tag-generator.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/symbols-view/lib/tag-generator.coffee b/src/packages/symbols-view/lib/tag-generator.coffee index 7a74de00f..a5543bc3b 100644 --- a/src/packages/symbols-view/lib/tag-generator.coffee +++ b/src/packages/symbols-view/lib/tag-generator.coffee @@ -16,7 +16,7 @@ class TagGenerator generate: -> command = "#{require.resolve('ctags')}" - args = ["--fields=+KS", "-nf", "-", "#{@path}"] + args = ['--fields=+KS', '-nf', '-', @path] ctags = ChildProcess.spawn(command, args) deferred = $.Deferred() output = '' From 01faf6ea1ea760b75da25736c87572a4ed4ab50c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 16:58:09 -0800 Subject: [PATCH 014/281] Create helper to buffer process lines --- .../symbols-view/lib/tag-generator.coffee | 16 +++---- src/stdlib/buffered-process.coffee | 46 +++++++++++++++++++ 2 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/stdlib/buffered-process.coffee diff --git a/src/packages/symbols-view/lib/tag-generator.coffee b/src/packages/symbols-view/lib/tag-generator.coffee index a5543bc3b..8367e74d6 100644 --- a/src/packages/symbols-view/lib/tag-generator.coffee +++ b/src/packages/symbols-view/lib/tag-generator.coffee @@ -1,6 +1,7 @@ Point = require 'point' ChildProcess = nodeRequire 'child_process' $ = require 'jquery' +BufferedProcess = require 'buffered-process' module.exports = class TagGenerator @@ -15,18 +16,15 @@ class TagGenerator null generate: -> + deferred = $.Deferred() + tags = [] command = "#{require.resolve('ctags')}" args = ['--fields=+KS', '-nf', '-', @path] - ctags = ChildProcess.spawn(command, args) - deferred = $.Deferred() - output = '' - ctags.stdout.setEncoding('utf8') - ctags.stdout.on 'data', (data) -> - output += data - ctags.stdout.on 'close', => - tags = [] - for line in output.split('\n') + stdout = (lines) => + for line in lines.split('\n') tag = @parseTagLine(line) tags.push(tag) if tag + exit = -> deferred.resolve(tags) + new BufferedProcess({command, args, stdout, exit}) deferred diff --git a/src/stdlib/buffered-process.coffee b/src/stdlib/buffered-process.coffee new file mode 100644 index 000000000..2c325192c --- /dev/null +++ b/src/stdlib/buffered-process.coffee @@ -0,0 +1,46 @@ +ChildProcess = nodeRequire 'child_process' + +module.exports = +class BufferedProcess + constructor: (options={}) -> + process = ChildProcess.spawn(options.command, options.args) + + stdoutClosed = true + stderrClosed = true + processExited = true + triggerExitCallback = -> + if stdoutClosed and stderrClosed and processExited + options.exit?() + + if options.stdout + stdoutClosed = false + @bufferStream process.stdout, options.stdout, -> + stdoutClosed = true + triggerExitCallback() + + if options.stderr + stderrClosed = false + @bufferStream process.stderr, options.stderr, -> + stderrClosed = true + triggerExitCallback() + + if options.exit + processExited = false + process.on 'exit', -> + processExited = true + triggerExitCallback() + + bufferStream: (stream, onLines, onDone) -> + stream.setEncoding('utf8') + buffered = '' + + stream.on 'data', (data) -> + buffered += data + lastNewlineIndex = buffered.lastIndexOf('\n') + if lastNewlineIndex isnt -1 + onLines(buffered.substring(0, lastNewlineIndex + 1)) + buffered = buffered.substring(lastNewlineIndex + 1) + + stream.on 'close', => + onLines(buffered) if buffered.length > 0 + onDone() From 689088c1a87d7929e2f996fc4274a344160e8473 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:01:00 -0800 Subject: [PATCH 015/281] Report exit status to callback --- src/stdlib/buffered-process.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/stdlib/buffered-process.coffee b/src/stdlib/buffered-process.coffee index 2c325192c..1de85b5e9 100644 --- a/src/stdlib/buffered-process.coffee +++ b/src/stdlib/buffered-process.coffee @@ -8,9 +8,10 @@ class BufferedProcess stdoutClosed = true stderrClosed = true processExited = true + exitCode = 0 triggerExitCallback = -> if stdoutClosed and stderrClosed and processExited - options.exit?() + options.exit?(exitCode) if options.stdout stdoutClosed = false @@ -26,7 +27,8 @@ class BufferedProcess if options.exit processExited = false - process.on 'exit', -> + process.on 'exit', (code) -> + exitCode = code processExited = true triggerExitCallback() From 7cfdf0ad9ccbf8bb78761e39407ce5454ed32112 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:07:05 -0800 Subject: [PATCH 016/281] :lipstick: --- src/packages/symbols-view/lib/tag-generator.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/symbols-view/lib/tag-generator.coffee b/src/packages/symbols-view/lib/tag-generator.coffee index 8367e74d6..bf5a4025f 100644 --- a/src/packages/symbols-view/lib/tag-generator.coffee +++ b/src/packages/symbols-view/lib/tag-generator.coffee @@ -18,7 +18,7 @@ class TagGenerator generate: -> deferred = $.Deferred() tags = [] - command = "#{require.resolve('ctags')}" + command = require.resolve('ctags') args = ['--fields=+KS', '-nf', '-', @path] stdout = (lines) => for line in lines.split('\n') From eddfb8a1bb49e167629d67f9dd859893d6925f35 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:08:26 -0800 Subject: [PATCH 017/281] Remove unused import --- src/packages/symbols-view/lib/tag-generator.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/packages/symbols-view/lib/tag-generator.coffee b/src/packages/symbols-view/lib/tag-generator.coffee index bf5a4025f..e2aca4995 100644 --- a/src/packages/symbols-view/lib/tag-generator.coffee +++ b/src/packages/symbols-view/lib/tag-generator.coffee @@ -1,5 +1,4 @@ Point = require 'point' -ChildProcess = nodeRequire 'child_process' $ = require 'jquery' BufferedProcess = require 'buffered-process' From c22d14c5b09858b989f11742ef9aa5dbf127c837 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:36:21 -0800 Subject: [PATCH 018/281] Use child_process.spawn from Project.scan --- spec/app/project-spec.coffee | 5 +++-- src/app/project.coffee | 17 +++++++++++++---- src/stdlib/buffered-process.coffee | 16 ++++++++-------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index 136e61a85..4cc2fda5c 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -1,6 +1,7 @@ Project = require 'project' fs = require 'fs' _ = require 'underscore' +BufferedProcess = require 'buffered-process' describe "Project", -> beforeEach -> @@ -239,12 +240,12 @@ describe "Project", -> expect(fs.base(paths[4])).toBe "utfa\u0306.md" it "handles breaks in the search subprocess's output following the filename", -> - spyOn $native, 'exec' + spyOn(BufferedProcess.prototype, 'bufferStream') iterator = jasmine.createSpy('iterator') project.scan /a+/, iterator - stdout = $native.exec.argsForCall[0][1].stdout + stdout = BufferedProcess.prototype.bufferStream.argsForCall[0][1] stdout ":#{require.resolve('fixtures/dir/a')}\n" stdout "1;0 3:aaa bbb\n2;3 2:cc aa cc\n" diff --git a/src/app/project.coffee b/src/app/project.coffee index fac99ce8d..1bba35f43 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -6,7 +6,7 @@ Buffer = require 'buffer' EditSession = require 'edit-session' EventEmitter = require 'event-emitter' Directory = require 'directory' -ChildProcess = require 'child-process' +BufferedProcess = require 'buffered-process' module.exports = class Project @@ -159,9 +159,7 @@ class Project _.remove(@buffers, buffer) scan: (regex, iterator) -> - command = "#{require.resolve('ag')} --ackmate '#{regex.source}' '#{@getPath()}'" bufferedData = "" - state = 'readingPath' path = null @@ -193,11 +191,22 @@ class Project match = lineText.substr(column, length) iterator({path, range, match}) - ChildProcess.exec command , bufferLines: true, stdout: (data) -> + deferred = $.Deferred() + exit = (code) -> + if code is -1 + deferred.reject({command, code}) + else + deferred.resolve() + stdout = (data) -> lines = data.split('\n') lines.pop() # the last segment is a spurious '' because data always ends in \n due to bufferLines: true for line in lines readPath(line) if state is 'readingPath' readLine(line) if state is 'readingLines' + command = require.resolve('ag') + args = ['--ackmate', regex.source, @getPath()] + new BufferedProcess({command, args, stdout, exit}) + deferred + _.extend Project.prototype, EventEmitter diff --git a/src/stdlib/buffered-process.coffee b/src/stdlib/buffered-process.coffee index 1de85b5e9..1781662f0 100644 --- a/src/stdlib/buffered-process.coffee +++ b/src/stdlib/buffered-process.coffee @@ -2,8 +2,8 @@ ChildProcess = nodeRequire 'child_process' module.exports = class BufferedProcess - constructor: (options={}) -> - process = ChildProcess.spawn(options.command, options.args) + constructor: ({command, args, options, stdout, stderr, exit}={}) -> + process = ChildProcess.spawn(command, args, options) stdoutClosed = true stderrClosed = true @@ -11,21 +11,21 @@ class BufferedProcess exitCode = 0 triggerExitCallback = -> if stdoutClosed and stderrClosed and processExited - options.exit?(exitCode) + exit?(exitCode) - if options.stdout + if stdout stdoutClosed = false - @bufferStream process.stdout, options.stdout, -> + @bufferStream process.stdout, stdout, -> stdoutClosed = true triggerExitCallback() - if options.stderr + if stderr stderrClosed = false - @bufferStream process.stderr, options.stderr, -> + @bufferStream process.stderr, stderr, -> stderrClosed = true triggerExitCallback() - if options.exit + if exit processExited = false process.on 'exit', (code) -> exitCode = code From ce8867fac9cf0d57261930b8ef4e5d537bc824b1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:40:24 -0800 Subject: [PATCH 019/281] Remove unused ChildProcess class --- spec/stdlib/child-process-spec.coffee | 144 -------------------------- src/stdlib/child-process.coffee | 37 ------- 2 files changed, 181 deletions(-) delete mode 100644 spec/stdlib/child-process-spec.coffee delete mode 100644 src/stdlib/child-process.coffee diff --git a/spec/stdlib/child-process-spec.coffee b/spec/stdlib/child-process-spec.coffee deleted file mode 100644 index e594d2b7f..000000000 --- a/spec/stdlib/child-process-spec.coffee +++ /dev/null @@ -1,144 +0,0 @@ -ChildProcess = require 'child-process' - -describe 'Child Processes', -> - describe ".exec(command, options)", -> - [stderrHandler, stdoutHandler] = [] - - beforeEach -> - stderrHandler = jasmine.createSpy "stderrHandler" - stdoutHandler = jasmine.createSpy "stdoutHandler" - - it "returns a promise that resolves to stdout and stderr", -> - waitsForPromise -> - cmd = "echo 'good' && echo 'bad' >&2" - standardOutput = '' - errorOutput = '' - options = - stdout: (data) -> - standardOutput += data - stderr: (data) -> - errorOutput += data - - ChildProcess.exec(cmd, options).done -> - expect(standardOutput).toBe 'good\n' - expect(errorOutput).toBe 'bad\n' - - describe "when options are given", -> - it "calls the options.stdout callback when new data is received on stdout", -> - cmd = "echo 'first' && sleep .1 && echo 'second' && sleep .1 && echo 'third'" - ChildProcess.exec(cmd, stdout: stdoutHandler) - - waitsFor -> - stdoutHandler.callCount > 2 - - runs -> - expect(stdoutHandler.argsForCall[0][0]).toBe "first\n" - expect(stdoutHandler.argsForCall[1][0]).toBe "second\n" - expect(stdoutHandler.argsForCall[2][0]).toBe "third\n" - - it "calls the options.stderr callback when new data is received on stderr", -> - cmd = "echo '1111' >&2 && sleep .1 && echo '2222' >&2" - ChildProcess.exec(cmd, stderr: stderrHandler) - - waitsFor -> - stderrHandler.callCount > 1 - - runs -> - expect(stderrHandler.argsForCall[0][0]).toBe "1111\n" - expect(stderrHandler.argsForCall[1][0]).toBe "2222\n" - - describe "when the `bufferLines` option is true ", -> - [simulateStdout, simulateStderr] = [] - - beforeEach -> - spyOn($native, 'exec') - ChildProcess.exec("print_the_things", bufferLines: true, stdout: stdoutHandler, stderr: stderrHandler) - { stdout, stderr } = $native.exec.argsForCall[0][1] - simulateStdout = stdout - simulateStderr = stderr - - it "only triggers stdout callbacks with complete lines", -> - simulateStdout """ - I am a full line - I am part of """ - - expect(stdoutHandler).toHaveBeenCalledWith("I am a full line\n") - stdoutHandler.reset() - - simulateStdout """ - a line - I am another full line\n - """ - - expect(stdoutHandler).toHaveBeenCalledWith """ - I am part of a line - I am another full line\n - """ - - it "only triggers stderr callbacks with complete lines", -> - simulateStderr """ - I am a full line - I am part of """ - - expect(stderrHandler).toHaveBeenCalledWith("I am a full line\n") - stdoutHandler.reset() - - simulateStderr """ - a line - I am another full line\n - """ - - expect(stderrHandler).toHaveBeenCalledWith """ - I am part of a line - I am another full line\n - """ - - describe "when the command fails", -> - it "executes the callback with error set to the exit status", -> - waitsForPromise shouldReject: true, -> - cmd = "echo 'bad' >&2 && exit 2" - errorOutput = '' - options = - stderr: (data) -> - errorOutput += data - ChildProcess.exec(cmd, options).fail (error) -> - expect(error.exitStatus).toBe 2 - expect(errorOutput).toBe "bad\n" - - describe "when a command returns a large amount of data (over 10k)", -> - originalTimeout = null - beforeEach -> - originalTimeout = jasmine.getEnv().defaultTimeoutInterval - jasmine.getEnv().defaultTimeoutInterval = 1000 - - afterEach -> - jasmine.getEnv().defaultTimeoutInterval = originalTimeout - - it "does not block indefinitely on stdout or stderr callbacks (regression)", -> - output = [] - - waitsForPromise -> - cmd = "for i in {1..20000}; do echo $RANDOM; done" - options = - stdout: (data) -> output.push(data) - stderr: (data) -> - - ChildProcess.exec(cmd, options) - - runs -> - expect(output.length).toBeGreaterThan 1 - - describe "when the cwd option is set", -> - it "runs the task from the specified current working directory", -> - output = [] - - waitsForPromise -> - options = - cwd: "/Applications" - stdout: (data) -> output.push(data) - stderr: (data) -> - - ChildProcess.exec("pwd", options) - - runs -> - expect(output.join('')).toBe "/Applications\n" diff --git a/src/stdlib/child-process.coffee b/src/stdlib/child-process.coffee deleted file mode 100644 index a9228c55c..000000000 --- a/src/stdlib/child-process.coffee +++ /dev/null @@ -1,37 +0,0 @@ -# node.js child-process -# http://nodejs.org/docs/v0.6.3/api/child_processes.html - -$ = require 'jquery' -_ = require 'underscore' - -module.exports = -class ChildProccess - @exec: (command, options={}) -> - deferred = $.Deferred() - - if options.bufferLines - options.stdout = @bufferLines(options.stdout) if options.stdout - options.stderr = @bufferLines(options.stderr) if options.stderr - - $native.exec command, options, (exitStatus, stdout, stderr) -> - options.stdout?(stdout) - options.stderr?(stderr) - try - if exitStatus != 0 - deferred.reject({command, exitStatus}) - else - deferred.resolve() - catch e - console.error "In ChildProccess termination callback: ", e.message - console.error e.stack - - deferred - - @bufferLines: (callback) -> - buffered = "" - (data) -> - buffered += data - lastNewlineIndex = buffered.lastIndexOf('\n') - if lastNewlineIndex >= 0 - callback(buffered.substring(0, lastNewlineIndex + 1)) - buffered = buffered.substring(lastNewlineIndex + 1) From 53b3fbfed6e94388d3afd01168289cc17bde5e1b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:40:47 -0800 Subject: [PATCH 020/281] Remove $native.exec --- native/v8_extensions/native.mm | 106 +-------------------------------- 1 file changed, 1 insertion(+), 105 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 21f7e6c3a..570b52a57 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -27,7 +27,7 @@ namespace v8_extensions { "exists", "read", "write", "absolute", "getAllFilePathsAsync", "traverseTree", "isDirectory", "isFile", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "lastModified", - "md5ForPath", "exec", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", + "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -400,110 +400,6 @@ namespace v8_extensions { retval = CefV8Value::CreateString([hash UTF8String]); return true; } - else if (name == "exec") { - NSString *command = stringFromCefV8Value(arguments[0]); - CefRefPtr options = arguments[1]; - CefRefPtr callback = arguments[2]; - - NSTask *task = [[NSTask alloc] init]; - [task setLaunchPath:@"/bin/sh"]; - [task setStandardInput:[NSFileHandle fileHandleWithNullDevice]]; - [task setArguments:[NSArray arrayWithObjects:@"-l", @"-c", command, nil]]; - - NSPipe *stdout = [NSPipe pipe]; - NSPipe *stderr = [NSPipe pipe]; - [task setStandardOutput:stdout]; - [task setStandardError:stderr]; - - CefRefPtr context = CefV8Context::GetCurrentContext(); - void (^outputHandle)(NSString *contents, CefRefPtr function) = nil; - void (^taskTerminatedHandle)(NSString *output, NSString *errorOutput) = nil; - - outputHandle = ^(NSString *contents, CefRefPtr function) { - context->Enter(); - - CefV8ValueList args; - args.push_back(CefV8Value::CreateString(std::string([contents UTF8String], [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding]))); - CefRefPtr retval = function->ExecuteFunction(function, args); - - if (function->HasException()) { - throwException(context->GetGlobal(), function->GetException(), @"Error thrown in OutputHandle"); - } - - context->Exit(); - }; - - taskTerminatedHandle = ^(NSString *output, NSString *errorOutput) { - context->Enter(); - - CefV8ValueList args; - args.push_back(CefV8Value::CreateInt([task terminationStatus])); - args.push_back(CefV8Value::CreateString([output UTF8String])); - args.push_back(CefV8Value::CreateString([errorOutput UTF8String])); - - callback->ExecuteFunction(callback, args); - - if (callback->HasException()) { - throwException(context->GetGlobal(), callback->GetException(), @"Error thrown in TaskTerminatedHandle"); - } - - context->Exit(); - - stdout.fileHandleForReading.readabilityHandler = nil; - stderr.fileHandleForReading.readabilityHandler = nil; - }; - - task.terminationHandler = ^(NSTask *) { - @synchronized(task) { - NSData *outputData = [[stdout fileHandleForReading] readDataToEndOfFile]; - NSString *output = [[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding]; - NSData *errorData = [[stderr fileHandleForReading] readDataToEndOfFile]; - NSString *errorOutput = [[NSString alloc] initWithData:errorData encoding:NSUTF8StringEncoding]; - dispatch_sync(dispatch_get_main_queue(), ^() { - taskTerminatedHandle(output, errorOutput); - }); - [output release]; - [errorOutput release]; - } - }; - - CefRefPtr stdoutFunction = options->GetValue("stdout"); - if (stdoutFunction->IsFunction()) { - stdout.fileHandleForReading.readabilityHandler = ^(NSFileHandle *fileHandle) { - @synchronized(task) { - NSData *data = [fileHandle availableData]; - NSString *contents = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - dispatch_sync(dispatch_get_main_queue(), ^() { - outputHandle(contents, stdoutFunction); - }); - [contents release]; - } - }; - } - - CefRefPtr stderrFunction = options->GetValue("stderr"); - if (stderrFunction->IsFunction()) { - stderr.fileHandleForReading.readabilityHandler = ^(NSFileHandle *fileHandle) { - @synchronized(task) { - NSData *data = [fileHandle availableData]; - NSString *contents = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - dispatch_sync(dispatch_get_main_queue(), ^() { - outputHandle(contents, stderrFunction); - }); - [contents release]; - } - }; - } - - CefRefPtr currentWorkingDirectory = options->GetValue("cwd"); - if (!currentWorkingDirectory->IsUndefined() && !currentWorkingDirectory->IsNull()) { - [task setCurrentDirectoryPath:stringFromCefV8Value(currentWorkingDirectory)]; - } - - [task launch]; - - return true; - } else if (name == "getPlatform") { retval = CefV8Value::CreateString("mac"); return true; From acf5f4ce5ee883307578a71a0974a3559995967e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:48:34 -0800 Subject: [PATCH 021/281] Remove fs/$native.getAllFilePathsAsync() This was previously only used by project.getFilePath() which should have been using fs.traverseTree() instead. --- native/v8_extensions/native.mm | 53 +--------------------------------- spec/app/project-spec.coffee | 2 +- src/app/project.coffee | 8 +++-- src/stdlib/fs.coffee | 3 -- 4 files changed, 7 insertions(+), 59 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 570b52a57..25d2ebf6b 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -24,7 +24,7 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "exists", "read", "write", "absolute", "getAllFilePathsAsync", "traverseTree", "isDirectory", + "exists", "read", "write", "absolute", "traverseTree", "isDirectory", "isFile", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "lastModified", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", @@ -113,57 +113,6 @@ namespace v8_extensions { return true; } - else if (name == "getAllFilePathsAsync") { - std::string argument = arguments[0]->GetStringValue().ToString(); - CefRefPtr callback = arguments[1]; - CefRefPtr context = CefV8Context::GetCurrentContext(); - - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(queue, ^{ - int rootPathLength = argument.size() + 1; - char rootPath[rootPathLength]; - strcpy(rootPath, argument.c_str()); - char * const treePaths[] = {rootPath, NULL}; - - FTS *tree = fts_open(treePaths, FTS_COMFOLLOW | FTS_PHYSICAL| FTS_NOCHDIR | FTS_NOSTAT, NULL); - std::vector paths; - - if (tree != NULL) { - FTSENT *entry; - int arrayIndex = 0; - while ((entry = fts_read(tree)) != NULL) { - if (entry->fts_level == 0) { - continue; - } - - bool isFile = entry->fts_info == FTS_NSOK; - if (!isFile) { - continue; - } - - int pathLength = entry->fts_pathlen - rootPathLength; - char relative[pathLength + 1]; - relative[pathLength] = '\0'; - strncpy(relative, entry->fts_path + rootPathLength, pathLength); - paths.push_back(relative); - } - } - - dispatch_queue_t mainQueue = dispatch_get_main_queue(); - dispatch_async(mainQueue, ^{ - context->Enter(); - CefRefPtr v8Paths = CefV8Value::CreateArray(paths.size()); - for (int i = 0; i < paths.size(); i++) { - v8Paths->SetValue(i, CefV8Value::CreateString(paths[i])); - } - CefV8ValueList callbackArgs; - callbackArgs.push_back(v8Paths); - callback->ExecuteFunction(callback, callbackArgs); - context->Exit(); - }); - }); - return true; - } else if (name == "traverseTree") { std::string argument = arguments[0]->GetStringValue().ToString(); int rootPathLength = argument.size() + 1; diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index 4cc2fda5c..e12a4f093 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -118,7 +118,7 @@ describe "Project", -> expect(project.getRootDirectory()?).toBeFalsy() describe ".getFilePaths()", -> - it "asynchronously returns file paths using a promise", -> + it "returns file paths using a promise", -> paths = null waitsForPromise -> project.getFilePaths().done (foundPaths) -> paths = foundPaths diff --git a/src/app/project.coffee b/src/app/project.coffee index 1bba35f43..45dbdb104 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -67,9 +67,11 @@ class Project getFilePaths: -> deferred = $.Deferred() - fs.getAllFilePathsAsync @getPath(), (paths) => - paths = paths.filter (path) => not @isPathIgnored(path) - deferred.resolve(paths) + paths = [] + onFile = (path) => paths.push(path) unless @isPathIgnored(path) + onDirectory = -> true + fs.traverseTree(@getPath(), onFile, onDirectory) + deferred.resolve(paths) deferred.promise() isPathIgnored: (path) -> diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 5f0a7752d..e36212e66 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -117,9 +117,6 @@ module.exports = @makeTree(@directory(path)) @makeDirectory(path) - getAllFilePathsAsync: (rootPath, callback) -> - $native.getAllFilePathsAsync(rootPath, callback) - traverseTree: (rootPath, onFile, onDirectory) -> return unless nodeFs.existsSync(rootPath) and nodeFs.statSync(rootPath).isDirectory() From fe172985bbbbdecd33c2a0237dbc8fd12a6dc034 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:50:12 -0800 Subject: [PATCH 022/281] Remove unused $native.traverseTree() --- native/v8_extensions/native.mm | 48 +--------------------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 25d2ebf6b..c1df19b42 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -24,7 +24,7 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "exists", "read", "write", "absolute", "traverseTree", "isDirectory", + "exists", "read", "write", "absolute", "isDirectory", "isFile", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "lastModified", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", @@ -113,52 +113,6 @@ namespace v8_extensions { return true; } - else if (name == "traverseTree") { - std::string argument = arguments[0]->GetStringValue().ToString(); - int rootPathLength = argument.size() + 1; - char rootPath[rootPathLength]; - strcpy(rootPath, argument.c_str()); - char * const paths[] = {rootPath, NULL}; - - FTS *tree = fts_open(paths, FTS_COMFOLLOW | FTS_PHYSICAL| FTS_NOCHDIR | FTS_NOSTAT, NULL); - if (tree == NULL) { - return true; - } - - CefRefPtr onFile = arguments[1]; - CefRefPtr onDir = arguments[2]; - CefV8ValueList args; - FTSENT *entry; - while ((entry = fts_read(tree)) != NULL) { - if (entry->fts_level == 0) { - continue; - } - - bool isFile = entry->fts_info == FTS_NSOK; - bool isDir = entry->fts_info == FTS_D; - if (!isFile && !isDir) { - continue; - } - - int pathLength = entry->fts_pathlen - rootPathLength; - char relative[pathLength + 1]; - relative[pathLength] = '\0'; - strncpy(relative, entry->fts_path + rootPathLength, pathLength); - args.clear(); - args.push_back(CefV8Value::CreateString(relative)); - if (isFile) { - onFile->ExecuteFunction(onFile, args); - } - else { - CefRefPtr enterDir = onDir->ExecuteFunction(onDir, args); - if(enterDir != NULL && !enterDir->GetBoolValue()) { - fts_set(tree, entry, FTS_SKIP); - } - } - } - - return true; - } else if (name == "isDirectory") { NSString *path = stringFromCefV8Value(arguments[0]); From 4bc513a8e3148564c566f8699a6f4e5ea2d2a842 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:55:13 -0800 Subject: [PATCH 023/281] Remove $native.isFile() and $native.isDirectory --- native/v8_extensions/native.mm | 22 ++-------------------- src/stdlib/fs.coffee | 7 +++---- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index c1df19b42..5ba1e6fe2 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -24,8 +24,8 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "exists", "read", "write", "absolute", "isDirectory", - "isFile", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", + "exists", "read", "write", "absolute", + "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "lastModified", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" @@ -113,24 +113,6 @@ namespace v8_extensions { return true; } - else if (name == "isDirectory") { - NSString *path = stringFromCefV8Value(arguments[0]); - - BOOL isDir = false; - BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]; - retval = CefV8Value::CreateBool(exists && isDir); - - return true; - } - else if (name == "isFile") { - NSString *path = stringFromCefV8Value(arguments[0]); - - BOOL isDir = false; - BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]; - retval = CefV8Value::CreateBool(exists && !isDir); - - return true; - } else if (name == "remove") { NSString *path = stringFromCefV8Value(arguments[0]); diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index e36212e66..be2951ef8 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -50,13 +50,12 @@ module.exports = # Returns true if the file specified by path exists and is a # directory. isDirectory: (path) -> - $native.isDirectory path + path? and nodeFs.existsSync(path) and nodeFs.statSync(path).isDirectory() # Returns true if the file specified by path exists and is a # regular file. isFile: (path) -> - return false unless path? - $native.isFile(path) + path? and nodeFs.existsSync(path) and nodeFs.statSync(path).isFile() # Returns an array with all the names of files contained # in the directory path. @@ -118,7 +117,7 @@ module.exports = @makeDirectory(path) traverseTree: (rootPath, onFile, onDirectory) -> - return unless nodeFs.existsSync(rootPath) and nodeFs.statSync(rootPath).isDirectory() + return unless @isDirectory(rootPath) traverse = (rootPath, prefix, onFile, onDirectory) => prefix = "#{prefix}/" if prefix From fedf43ca0a33fa55aba70976f864122365a37463 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 17:57:28 -0800 Subject: [PATCH 024/281] Remove $native.exists() --- native/v8_extensions/native.mm | 11 ++--------- src/stdlib/fs.coffee | 7 +++---- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 5ba1e6fe2..63f520d1f 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -24,7 +24,7 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "exists", "read", "write", "absolute", + "read", "write", "absolute", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "lastModified", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", @@ -49,14 +49,7 @@ namespace v8_extensions { CefRefPtr& retval, CefString& exception) { @autoreleasepool { - if (name == "exists") { - std::string cc_value = arguments[0]->GetStringValue().ToString(); - const char *path = cc_value.c_str(); - retval = CefV8Value::CreateBool(access(path, F_OK) == 0); - - return true; - } - else if (name == "read") { + if (name == "read") { NSString *path = stringFromCefV8Value(arguments[0]); NSError *error = nil; diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index be2951ef8..657193d76 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -27,8 +27,7 @@ module.exports = # Returns true if the file specified by path exists exists: (path) -> - return false unless path? - $native.exists(path) + path? and nodeFs.existsSync(path) # Returns the extension of a file. The extension of a file is the # last dot (excluding any number of initial dots) followed by one or @@ -50,12 +49,12 @@ module.exports = # Returns true if the file specified by path exists and is a # directory. isDirectory: (path) -> - path? and nodeFs.existsSync(path) and nodeFs.statSync(path).isDirectory() + @exists(path) and nodeFs.statSync(path).isDirectory() # Returns true if the file specified by path exists and is a # regular file. isFile: (path) -> - path? and nodeFs.existsSync(path) and nodeFs.statSync(path).isFile() + @exists(path) and nodeFs.statSync(path).isFile() # Returns an array with all the names of files contained # in the directory path. From e7050b2083bc9a77ee75e3557f2a128abafe9288 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:00:35 -0800 Subject: [PATCH 025/281] Remove unused $native.lastModified() --- native/v8_extensions/native.mm | 17 +---------------- spec/stdlib/fs-spec.coffee | 8 -------- src/stdlib/fs.coffee | 3 --- 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 63f520d1f..13c29f5cd 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -26,7 +26,7 @@ namespace v8_extensions { const char* methodNames[] = { "read", "write", "absolute", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", - "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "lastModified", + "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -246,21 +246,6 @@ namespace v8_extensions { else if (name == "reload") { CefV8Context::GetCurrentContext()->GetBrowser()->ReloadIgnoreCache(); } - else if (name == "lastModified") { - NSString *path = stringFromCefV8Value(arguments[0]); - NSFileManager *fm = [NSFileManager defaultManager]; - - NSError *error = nil; - NSDictionary *attributes = [fm attributesOfItemAtPath:path error:&error]; - - if (error) { - exception = [[error localizedDescription] UTF8String]; - } - - NSDate *lastModified = [attributes objectForKey:NSFileModificationDate]; - retval = CefV8Value::CreateDate(CefTime([lastModified timeIntervalSince1970])); - return true; - } else if (name == "md5ForPath") { NSString *path = stringFromCefV8Value(arguments[0]); unsigned char outputData[CC_MD5_DIGEST_LENGTH]; diff --git a/spec/stdlib/fs-spec.coffee b/spec/stdlib/fs-spec.coffee index b0a6fae5f..3c74f0b33 100644 --- a/spec/stdlib/fs-spec.coffee +++ b/spec/stdlib/fs-spec.coffee @@ -117,14 +117,6 @@ describe "fs", -> expect(symlinkPaths).toEqual(paths) - describe ".lastModified(path)", -> - it "returns a Date object representing the time the file was last modified", -> - beforeWrite = new Date - fs.write('/tmp/foo', '') - lastModified = fs.lastModified('/tmp/foo') - expect(lastModified instanceof Date).toBeTruthy() - expect(lastModified.getTime()).toBeGreaterThan(beforeWrite.getTime() - 1000) - describe ".md5ForPath(path)", -> it "returns the MD5 hash of the file at the given path", -> expect(fs.md5ForPath(require.resolve('fixtures/sample.js'))).toBe 'dd38087d0d7e3e4802a6d3f9b9745f2b' diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 657193d76..3dee17bac 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -131,9 +131,6 @@ module.exports = traverse(rootPath, '', onFile, onDirectory) - lastModified: (path) -> - $native.lastModified(path) - md5ForPath: (path) -> $native.md5ForPath(path) From 6abf1ff1aade7cc9d37039161003f8c42c4ab48c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:02:55 -0800 Subject: [PATCH 026/281] Remove $native.makeDirectory() --- native/v8_extensions/native.mm | 14 +------------- src/stdlib/fs.coffee | 2 +- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 13c29f5cd..c566ce386 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -26,7 +26,7 @@ namespace v8_extensions { const char* methodNames[] = { "read", "write", "absolute", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", - "getWatchedPaths", "unwatchAllPaths", "makeDirectory", "move", "moveToTrash", "reload", + "getWatchedPaths", "unwatchAllPaths", "move", "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -201,18 +201,6 @@ namespace v8_extensions { [pathWatcher unwatchAllPaths]; return true; } - else if (name == "makeDirectory") { - NSString *path = stringFromCefV8Value(arguments[0]); - NSFileManager *fm = [NSFileManager defaultManager]; - NSError *error = nil; - [fm createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:&error]; - - if (error) { - exception = [[error localizedDescription] UTF8String]; - } - - return true; - } else if (name == "move") { NSString *sourcePath = stringFromCefV8Value(arguments[0]); NSString *targetPath = stringFromCefV8Value(arguments[1]); diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 3dee17bac..08bd7fcc8 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -105,7 +105,7 @@ module.exports = $native.write(path, content) makeDirectory: (path) -> - $native.makeDirectory(path) + nodeFs.mkdirSync(path) # Creates the directory specified by "path" including any missing parent # directories. From 5202e846dea13ca542f8ac846af27890620a8a0e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:20:29 -0800 Subject: [PATCH 027/281] Remove $native.write() --- native/v8_extensions/native.mm | 28 +--------------------------- package.json | 3 ++- src/stdlib/fs.coffee | 4 +++- 3 files changed, 6 insertions(+), 29 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index c566ce386..237ce6c05 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -24,7 +24,7 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "read", "write", "absolute", + "read", "absolute", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "move", "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", @@ -70,32 +70,6 @@ namespace v8_extensions { return true; } - else if (name == "write") { - NSString *path = stringFromCefV8Value(arguments[0]); - NSString *content = stringFromCefV8Value(arguments[1]); - - NSFileManager *fm = [NSFileManager defaultManager]; - - // Create parent directories if they don't exist - BOOL exists = [fm fileExistsAtPath:[path stringByDeletingLastPathComponent] isDirectory:nil]; - if (!exists) { - [fm createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil]; - } - - NSError *error = nil; - BOOL success = [content writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error]; - - if (error) { - exception = [[error localizedDescription] UTF8String]; - } - else if (!success) { - std::string exception = "Cannot write to '"; - exception += [path UTF8String]; - exception += "'"; - } - - return true; - } else if (name == "absolute") { NSString *path = stringFromCefV8Value(arguments[0]); diff --git a/package.json b/package.json index 940117789..e6ab7711e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "dependencies": { "coffee-script": "1.5", "ctags": "0.1.0", - "oniguruma": "0.4.0" + "oniguruma": "0.4.0", + "mkdirp": "0.3.5" }, "scripts": { diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 08bd7fcc8..1bc2ff4d0 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -3,6 +3,7 @@ _ = require 'underscore' nodeFs = nodeRequire 'fs' +mkdirp = nodeRequire 'mkdirp' module.exports = # Make the given path absolute by resolving it against the @@ -102,7 +103,8 @@ module.exports = # Open, write, flush, and close a file, writing the given content. write: (path, content) -> - $native.write(path, content) + mkdirp.sync(@directory(path)) + nodeFs.writeFileSync(path, content) makeDirectory: (path) -> nodeFs.mkdirSync(path) From d55e1bfb67e3f2129ba63fde6418897fbffd23da Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:21:36 -0800 Subject: [PATCH 028/281] Remove unused $native.read() --- native/v8_extensions/native.mm | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 237ce6c05..467ae48d8 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -24,7 +24,7 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "read", "absolute", + "absolute", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "move", "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", @@ -49,28 +49,7 @@ namespace v8_extensions { CefRefPtr& retval, CefString& exception) { @autoreleasepool { - if (name == "read") { - NSString *path = stringFromCefV8Value(arguments[0]); - - NSError *error = nil; - NSStringEncoding *encoding = nil; - NSString *contents = [NSString stringWithContentsOfFile:path usedEncoding:encoding error:&error]; - - NSError *binaryFileError = nil; - if (error) { - contents = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&binaryFileError]; - } - - if (binaryFileError) { - exception = [[binaryFileError localizedDescription] UTF8String]; - } - else { - retval = CefV8Value::CreateString([contents UTF8String]); - } - - return true; - } - else if (name == "absolute") { + if (name == "absolute") { NSString *path = stringFromCefV8Value(arguments[0]); path = [path stringByStandardizingPath]; From d91c540d473fc12ca9e288fe351b138408dc5310 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:24:11 -0800 Subject: [PATCH 029/281] Remove $native.move() --- native/v8_extensions/native.mm | 16 +--------------- src/stdlib/fs.coffee | 2 +- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 467ae48d8..7893f037a 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -26,7 +26,7 @@ namespace v8_extensions { const char* methodNames[] = { "absolute", "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", - "getWatchedPaths", "unwatchAllPaths", "move", "moveToTrash", "reload", + "getWatchedPaths", "unwatchAllPaths", "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -154,20 +154,6 @@ namespace v8_extensions { [pathWatcher unwatchAllPaths]; return true; } - else if (name == "move") { - NSString *sourcePath = stringFromCefV8Value(arguments[0]); - NSString *targetPath = stringFromCefV8Value(arguments[1]); - NSFileManager *fm = [NSFileManager defaultManager]; - - NSError *error = nil; - [fm moveItemAtPath:sourcePath toPath:targetPath error:&error]; - - if (error) { - exception = [[error localizedDescription] UTF8String]; - } - - return true; - } else if (name == "moveToTrash") { NSString *sourcePath = stringFromCefV8Value(arguments[0]); bool success = [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 1bc2ff4d0..3fc6d88e1 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -81,7 +81,7 @@ module.exports = paths move: (source, target) -> - $native.move(source, target) + nodeFs.renameSync(source, target) # Remove a file at the given path. Throws an error if path is not a # file or a symbolic link to a file. From 2f8b1d5e3ea8dc357b235f9ec14750450590c651 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:36:20 -0800 Subject: [PATCH 030/281] Remove $native.remove() --- native/v8_extensions/native.mm | 12 ------------ src/stdlib/fs.coffee | 14 +++++++++++++- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 7893f037a..179cf05d1 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -59,18 +59,6 @@ namespace v8_extensions { return true; } - else if (name == "remove") { - NSString *path = stringFromCefV8Value(arguments[0]); - - NSError *error = nil; - [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; - - if (error) { - exception = [[error localizedDescription] UTF8String]; - } - - return true; - } else if (name == "writeToPasteboard") { NSString *text = stringFromCefV8Value(arguments[0]); diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 3fc6d88e1..e5c361e32 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -86,7 +86,19 @@ module.exports = # Remove a file at the given path. Throws an error if path is not a # file or a symbolic link to a file. remove: (path) -> - $native.remove path + if @isFile(path) + nodeFs.unlinkSync(path) + else if @isDirectory(path) + removeDirectory = (path) => + for entry in nodeFs.readdirSync(path) + entryPath = @join(path, entry) + stats = nodeFs.statSync(entryPath) + if stats.isDirectory() + removeDirectory(entryPath) + else if stats.isFile() + nodeFs.unlinkSync(entryPath) + nodeFs.rmdirSync(path) + removeDirectory(path) # Open, read, and close a file, returning the file's contents. read: (path) -> From 6ba9f243811bf9c0423ce292ad946825a1ab6042 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 18:37:33 -0800 Subject: [PATCH 031/281] Remove unused include --- native/v8_extensions/native.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 179cf05d1..94b45d502 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -8,7 +8,6 @@ #import "path_watcher.h" #import -#include static std::string windowState = "{}"; static NSLock *windowStateLock = [[NSLock alloc] init]; From 99dc796f424862878234d33909498653dfe78666 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 19:00:02 -0800 Subject: [PATCH 032/281] Remove $native calls from require.coffee --- src/stdlib/require.coffee | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/stdlib/require.coffee b/src/stdlib/require.coffee index d7e8b87dd..7e46b5b60 100644 --- a/src/stdlib/require.coffee +++ b/src/stdlib/require.coffee @@ -1,3 +1,5 @@ +fs = nodeRequire 'fs' + paths = [ "#{window.resourcePath}/spec" "#{window.resourcePath}/benchmark" @@ -64,7 +66,8 @@ exts = writeToCache = true evaluated = exts.js(file, compiled) - $native.write(cacheFilePath, compiled) if writeToCache + createCacheDirectory() + fs.writeFileSync(cacheFilePath, compiled) if writeToCache evaluated getPath = (path) -> @@ -75,9 +78,13 @@ getPath = (path) -> unless __exists(cacheFilePath) {CoffeeScript} = require 'coffee-script' compiled = CoffeeScript.compile(__read(path), filename: path) - $native.write(cacheFilePath, compiled) + createCacheDirectory() + fs.writeFileSync(cacheFilePath, compiled) cacheFilePath +createCacheDirectory = -> + fs.mkdirSync('/tmp/atom-compiled-scripts') unless __exists('/tmp/atom-compiled-scripts') + getCacheFilePath = (path) -> "/tmp/atom-compiled-scripts/#{$native.md5ForPath(path)}" @@ -148,14 +155,14 @@ __expand = (path) -> null __exists = (path) -> - $native.exists path + fs.existsSync path __isFile = (path) -> - $native.isFile path + __exists(path) && fs.statSync(path).isFile() __read = (path) -> try - $native.read(path) + fs.readFileSync(path, 'utf8') catch e console.error "Failed to read `#{path}`" throw e From 52f7e522555a3cdb9d80561a9c5fb03ba734fe9c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Mar 2013 19:01:36 -0800 Subject: [PATCH 033/281] :lipstick: --- native/v8_extensions/native.mm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 94b45d502..8d7705a79 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -23,11 +23,10 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "absolute", - "remove", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", - "getWatchedPaths", "unwatchAllPaths", "moveToTrash", "reload", - "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", - "getCorrectionsForMisspelling" + "absolute", "writeToPasteboard", "readFromPasteboard", "quit", + "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", + "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", + "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; CefRefPtr nativeObject = CefV8Value::CreateObject(NULL); From 9d706d6d5c974fd5ba3eec799c496f38c53ad7b3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 12:45:42 -0800 Subject: [PATCH 034/281] Add git-utils dependency --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e6ab7711e..11a5b12a4 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "coffee-script": "1.5", "ctags": "0.1.0", "oniguruma": "0.4.0", - "mkdirp": "0.3.5" + "mkdirp": "0.3.5", + "git-utils": "0.1.0" }, "scripts": { From 7bee41f1e2ea6bd7ff1673348288707dc189e197 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 13:59:22 -0800 Subject: [PATCH 035/281] Use git-utils from status handler --- src/app/repository-status-handler.coffee | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app/repository-status-handler.coffee b/src/app/repository-status-handler.coffee index 5503396ce..d35a47055 100644 --- a/src/app/repository-status-handler.coffee +++ b/src/app/repository-status-handler.coffee @@ -1,4 +1,4 @@ -Git = require 'git' +Git = nodeRequire 'git-utils' fs = require 'fs' module.exports = @@ -7,10 +7,9 @@ module.exports = if repo? workingDirectoryPath = repo.getWorkingDirectory() statuses = {} - for path, status of repo.getRepo().getStatuses() + for path, status of repo.getStatuses() statuses[fs.join(workingDirectoryPath, path)] = status - upstream = repo.getAheadBehindCounts() - repo.destroy() + upstream = repo.getAheadBehindCount() else upstream = {} statuses = {} From f3049681bd0d2b03da5e7bf4bd7540be13ffdbbd Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 14:34:04 -0800 Subject: [PATCH 036/281] Use git-utils module Removes the need to include libgit2 as this is now handled by the git-utils module which provides functions that were previously in git.mm and git.coffee --- atom.gyp | 15 +- git2/frameworks/libgit2.0.17.0.dylib | Bin 1048612 -> 0 bytes git2/include/git2.h | 60 -- git2/include/git2/attr.h | 241 ------ git2/include/git2/blob.h | 201 ----- git2/include/git2/branch.h | 173 ----- git2/include/git2/checkout.h | 281 ------- git2/include/git2/clone.h | 104 --- git2/include/git2/commit.h | 292 -------- git2/include/git2/common.h | 129 ---- git2/include/git2/config.h | 554 -------------- git2/include/git2/diff.h | 853 ---------------------- git2/include/git2/errors.h | 119 --- git2/include/git2/graph.h | 36 - git2/include/git2/ignore.h | 78 -- git2/include/git2/index.h | 552 -------------- git2/include/git2/indexer.h | 134 ---- git2/include/git2/merge.h | 55 -- git2/include/git2/message.h | 49 -- git2/include/git2/net.h | 53 -- git2/include/git2/notes.h | 154 ---- git2/include/git2/object.h | 194 ----- git2/include/git2/odb.h | 391 ---------- git2/include/git2/odb_backend.h | 147 ---- git2/include/git2/oid.h | 248 ------- git2/include/git2/pack.h | 117 --- git2/include/git2/push.h | 80 -- git2/include/git2/reflog.h | 167 ----- git2/include/git2/refs.h | 509 ------------- git2/include/git2/refspec.h | 68 -- git2/include/git2/remote.h | 465 ------------ git2/include/git2/repository.h | 647 ---------------- git2/include/git2/reset.h | 58 -- git2/include/git2/revparse.h | 37 - git2/include/git2/revwalk.h | 237 ------ git2/include/git2/signature.h | 76 -- git2/include/git2/stash.h | 121 --- git2/include/git2/status.h | 231 ------ git2/include/git2/strarray.h | 60 -- git2/include/git2/submodule.h | 527 ------------- git2/include/git2/tag.h | 326 --------- git2/include/git2/threads.h | 50 -- git2/include/git2/transport.h | 331 --------- git2/include/git2/tree.h | 387 ---------- git2/include/git2/types.h | 198 ----- git2/include/git2/version.h | 15 - git2/libgit2.gypi | 50 -- native/atom_cef_render_process_handler.mm | 2 - native/v8_extensions/git.h | 22 - native/v8_extensions/git.mm | 493 ------------- package.json | 2 +- src/app/git.coffee | 25 +- src/stdlib/git-repository.coffee | 21 - 53 files changed, 12 insertions(+), 10423 deletions(-) delete mode 100755 git2/frameworks/libgit2.0.17.0.dylib delete mode 100644 git2/include/git2.h delete mode 100644 git2/include/git2/attr.h delete mode 100644 git2/include/git2/blob.h delete mode 100644 git2/include/git2/branch.h delete mode 100644 git2/include/git2/checkout.h delete mode 100644 git2/include/git2/clone.h delete mode 100644 git2/include/git2/commit.h delete mode 100644 git2/include/git2/common.h delete mode 100644 git2/include/git2/config.h delete mode 100644 git2/include/git2/diff.h delete mode 100644 git2/include/git2/errors.h delete mode 100644 git2/include/git2/graph.h delete mode 100644 git2/include/git2/ignore.h delete mode 100644 git2/include/git2/index.h delete mode 100644 git2/include/git2/indexer.h delete mode 100644 git2/include/git2/merge.h delete mode 100644 git2/include/git2/message.h delete mode 100644 git2/include/git2/net.h delete mode 100644 git2/include/git2/notes.h delete mode 100644 git2/include/git2/object.h delete mode 100644 git2/include/git2/odb.h delete mode 100644 git2/include/git2/odb_backend.h delete mode 100644 git2/include/git2/oid.h delete mode 100644 git2/include/git2/pack.h delete mode 100644 git2/include/git2/push.h delete mode 100644 git2/include/git2/reflog.h delete mode 100644 git2/include/git2/refs.h delete mode 100644 git2/include/git2/refspec.h delete mode 100644 git2/include/git2/remote.h delete mode 100644 git2/include/git2/repository.h delete mode 100644 git2/include/git2/reset.h delete mode 100644 git2/include/git2/revparse.h delete mode 100644 git2/include/git2/revwalk.h delete mode 100644 git2/include/git2/signature.h delete mode 100644 git2/include/git2/stash.h delete mode 100644 git2/include/git2/status.h delete mode 100644 git2/include/git2/strarray.h delete mode 100644 git2/include/git2/submodule.h delete mode 100644 git2/include/git2/tag.h delete mode 100644 git2/include/git2/threads.h delete mode 100644 git2/include/git2/transport.h delete mode 100644 git2/include/git2/tree.h delete mode 100644 git2/include/git2/types.h delete mode 100644 git2/include/git2/version.h delete mode 100644 git2/libgit2.gypi delete mode 100644 native/v8_extensions/git.h delete mode 100644 native/v8_extensions/git.mm delete mode 100644 src/stdlib/git-repository.coffee diff --git a/atom.gyp b/atom.gyp index 068a571f9..c736e886f 100644 --- a/atom.gyp +++ b/atom.gyp @@ -24,15 +24,11 @@ '-change', '@loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle', '@rpath/Sparkle.framework/Versions/A/Sparkle', - '-change', - '@executable_path/libgit2.0.17.0.dylib', - '@rpath/libgit2.framework/Libraries/libgit2.0.17.0.dylib', '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}' ], }, 'includes': [ 'cef/cef_paths2.gypi', - 'git2/libgit2.gypi', 'sources.gypi', ], 'target_defaults': { @@ -142,12 +138,6 @@ 'native/frameworks/Sparkle.framework', ], }, - { - 'destination': '<(PRODUCT_DIR)/Atom.app/Contents/Frameworks/libgit2.framework/Libraries', - 'files': [ - 'git2/frameworks/libgit2.0.17.0.dylib', - ], - }, { 'destination': '<(PRODUCT_DIR)/Atom.app/Contents/Frameworks/Chromium Embedded Framework.framework', 'files': [ @@ -227,7 +217,7 @@ 'INFOPLIST_FILE': 'native/mac/framework-info.plist', 'LD_DYLIB_INSTALL_NAME': '@rpath/Atom.framework/Atom', }, - 'include_dirs': [ '.', 'cef', 'git2' ], + 'include_dirs': [ '.', 'cef' ], 'mac_framework_dirs': [ 'native/frameworks' ], 'sources': [ '<@(includes_common)', @@ -253,15 +243,12 @@ 'native/path_watcher.mm', 'native/v8_extensions/atom.h', 'native/v8_extensions/atom.mm', - 'native/v8_extensions/git.h', - 'native/v8_extensions/git.mm', 'native/v8_extensions/native.h', 'native/v8_extensions/native.mm', ], 'link_settings': { 'libraries': [ '$(SDKROOT)/System/Library/Frameworks/AppKit.framework', - 'git2/frameworks/libgit2.0.17.0.dylib', 'native/frameworks/Sparkle.framework', ], }, diff --git a/git2/frameworks/libgit2.0.17.0.dylib b/git2/frameworks/libgit2.0.17.0.dylib deleted file mode 100755 index 96d777c4d3ef8a1c52869bda9857384183fc6ce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048612 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%0AA`8{csCCDo{%($+cvS`Pb&=L|i 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�J%*=bHMt}P_&WaujQxn`7I2X-x(UPzB`l) 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

  • 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 knuP(In0-eiGRCV6TgIWScth generation ancestor - * of the named commit object, following only the first parents. - * The returned commit has to be freed by the caller. - * - * Passing `0` as the generation number returns another instance of the - * base commit itself. - * - * @param ancestor Pointer where to store the ancestor commit - * @param commit a previously loaded commit. - * @param n the requested generation - * @return 0 on success; GIT_ENOTFOUND if no matching ancestor exists - * or an error code - */ -GIT_EXTERN(int) git_commit_nth_gen_ancestor( - git_commit **ancestor, - const git_commit *commit, - unsigned int n); - -/** - * Create a new commit in the repository using `git_object` - * instances as parameters. - * - * The message will not be cleaned up. This can be achieved - * through `git_message_prettify()`. - * - * @param id Pointer where to store the OID of the - * newly created commit - * - * @param repo Repository where to store the commit - * - * @param update_ref If not NULL, name of the reference that - * will be updated to point to this commit. If the reference - * is not direct, it will be resolved to a direct reference. - * Use "HEAD" to update the HEAD of the current branch and - * make it point to this commit. If the reference doesn't - * exist yet, it will be created. - * - * @param author Signature representing the author and the authory - * time of this commit - * - * @param committer Signature representing the committer and the - * commit time of this commit - * - * @param message_encoding The encoding for the message in the - * commit, represented with a standard encoding name. - * E.g. "UTF-8". If NULL, no encoding header is written and - * UTF-8 is assumed. - * - * @param message Full message for this commit - * - * @param tree An instance of a `git_tree` object that will - * be used as the tree for the commit. This tree object must - * also be owned by the given `repo`. - * - * @param parent_count Number of parents for this commit - * - * @param parents[] Array of `parent_count` pointers to `git_commit` - * objects that will be used as the parents for this commit. This - * array may be NULL if `parent_count` is 0 (root commit). All the - * given commits must be owned by the `repo`. - * - * @return 0 or an error code - * The created commit will be written to the Object Database and - * the given reference will be updated to point to it - */ -GIT_EXTERN(int) git_commit_create( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - int parent_count, - const git_commit *parents[]); - -/** - * Create a new commit in the repository using a variable - * argument list. - * - * The message will be cleaned up from excess whitespace - * it will be made sure that the last line ends with a '\n'. - * - * The parents for the commit are specified as a variable - * list of pointers to `const git_commit *`. Note that this - * is a convenience method which may not be safe to export - * for certain languages or compilers - * - * All other parameters remain the same - * - * @see git_commit_create - */ -GIT_EXTERN(int) git_commit_create_v( - git_oid *id, - git_repository *repo, - const char *update_ref, - const git_signature *author, - const git_signature *committer, - const char *message_encoding, - const char *message, - const git_tree *tree, - int parent_count, - ...); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/common.h b/git2/include/git2/common.h deleted file mode 100644 index 7a4c54c10..000000000 --- a/git2/include/git2/common.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_common_h__ -#define INCLUDE_git_common_h__ - -#include -#include - -#ifdef _MSC_VER -# include "inttypes.h" -#else -# include -#endif - -#ifdef __cplusplus -# define GIT_BEGIN_DECL extern "C" { -# define GIT_END_DECL } -#else - /** Start declarations in C mode */ -# define GIT_BEGIN_DECL /* empty */ - /** End declarations in C mode */ -# define GIT_END_DECL /* empty */ -#endif - -/** Declare a public function exported for application use. */ -#if __GNUC__ >= 4 -# define GIT_EXTERN(type) extern \ - __attribute__((visibility("default"))) \ - type -#elif defined(_MSC_VER) -# define GIT_EXTERN(type) __declspec(dllexport) type -#else -# define GIT_EXTERN(type) extern type -#endif - -/** Declare a function as always inlined. */ -#if defined(_MSC_VER) -# define GIT_INLINE(type) static __inline type -#else -# define GIT_INLINE(type) static inline type -#endif - -/** Declare a function's takes printf style arguments. */ -#ifdef __GNUC__ -# define GIT_FORMAT_PRINTF(a,b) __attribute__((format (printf, a, b))) -#else -# define GIT_FORMAT_PRINTF(a,b) /* empty */ -#endif - -#if (defined(_WIN32)) && !defined(__CYGWIN__) -#define GIT_WIN32 1 -#endif - -#ifdef __amigaos4__ -#include -#endif - -/** - * @file git2/common.h - * @brief Git common platform definitions - * @defgroup git_common Git common platform definitions - * @ingroup Git - * @{ - */ - -GIT_BEGIN_DECL - -/** - * The separator used in path list strings (ie like in the PATH - * environment variable). A semi-colon ";" is used on Windows, and - * a colon ":" for all other systems. - */ -#ifdef GIT_WIN32 -#define GIT_PATH_LIST_SEPARATOR ';' -#else -#define GIT_PATH_LIST_SEPARATOR ':' -#endif - -/** - * The maximum length of a valid git path. - */ -#define GIT_PATH_MAX 4096 - -/** - * The string representation of the null object ID. - */ -#define GIT_OID_HEX_ZERO "0000000000000000000000000000000000000000" - -/** - * Return the version of the libgit2 library - * being currently used. - * - * @param major Store the major version number - * @param minor Store the minor version number - * @param rev Store the revision (patch) number - */ -GIT_EXTERN(void) git_libgit2_version(int *major, int *minor, int *rev); - -/** - * Combinations of these values describe the capabilities of libgit2. - */ -enum { - GIT_CAP_THREADS = ( 1 << 0 ), - GIT_CAP_HTTPS = ( 1 << 1 ) -}; - -/** - * Query compile time options for libgit2. - * - * @return A combination of GIT_CAP_* values. - * - * - GIT_CAP_THREADS - * Libgit2 was compiled with thread support. Note that thread support is still to be seen as a - * 'work in progress'. - * - * - GIT_CAP_HTTPS - * Libgit2 supports the https:// protocol. This requires the open ssl library to be - * found when compiling libgit2. - */ -GIT_EXTERN(int) git_libgit2_capabilities(void); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/git2/include/git2/config.h b/git2/include/git2/config.h deleted file mode 100644 index 19d4cb78d..000000000 --- a/git2/include/git2/config.h +++ /dev/null @@ -1,554 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_config_h__ -#define INCLUDE_git_config_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/config.h - * @brief Git config management routines - * @defgroup git_config Git config management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Priority level of a config file. - * These priority levels correspond to the natural escalation logic - * (from higher to lower) when searching for config entries in git.git. - * - * git_config_open_default() and git_repository_config() honor those - * priority levels as well. - */ -enum { - GIT_CONFIG_LEVEL_SYSTEM = 1, /**< System-wide configuration file. */ - GIT_CONFIG_LEVEL_XDG = 2, /**< XDG compatible configuration file (.config/git/config). */ - GIT_CONFIG_LEVEL_GLOBAL = 3, /**< User-specific configuration file, also called Global configuration file. */ - GIT_CONFIG_LEVEL_LOCAL = 4, /**< Repository specific configuration file. */ - GIT_CONFIG_HIGHEST_LEVEL = -1, /**< Represents the highest level of a config file. */ -}; - -typedef struct { - const char *name; - const char *value; - unsigned int level; -} git_config_entry; - -typedef int (*git_config_foreach_cb)(const git_config_entry *, void *); - - -/** - * Generic backend that implements the interface to - * access a configuration file - */ -struct git_config_backend { - unsigned int version; - struct git_config *cfg; - - /* Open means open the file/database and parse if necessary */ - int (*open)(struct git_config_backend *, unsigned int level); - int (*get)(const struct git_config_backend *, const char *key, const git_config_entry **entry); - int (*get_multivar)(struct git_config_backend *, const char *key, const char *regexp, git_config_foreach_cb callback, void *payload); - int (*set)(struct git_config_backend *, const char *key, const char *value); - int (*set_multivar)(git_config_backend *cfg, const char *name, const char *regexp, const char *value); - int (*del)(struct git_config_backend *, const char *key); - int (*foreach)(struct git_config_backend *, const char *, git_config_foreach_cb callback, void *payload); - int (*refresh)(struct git_config_backend *); - void (*free)(struct git_config_backend *); -}; -#define GIT_CONFIG_BACKEND_VERSION 1 -#define GIT_CONFIG_BACKEND_INIT {GIT_CONFIG_BACKEND_VERSION} - -typedef enum { - GIT_CVAR_FALSE = 0, - GIT_CVAR_TRUE = 1, - GIT_CVAR_INT32, - GIT_CVAR_STRING -} git_cvar_t; - -typedef struct { - git_cvar_t cvar_type; - const char *str_match; - int map_value; -} git_cvar_map; - -/** - * Locate the path to the global configuration file - * - * The user or global configuration file is usually - * located in `$HOME/.gitconfig`. - * - * This method will try to guess the full path to that - * file, if the file exists. The returned path - * may be used on any `git_config` call to load the - * global configuration file. - * - * This method will not guess the path to the xdg compatible - * config file (.config/git/config). - * - * @param out Buffer to store the path in - * @param length size of the buffer in bytes - * @return 0 if a global configuration file has been found. Its path will be stored in `buffer`. - */ -GIT_EXTERN(int) git_config_find_global(char *out, size_t length); - -/** - * Locate the path to the global xdg compatible configuration file - * - * The xdg compatible configuration file is usually - * located in `$HOME/.config/git/config`. - * - * This method will try to guess the full path to that - * file, if the file exists. The returned path - * may be used on any `git_config` call to load the - * xdg compatible configuration file. - * - * @param out Buffer to store the path in - * @param length size of the buffer in bytes - * @return 0 if a xdg compatible configuration file has been - * found. Its path will be stored in `buffer`. - */ -GIT_EXTERN(int) git_config_find_xdg(char *out, size_t length); - -/** - * Locate the path to the system configuration file - * - * If /etc/gitconfig doesn't exist, it will look for - * %PROGRAMFILES%\Git\etc\gitconfig. - - * @param global_config_path Buffer to store the path in - * @param length size of the buffer in bytes - * @return 0 if a system configuration file has been - * found. Its path will be stored in `buffer`. - */ -GIT_EXTERN(int) git_config_find_system(char *out, size_t length); - -/** - * Open the global, XDG and system configuration files - * - * Utility wrapper that finds the global, XDG and system configuration files - * and opens them into a single prioritized config object that can be - * used when accessing default config data outside a repository. - * - * @param out Pointer to store the config instance - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_open_default(git_config **out); - -/** - * Allocate a new configuration object - * - * This object is empty, so you have to add a file to it before you - * can do anything with it. - * - * @param out pointer to the new configuration - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_new(git_config **out); - -/** - * Add a generic config file instance to an existing config - * - * Note that the configuration object will free the file - * automatically. - * - * Further queries on this config object will access each - * of the config file instances in order (instances with - * a higher priority level will be accessed first). - * - * @param cfg the configuration to add the file to - * @param file the configuration file (backend) to add - * @param level the priority level of the backend - * @param force if a config file already exists for the given - * priority level, replace it - * @return 0 on success, GIT_EEXISTS when adding more than one file - * for a given priority level (and force_replace set to 0), or error code - */ -GIT_EXTERN(int) git_config_add_backend( - git_config *cfg, - git_config_backend *file, - unsigned int level, - int force); - -/** - * Add an on-disk config file instance to an existing config - * - * The on-disk file pointed at by `path` will be opened and - * parsed; it's expected to be a native Git config file following - * the default Git config syntax (see man git-config). - * - * Note that the configuration object will free the file - * automatically. - * - * Further queries on this config object will access each - * of the config file instances in order (instances with - * a higher priority level will be accessed first). - * - * @param cfg the configuration to add the file to - * @param path path to the configuration file (backend) to add - * @param level the priority level of the backend - * @param force if a config file already exists for the given - * priority level, replace it - * @return 0 on success, GIT_EEXISTS when adding more than one file - * for a given priority level (and force_replace set to 0), - * GIT_ENOTFOUND when the file doesn't exist or error code - */ -GIT_EXTERN(int) git_config_add_file_ondisk( - git_config *cfg, - const char *path, - unsigned int level, - int force); - -/** - * Create a new config instance containing a single on-disk file - * - * This method is a simple utility wrapper for the following sequence - * of calls: - * - git_config_new - * - git_config_add_file_ondisk - * - * @param out The configuration instance to create - * @param path Path to the on-disk file to open - * @return 0 on success, GIT_ENOTFOUND when the file doesn't exist - * or an error code - */ -GIT_EXTERN(int) git_config_open_ondisk(git_config **out, const char *path); - -/** - * Build a single-level focused config object from a multi-level one. - * - * The returned config object can be used to perform get/set/delete operations - * on a single specific level. - * - * Getting several times the same level from the same parent multi-level config - * will return different config instances, but containing the same config_file - * instance. - * - * @param out The configuration instance to create - * @param parent Multi-level config to search for the given level - * @param level Configuration level to search for - * @return 0, GIT_ENOTFOUND if the passed level cannot be found in the - * multi-level parent config, or an error code - */ -GIT_EXTERN(int) git_config_open_level( - git_config **out, - const git_config *parent, - unsigned int level); - -/** - * Reload changed config files - * - * A config file may be changed on disk out from under the in-memory - * config object. This function causes us to look for files that have - * been modified since we last loaded them and refresh the config with - * the latest information. - * - * @param cfg The configuration to refresh - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_refresh(git_config *cfg); - -/** - * Free the configuration and its associated memory and files - * - * @param cfg the configuration to free - */ -GIT_EXTERN(void) git_config_free(git_config *cfg); - -/** - * Get the git_config_entry of a config variable. - * - * The git_config_entry is owned by the config and should not be freed by the - * user. - - * @param out pointer to the variable git_config_entry - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_entry( - const git_config_entry **out, - const git_config *cfg, - const char *name); - -/** - * Get the value of an integer config variable. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurence of the variable will be returned here. - * - * @param out pointer to the variable where the value should be stored - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_int32(int32_t *out, const git_config *cfg, const char *name); - -/** - * Get the value of a long integer config variable. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the variable where the value should be stored - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_int64(int64_t *out, const git_config *cfg, const char *name); - -/** - * Get the value of a boolean config variable. - * - * This function uses the usual C convention of 0 being false and - * anything else true. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the variable where the value should be stored - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_bool(int *out, const git_config *cfg, const char *name); - -/** - * Get the value of a string config variable. - * - * The string is owned by the variable and should not be freed by the - * user. - * - * All config files will be looked into, in the order of their - * defined level. A higher level means a higher priority. The - * first occurrence of the variable will be returned here. - * - * @param out pointer to the variable's value - * @param cfg where to look for the variable - * @param name the variable's name - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_get_string(const char **out, const git_config *cfg, const char *name); - -/** - * Get each value of a multivar. - * - * The callback will be called on each variable found - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param regexp regular expression to filter which variables we're - * interested in. Use NULL to indicate all - * @param fn the function to be called on each value of the variable - * @param data opaque pointer to pass to the callback - */ -GIT_EXTERN(int) git_config_get_multivar(const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload); - -/** - * Set the value of an integer config variable in the config file - * with the highest level (usually the local one). - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value Integer value for the variable - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_int32(git_config *cfg, const char *name, int32_t value); - -/** - * Set the value of a long integer config variable in the config file - * with the highest level (usually the local one). - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value Long integer value for the variable - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_int64(git_config *cfg, const char *name, int64_t value); - -/** - * Set the value of a boolean config variable in the config file - * with the highest level (usually the local one). - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value the value to store - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value); - -/** - * Set the value of a string config variable in the config file - * with the highest level (usually the local one). - * - * A copy of the string is made and the user is free to use it - * afterwards. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param value the string to store. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value); - -/** - * Set a multivar in the local config file. - * - * @param cfg where to look for the variable - * @param name the variable's name - * @param regexp a regular expression to indicate which values to replace - * @param value the new value. - */ -GIT_EXTERN(int) git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value); - -/** - * Delete a config variable from the config file - * with the highest level (usually the local one). - * - * @param cfg the configuration - * @param name the variable to delete - */ -GIT_EXTERN(int) git_config_delete_entry(git_config *cfg, const char *name); - -/** - * Perform an operation on each config variable. - * - * The callback receives the normalized name and value of each variable - * in the config backend, and the data pointer passed to this function. - * As soon as one of the callback functions returns something other than 0, - * this function stops iterating and returns `GIT_EUSER`. - * - * @param cfg where to get the variables from - * @param callback the function to call on each variable - * @param payload the data to pass to the callback - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_config_foreach( - const git_config *cfg, - git_config_foreach_cb callback, - void *payload); - -/** - * Perform an operation on each config variable matching a regular expression. - * - * This behaviors like `git_config_foreach` with an additional filter of a - * regular expression that filters which config keys are passed to the - * callback. - * - * @param cfg where to get the variables from - * @param regexp regular expression to match against config names - * @param callback the function to call on each variable - * @param payload the data to pass to the callback - * @return 0 or the return value of the callback which didn't return 0 - */ -GIT_EXTERN(int) git_config_foreach_match( - const git_config *cfg, - const char *regexp, - git_config_foreach_cb callback, - void *payload); - -/** - * Query the value of a config variable and return it mapped to - * an integer constant. - * - * This is a helper method to easily map different possible values - * to a variable to integer constants that easily identify them. - * - * A mapping array looks as follows: - * - * git_cvar_map autocrlf_mapping[] = { - * {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE}, - * {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE}, - * {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT}, - * {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}}; - * - * On any "false" value for the variable (e.g. "false", "FALSE", "no"), the - * mapping will store `GIT_AUTO_CRLF_FALSE` in the `out` parameter. - * - * The same thing applies for any "true" value such as "true", "yes" or "1", storing - * the `GIT_AUTO_CRLF_TRUE` variable. - * - * Otherwise, if the value matches the string "input" (with case insensitive comparison), - * the given constant will be stored in `out`, and likewise for "default". - * - * If not a single match can be made to store in `out`, an error code will be - * returned. - * - * @param out place to store the result of the mapping - * @param cfg config file to get the variables from - * @param name name of the config variable to lookup - * @param maps array of `git_cvar_map` objects specifying the possible mappings - * @param map_n number of mapping objects in `maps` - * @return 0 on success, error code otherwise - */ -GIT_EXTERN(int) git_config_get_mapped( - int *out, - const git_config *cfg, - const char *name, - const git_cvar_map *maps, - size_t map_n); - -/** - * Maps a string value to an integer constant - * - * @param out place to store the result of the parsing - * @param maps array of `git_cvar_map` objects specifying the possible mappings - * @param map_n number of mapping objects in `maps` - * @param value value to parse - */ -GIT_EXTERN(int) git_config_lookup_map_value( - int *out, - const git_cvar_map *maps, - size_t map_n, - const char *value); - -/** - * Parse a string value as a bool. - * - * Valid values for true are: 'true', 'yes', 'on', 1 or any - * number different from 0 - * Valid values for false are: 'false', 'no', 'off', 0 - * - * @param out place to store the result of the parsing - * @param value value to parse - */ -GIT_EXTERN(int) git_config_parse_bool(int *out, const char *value); - -/** - * Parse a string value as an int32. - * - * An optional value suffix of 'k', 'm', or 'g' will - * cause the value to be multiplied by 1024, 1048576, - * or 1073741824 prior to output. - * - * @param out place to store the result of the parsing - * @param value value to parse - */ -GIT_EXTERN(int) git_config_parse_int32(int32_t *out, const char *value); - -/** - * Parse a string value as an int64. - * - * An optional value suffix of 'k', 'm', or 'g' will - * cause the value to be multiplied by 1024, 1048576, - * or 1073741824 prior to output. - * - * @param out place to store the result of the parsing - * @param value value to parse - */ -GIT_EXTERN(int) git_config_parse_int64(int64_t *out, const char *value); - - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/diff.h b/git2/include/git2/diff.h deleted file mode 100644 index c052f34f8..000000000 --- a/git2/include/git2/diff.h +++ /dev/null @@ -1,853 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_diff_h__ -#define INCLUDE_git_diff_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "tree.h" -#include "refs.h" - -/** - * @file git2/diff.h - * @brief Git tree and file differencing routines. - * - * Overview - * -------- - * - * Calculating diffs is generally done in two phases: building a diff list - * then traversing the diff list. This makes is easier to share logic - * across the various types of diffs (tree vs tree, workdir vs index, etc.), - * and also allows you to insert optional diff list post-processing phases, - * such as rename detected, in between the steps. When you are done with a - * diff list object, it must be freed. - * - * Terminology - * ----------- - * - * To understand the diff APIs, you should know the following terms: - * - * - A `diff` or `diff list` represents the cumulative list of differences - * between two snapshots of a repository (possibly filtered by a set of - * file name patterns). This is the `git_diff_list` object. - * - A `delta` is a file pair with an old and new revision. The old version - * may be absent if the file was just created and the new version may be - * absent if the file was deleted. A diff is mostly just a list of deltas. - * - A `binary` file / delta is a file (or pair) for which no text diffs - * should be generated. A diff list can contain delta entries that are - * binary, but no diff content will be output for those files. There is - * a base heuristic for binary detection and you can further tune the - * behavior with git attributes or diff flags and option settings. - * - A `hunk` is a span of modified lines in a delta along with some stable - * surrounding context. You can configure the amount of context and other - * properties of how hunks are generated. Each hunk also comes with a - * header that described where it starts and ends in both the old and new - * versions in the delta. - * - A `line` is a range of characters inside a hunk. It could be a context - * line (i.e. in both old and new versions), an added line (i.e. only in - * the new version), or a removed line (i.e. only in the old version). - * Unfortunately, we don't know anything about the encoding of data in the - * file being diffed, so we cannot tell you much about the line content. - * Line data will not be NUL-byte terminated, however, because it will be - * just a span of bytes inside the larger file. - * - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Flags for diff options. A combination of these flags can be passed - * in via the `flags` value in the `git_diff_options`. - */ -typedef enum { - /** Normal diff, the default */ - GIT_DIFF_NORMAL = 0, - /** Reverse the sides of the diff */ - GIT_DIFF_REVERSE = (1 << 0), - /** Treat all files as text, disabling binary attributes & detection */ - GIT_DIFF_FORCE_TEXT = (1 << 1), - /** Ignore all whitespace */ - GIT_DIFF_IGNORE_WHITESPACE = (1 << 2), - /** Ignore changes in amount of whitespace */ - GIT_DIFF_IGNORE_WHITESPACE_CHANGE = (1 << 3), - /** Ignore whitespace at end of line */ - GIT_DIFF_IGNORE_WHITESPACE_EOL = (1 << 4), - /** Exclude submodules from the diff completely */ - GIT_DIFF_IGNORE_SUBMODULES = (1 << 5), - /** Use the "patience diff" algorithm (currently unimplemented) */ - GIT_DIFF_PATIENCE = (1 << 6), - /** Include ignored files in the diff list */ - GIT_DIFF_INCLUDE_IGNORED = (1 << 7), - /** Include untracked files in the diff list */ - GIT_DIFF_INCLUDE_UNTRACKED = (1 << 8), - /** Include unmodified files in the diff list */ - GIT_DIFF_INCLUDE_UNMODIFIED = (1 << 9), - /** Even with the GIT_DIFF_INCLUDE_UNTRACKED flag, when an untracked - * directory is found, only a single entry for the directory is added - * to the diff list; with this flag, all files under the directory will - * be included, too. - */ - GIT_DIFF_RECURSE_UNTRACKED_DIRS = (1 << 10), - /** If the pathspec is set in the diff options, this flags means to - * apply it as an exact match instead of as an fnmatch pattern. - */ - GIT_DIFF_DISABLE_PATHSPEC_MATCH = (1 << 11), - /** Use case insensitive filename comparisons */ - GIT_DIFF_DELTAS_ARE_ICASE = (1 << 12), - /** When generating patch text, include the content of untracked files */ - GIT_DIFF_INCLUDE_UNTRACKED_CONTENT = (1 << 13), - /** Disable updating of the `binary` flag in delta records. This is - * useful when iterating over a diff if you don't need hunk and data - * callbacks and want to avoid having to load file completely. - */ - GIT_DIFF_SKIP_BINARY_CHECK = (1 << 14), - /** Normally, a type change between files will be converted into a - * DELETED record for the old and an ADDED record for the new; this - * options enabled the generation of TYPECHANGE delta records. - */ - GIT_DIFF_INCLUDE_TYPECHANGE = (1 << 15), - /** Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still - * generally show as a DELETED blob. This flag tries to correctly - * label blob->tree transitions as TYPECHANGE records with new_file's - * mode set to tree. Note: the tree SHA will not be available. - */ - GIT_DIFF_INCLUDE_TYPECHANGE_TREES = (1 << 16), - /** Ignore file mode changes */ - GIT_DIFF_IGNORE_FILEMODE = (1 << 17), -} git_diff_option_t; - -/** - * Structure describing options about how the diff should be executed. - * - * Setting all values of the structure to zero will yield the default - * values. Similarly, passing NULL for the options structure will - * give the defaults. The default values are marked below. - * - * - `flags` is a combination of the `git_diff_option_t` values above - * - `context_lines` is the number of unchanged lines that define the - * boundary of a hunk (and to display before and after) - * - `interhunk_lines` is the maximum number of unchanged lines between - * hunk boundaries before the hunks will be merged into a one. - * - `old_prefix` is the virtual "directory" to prefix to old file names - * in hunk headers (default "a") - * - `new_prefix` is the virtual "directory" to prefix to new file names - * in hunk headers (default "b") - * - `pathspec` is an array of paths / fnmatch patterns to constrain diff - * - `max_size` is a file size (in bytes) above which a blob will be marked - * as binary automatically; pass a negative value to disable. - */ -typedef struct { - unsigned int version; /**< version for the struct */ - uint32_t flags; /**< defaults to GIT_DIFF_NORMAL */ - uint16_t context_lines; /**< defaults to 3 */ - uint16_t interhunk_lines; /**< defaults to 0 */ - const char *old_prefix; /**< defaults to "a" */ - const char *new_prefix; /**< defaults to "b" */ - git_strarray pathspec; /**< defaults to include all paths */ - git_off_t max_size; /**< defaults to 512MB */ -} git_diff_options; - -#define GIT_DIFF_OPTIONS_VERSION 1 -#define GIT_DIFF_OPTIONS_INIT {GIT_DIFF_OPTIONS_VERSION} - -/** - * The diff list object that contains all individual file deltas. - * - * This is an opaque structure which will be allocated by one of the diff - * generator functions below (such as `git_diff_tree_to_tree`). You are - * responsible for releasing the object memory when done, using the - * `git_diff_list_free()` function. - */ -typedef struct git_diff_list git_diff_list; - -/** - * Flags for the file object on each side of a diff. - * - * Note: most of these flags are just for **internal** consumption by - * libgit2, but some of them may be interesting to external users. - */ -typedef enum { - GIT_DIFF_FILE_VALID_OID = (1 << 0), /** `oid` value is known correct */ - GIT_DIFF_FILE_FREE_PATH = (1 << 1), /** `path` is allocated memory */ - GIT_DIFF_FILE_BINARY = (1 << 2), /** should be considered binary data */ - GIT_DIFF_FILE_NOT_BINARY = (1 << 3), /** should be considered text data */ - GIT_DIFF_FILE_FREE_DATA = (1 << 4), /** internal file data is allocated */ - GIT_DIFF_FILE_UNMAP_DATA = (1 << 5), /** internal file data is mmap'ed */ - GIT_DIFF_FILE_NO_DATA = (1 << 6), /** file data should not be loaded */ -} git_diff_file_flag_t; - -/** - * What type of change is described by a git_diff_delta? - * - * `GIT_DELTA_RENAMED` and `GIT_DELTA_COPIED` will only show up if you run - * `git_diff_find_similar()` on the diff list object. - * - * `GIT_DELTA_TYPECHANGE` only shows up given `GIT_DIFF_INCLUDE_TYPECHANGE` - * in the option flags (otherwise type changes will be split into ADDED / - * DELETED pairs). - */ -typedef enum { - GIT_DELTA_UNMODIFIED = 0, /** no changes */ - GIT_DELTA_ADDED = 1, /** entry does not exist in old version */ - GIT_DELTA_DELETED = 2, /** entry does not exist in new version */ - GIT_DELTA_MODIFIED = 3, /** entry content changed between old and new */ - GIT_DELTA_RENAMED = 4, /** entry was renamed between old and new */ - GIT_DELTA_COPIED = 5, /** entry was copied from another old entry */ - GIT_DELTA_IGNORED = 6, /** entry is ignored item in workdir */ - GIT_DELTA_UNTRACKED = 7, /** entry is untracked item in workdir */ - GIT_DELTA_TYPECHANGE = 8, /** type of entry changed between old and new */ -} git_delta_t; - -/** - * Description of one side of a diff entry. - * - * Although this is called a "file", it may actually represent a file, a - * symbolic link, a submodule commit id, or even a tree (although that only - * if you are tracking type changes or ignored/untracked directories). - * - * The `oid` is the `git_oid` of the item. If the entry represents an - * absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta), - * then the oid will be zeroes. - * - * `path` is the NUL-terminated path to the entry relative to the working - * directory of the repository. - * - * `size` is the size of the entry in bytes. - * - * `flags` is a combination of the `git_diff_file_flag_t` types, but those - * are largely internal values. - * - * `mode` is, roughly, the stat() `st_mode` value for the item. This will - * be restricted to one of the `git_filemode_t` values. - */ -typedef struct { - git_oid oid; - const char *path; - git_off_t size; - unsigned int flags; - uint16_t mode; -} git_diff_file; - -/** - * Description of changes to one entry. - * - * When iterating over a diff list object, this will be passed to most - * callback functions and you can use the contents to understand exactly - * what has changed. - * - * The `old_file` represents the "from" side of the diff and the `new_file` - * represents to "to" side of the diff. What those means depend on the - * function that was used to generate the diff and will be documented below. - * You can also use the `GIT_DIFF_REVERSE` flag to flip it around. - * - * Although the two sides of the delta are named "old_file" and "new_file", - * they actually may correspond to entries that represent a file, a symbolic - * link, a submodule commit id, or even a tree (if you are tracking type - * changes or ignored/untracked directories). - * - * Under some circumstances, in the name of efficiency, not all fields will - * be filled in, but we generally try to fill in as much as possible. One - * example is that the "binary" field will not examine file contents if you - * do not pass in hunk and/or line callbacks to the diff foreach iteration - * function. It will just use the git attributes for those files. - */ -typedef struct { - git_diff_file old_file; - git_diff_file new_file; - git_delta_t status; - unsigned int similarity; /**< for RENAMED and COPIED, value 0-100 */ - int binary; -} git_diff_delta; - -/** - * When iterating over a diff, callback that will be made per file. - * - * @param delta A pointer to the delta data for the file - * @param progress Goes from 0 to 1 over the diff list - * @param payload User-specified pointer from foreach function - */ -typedef int (*git_diff_file_cb)( - const git_diff_delta *delta, - float progress, - void *payload); - -/** - * Structure describing a hunk of a diff. - */ -typedef struct { - int old_start; /** Starting line number in old_file */ - int old_lines; /** Number of lines in old_file */ - int new_start; /** Starting line number in new_file */ - int new_lines; /** Number of lines in new_file */ -} git_diff_range; - -/** - * When iterating over a diff, callback that will be made per hunk. - */ -typedef int (*git_diff_hunk_cb)( - const git_diff_delta *delta, - const git_diff_range *range, - const char *header, - size_t header_len, - void *payload); - -/** - * Line origin constants. - * - * These values describe where a line came from and will be passed to - * the git_diff_data_cb when iterating over a diff. There are some - * special origin constants at the end that are used for the text - * output callbacks to demarcate lines that are actually part of - * the file or hunk headers. - */ -typedef enum { - /* These values will be sent to `git_diff_data_cb` along with the line */ - GIT_DIFF_LINE_CONTEXT = ' ', - GIT_DIFF_LINE_ADDITION = '+', - GIT_DIFF_LINE_DELETION = '-', - GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< Removed line w/o LF & added one with */ - GIT_DIFF_LINE_DEL_EOFNL = '\0', /**< LF was removed at end of file */ - - /* The following values will only be sent to a `git_diff_data_cb` when - * the content of a diff is being formatted (eg. through - * git_diff_print_patch() or git_diff_print_compact(), for instance). - */ - GIT_DIFF_LINE_FILE_HDR = 'F', - GIT_DIFF_LINE_HUNK_HDR = 'H', - GIT_DIFF_LINE_BINARY = 'B' -} git_diff_line_t; - -/** - * When iterating over a diff, callback that will be made per text diff - * line. In this context, the provided range will be NULL. - * - * When printing a diff, callback that will be made to output each line - * of text. This uses some extra GIT_DIFF_LINE_... constants for output - * of lines of file and hunk headers. - */ -typedef int (*git_diff_data_cb)( - const git_diff_delta *delta, /** delta that contains this data */ - const git_diff_range *range, /** range of lines containing this data */ - char line_origin, /** git_diff_list_t value from above */ - const char *content, /** diff data - not NUL terminated */ - size_t content_len, /** number of bytes of diff data */ - void *payload); /** user reference data */ - -/** - * The diff patch is used to store all the text diffs for a delta. - * - * You can easily loop over the content of patches and get information about - * them. - */ -typedef struct git_diff_patch git_diff_patch; - -/** - * Flags to control the behavior of diff rename/copy detection. - */ -typedef enum { - /** look for renames? (`--find-renames`) */ - GIT_DIFF_FIND_RENAMES = (1 << 0), - /** consider old size of modified for renames? (`--break-rewrites=N`) */ - GIT_DIFF_FIND_RENAMES_FROM_REWRITES = (1 << 1), - - /** look for copies? (a la `--find-copies`) */ - GIT_DIFF_FIND_COPIES = (1 << 2), - /** consider unmodified as copy sources? (`--find-copies-harder`) */ - GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED = (1 << 3), - - /** split large rewrites into delete/add pairs (`--break-rewrites=/M`) */ - GIT_DIFF_FIND_AND_BREAK_REWRITES = (1 << 4), -} git_diff_find_t; - -/** - * Control behavior of rename and copy detection - */ -typedef struct { - unsigned int version; - - /** Combination of git_diff_find_t values (default FIND_RENAMES) */ - unsigned int flags; - - /** Similarity to consider a file renamed (default 50) */ - unsigned int rename_threshold; - /** Similarity of modified to be eligible rename source (default 50) */ - unsigned int rename_from_rewrite_threshold; - /** Similarity to consider a file a copy (default 50) */ - unsigned int copy_threshold; - /** Similarity to split modify into delete/add pair (default 60) */ - unsigned int break_rewrite_threshold; - - /** Maximum similarity sources to examine (a la diff's `-l` option or - * the `diff.renameLimit` config) (default 200) - */ - unsigned int target_limit; -} git_diff_find_options; - -#define GIT_DIFF_FIND_OPTIONS_VERSION 1 -#define GIT_DIFF_FIND_OPTIONS_INIT {GIT_DIFF_FIND_OPTIONS_VERSION} - -/** @name Diff List Generator Functions - * - * These are the functions you would use to create (or destroy) a - * git_diff_list from various objects in a repository. - */ -/**@{*/ - -/** - * Deallocate a diff list. - */ -GIT_EXTERN(void) git_diff_list_free(git_diff_list *diff); - -/** - * Create a diff list with the difference between two tree objects. - * - * This is equivalent to `git diff ` - * - * The first tree will be used for the "old_file" side of the delta and the - * second tree will be used for the "new_file" side of the delta. - * - * @param diff Output pointer to a git_diff_list pointer to be allocated. - * @param repo The repository containing the trees. - * @param old_tree A git_tree object to diff from. - * @param new_tree A git_tree object to diff to. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_tree( - git_diff_list **diff, - git_repository *repo, - git_tree *old_tree, - git_tree *new_tree, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff list between a tree and repository index. - * - * This is equivalent to `git diff --cached ` or if you pass - * the HEAD tree, then like `git diff --cached`. - * - * The tree you pass will be used for the "old_file" side of the delta, and - * the index will be used for the "new_file" side of the delta. - * - * @param diff Output pointer to a git_diff_list pointer to be allocated. - * @param repo The repository containing the tree and index. - * @param old_tree A git_tree object to diff from. - * @param index The index to diff with; repo index used if NULL. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_index( - git_diff_list **diff, - git_repository *repo, - git_tree *old_tree, - git_index *index, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff list between the repository index and the workdir directory. - * - * This matches the `git diff` command. See the note below on - * `git_diff_tree_to_workdir` for a discussion of the difference between - * `git diff` and `git diff HEAD` and how to emulate a `git diff ` - * using libgit2. - * - * The index will be used for the "old_file" side of the delta, and the - * working directory will be used for the "new_file" side of the delta. - * - * @param diff Output pointer to a git_diff_list pointer to be allocated. - * @param repo The repository. - * @param index The index to diff from; repo index used if NULL. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_index_to_workdir( - git_diff_list **diff, - git_repository *repo, - git_index *index, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Create a diff list between a tree and the working directory. - * - * The tree you provide will be used for the "old_file" side of the delta, - * and the working directory will be used for the "new_file" side. - * - * Please note: this is *NOT* the same as `git diff `. Running - * `git diff HEAD` or the like actually uses information from the index, - * along with the tree and working directory info. - * - * This function returns strictly the differences between the tree and the - * files contained in the working directory, regardless of the state of - * files in the index. It may come as a surprise, but there is no direct - * equivalent in core git. - * - * To emulate `git diff `, call both `git_diff_tree_to_index` and - * `git_diff_index_to_workdir`, then call `git_diff_merge` on the results. - * That will yield a `git_diff_list` that matches the git output. - * - * If this seems confusing, take the case of a file with a staged deletion - * where the file has then been put back into the working dir and modified. - * The tree-to-workdir diff for that file is 'modified', but core git would - * show status 'deleted' since there is a pending deletion in the index. - * - * @param diff A pointer to a git_diff_list pointer that will be allocated. - * @param repo The repository containing the tree. - * @param old_tree A git_tree object to diff from. - * @param opts Structure with options to influence diff or NULL for defaults. - */ -GIT_EXTERN(int) git_diff_tree_to_workdir( - git_diff_list **diff, - git_repository *repo, - git_tree *old_tree, - const git_diff_options *opts); /**< can be NULL for defaults */ - -/** - * Merge one diff list into another. - * - * This merges items from the "from" list into the "onto" list. The - * resulting diff list will have all items that appear in either list. - * If an item appears in both lists, then it will be "merged" to appear - * as if the old version was from the "onto" list and the new version - * is from the "from" list (with the exception that if the item has a - * pending DELETE in the middle, then it will show as deleted). - * - * @param onto Diff to merge into. - * @param from Diff to merge. - */ -GIT_EXTERN(int) git_diff_merge( - git_diff_list *onto, - const git_diff_list *from); - -/** - * Transform a diff list marking file renames, copies, etc. - * - * This modifies a diff list in place, replacing old entries that look - * like renames or copies with new entries reflecting those changes. - * This also will, if requested, break modified files into add/remove - * pairs if the amount of change is above a threshold. - * - * @param diff Diff list to run detection algorithms on - * @param options Control how detection should be run, NULL for defaults - * @return 0 on success, -1 on failure - */ -GIT_EXTERN(int) git_diff_find_similar( - git_diff_list *diff, - git_diff_find_options *options); - -/**@}*/ - - -/** @name Diff List Processor Functions - * - * These are the functions you apply to a diff list to process it - * or read it in some way. - */ -/**@{*/ - -/** - * Loop over all deltas in a diff list issuing callbacks. - * - * This will iterate through all of the files described in a diff. You - * should provide a file callback to learn about each file. - * - * The "hunk" and "line" callbacks are optional, and the text diff of the - * files will only be calculated if they are not NULL. Of course, these - * callbacks will not be invoked for binary files on the diff list or for - * files whose only changed is a file mode change. - * - * Returning a non-zero value from any of the callbacks will terminate - * the iteration and cause this return `GIT_EUSER`. - * - * @param diff A git_diff_list generated by one of the above functions. - * @param file_cb Callback function to make per file in the diff. - * @param hunk_cb Optional callback to make per hunk of text diff. This - * callback is called to describe a range of lines in the - * diff. It will not be issued for binary files. - * @param line_cb Optional callback to make per line of diff text. This - * same callback will be made for context lines, added, and - * removed lines, and even for a deleted trailing newline. - * @param payload Reference pointer that will be passed to your callbacks. - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_diff_foreach( - git_diff_list *diff, - git_diff_file_cb file_cb, - git_diff_hunk_cb hunk_cb, - git_diff_data_cb line_cb, - void *payload); - -/** - * Iterate over a diff generating text output like "git diff --name-status". - * - * Returning a non-zero value from the callbacks will terminate the - * iteration and cause this return `GIT_EUSER`. - * - * @param diff A git_diff_list generated by one of the above functions. - * @param print_cb Callback to make per line of diff text. - * @param payload Reference pointer that will be passed to your callback. - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_diff_print_compact( - git_diff_list *diff, - git_diff_data_cb print_cb, - void *payload); - -/** - * Look up the single character abbreviation for a delta status code. - * - * When you call `git_diff_print_compact` it prints single letter codes into - * the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. - * It is sometimes convenient to convert a git_delta_t value into these - * letters for your own purposes. This function does just that. By the - * way, unmodified will return a space (i.e. ' '). - * - * @param delta_t The git_delta_t value to look up - * @return The single character label for that code - */ -GIT_EXTERN(char) git_diff_status_char(git_delta_t status); - -/** - * Iterate over a diff generating text output like "git diff". - * - * This is a super easy way to generate a patch from a diff. - * - * Returning a non-zero value from the callbacks will terminate the - * iteration and cause this return `GIT_EUSER`. - * - * @param diff A git_diff_list generated by one of the above functions. - * @param payload Reference pointer that will be passed to your callbacks. - * @param print_cb Callback function to output lines of the diff. This - * same function will be called for file headers, hunk - * headers, and diff lines. Fortunately, you can probably - * use various GIT_DIFF_LINE constants to determine what - * text you are given. - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_diff_print_patch( - git_diff_list *diff, - git_diff_data_cb print_cb, - void *payload); - -/** - * Query how many diff records are there in a diff list. - * - * @param diff A git_diff_list generated by one of the above functions - * @return Count of number of deltas in the list - */ -GIT_EXTERN(size_t) git_diff_num_deltas(git_diff_list *diff); - -/** - * Query how many diff deltas are there in a diff list filtered by type. - * - * This works just like `git_diff_entrycount()` with an extra parameter - * that is a `git_delta_t` and returns just the count of how many deltas - * match that particular type. - * - * @param diff A git_diff_list generated by one of the above functions - * @param type A git_delta_t value to filter the count - * @return Count of number of deltas matching delta_t type - */ -GIT_EXTERN(size_t) git_diff_num_deltas_of_type( - git_diff_list *diff, - git_delta_t type); - -/** - * Return the diff delta and patch for an entry in the diff list. - * - * The `git_diff_patch` is a newly created object contains the text diffs - * for the delta. You have to call `git_diff_patch_free()` when you are - * done with it. You can use the patch object to loop over all the hunks - * and lines in the diff of the one delta. - * - * For an unchanged file or a binary file, no `git_diff_patch` will be - * created, the output will be set to NULL, and the `binary` flag will be - * set true in the `git_diff_delta` structure. - * - * The `git_diff_delta` pointer points to internal data and you do not have - * to release it when you are done with it. It will go away when the - * `git_diff_list` and `git_diff_patch` go away. - * - * It is okay to pass NULL for either of the output parameters; if you pass - * NULL for the `git_diff_patch`, then the text diff will not be calculated. - * - * @param patch_out Output parameter for the delta patch object - * @param delta_out Output parameter for the delta object - * @param diff Diff list object - * @param idx Index into diff list - * @return 0 on success, other value < 0 on error - */ -GIT_EXTERN(int) git_diff_get_patch( - git_diff_patch **patch_out, - const git_diff_delta **delta_out, - git_diff_list *diff, - size_t idx); - -/** - * Free a git_diff_patch object. - */ -GIT_EXTERN(void) git_diff_patch_free( - git_diff_patch *patch); - -/** - * Get the delta associated with a patch - */ -GIT_EXTERN(const git_diff_delta *) git_diff_patch_delta( - git_diff_patch *patch); - -/** - * Get the number of hunks in a patch - */ -GIT_EXTERN(size_t) git_diff_patch_num_hunks( - git_diff_patch *patch); - -/** - * Get the information about a hunk in a patch - * - * Given a patch and a hunk index into the patch, this returns detailed - * information about that hunk. Any of the output pointers can be passed - * as NULL if you don't care about that particular piece of information. - * - * @param range Output pointer to git_diff_range of hunk - * @param header Output pointer to header string for hunk. Unlike the - * content pointer for each line, this will be NUL-terminated - * @param header_len Output value of characters in header string - * @param lines_in_hunk Output count of total lines in this hunk - * @param patch Input pointer to patch object - * @param hunk_idx Input index of hunk to get information about - * @return 0 on success, GIT_ENOTFOUND if hunk_idx out of range, <0 on error - */ -GIT_EXTERN(int) git_diff_patch_get_hunk( - const git_diff_range **range, - const char **header, - size_t *header_len, - size_t *lines_in_hunk, - git_diff_patch *patch, - size_t hunk_idx); - -/** - * Get the number of lines in a hunk. - * - * @param patch The git_diff_patch object - * @param hunk_idx Index of the hunk - * @return Number of lines in hunk or -1 if invalid hunk index - */ -GIT_EXTERN(int) git_diff_patch_num_lines_in_hunk( - git_diff_patch *patch, - size_t hunk_idx); - -/** - * Get data about a line in a hunk of a patch. - * - * Given a patch, a hunk index, and a line index in the hunk, this - * will return a lot of details about that line. If you pass a hunk - * index larger than the number of hunks or a line index larger than - * the number of lines in the hunk, this will return -1. - * - * @param line_origin A GIT_DIFF_LINE constant from above - * @param content Pointer to content of diff line, not NUL-terminated - * @param content_len Number of characters in content - * @param old_lineno Line number in old file or -1 if line is added - * @param new_lineno Line number in new file or -1 if line is deleted - * @param patch The patch to look in - * @param hunk_idx The index of the hunk - * @param line_of_index The index of the line in the hunk - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_diff_patch_get_line_in_hunk( - char *line_origin, - const char **content, - size_t *content_len, - int *old_lineno, - int *new_lineno, - git_diff_patch *patch, - size_t hunk_idx, - size_t line_of_hunk); - -/** - * Serialize the patch to text via callback. - * - * Returning a non-zero value from the callback will terminate the iteration - * and cause this return `GIT_EUSER`. - * - * @param patch A git_diff_patch representing changes to one file - * @param print_cb Callback function to output lines of the patch. Will be - * called for file headers, hunk headers, and diff lines. - * @param payload Reference pointer that will be passed to your callbacks. - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_diff_patch_print( - git_diff_patch *patch, - git_diff_data_cb print_cb, - void *payload); - -/** - * Get the content of a patch as a single diff text. - * - * @param string Allocated string; caller must free. - * @param patch A git_diff_patch representing changes to one file - * @return 0 on success, <0 on failure. - */ -GIT_EXTERN(int) git_diff_patch_to_str( - char **string, - git_diff_patch *patch); - -/**@}*/ - - -/* - * Misc - */ - -/** - * Directly run a diff on two blobs. - * - * Compared to a file, a blob lacks some contextual information. As such, - * the `git_diff_file` given to the callback will have some fake data; i.e. - * `mode` will be 0 and `path` will be NULL. - * - * NULL is allowed for either `old_blob` or `new_blob` and will be treated - * as an empty blob, with the `oid` set to NULL in the `git_diff_file` data. - * - * We do run a binary content check on the two blobs and if either of the - * blobs looks like binary data, the `git_diff_delta` binary attribute will - * be set to 1 and no call to the hunk_cb nor line_cb will be made (unless - * you pass `GIT_DIFF_FORCE_TEXT` of course). - * - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_diff_blobs( - const git_blob *old_blob, - const git_blob *new_blob, - const git_diff_options *options, - git_diff_file_cb file_cb, - git_diff_hunk_cb hunk_cb, - git_diff_data_cb line_cb, - void *payload); - -/** - * Directly run a diff between a blob and a buffer. - * - * As with `git_diff_blobs`, comparing a blob and buffer lacks some context, - * so the `git_diff_file` parameters to the callbacks will be faked a la the - * rules for `git_diff_blobs()`. - * - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_diff_blob_to_buffer( - const git_blob *old_blob, - const char *buffer, - size_t buffer_len, - const git_diff_options *options, - git_diff_file_cb file_cb, - git_diff_hunk_cb hunk_cb, - git_diff_data_cb data_cb, - void *payload); - -GIT_END_DECL - -/** @} */ - -#endif diff --git a/git2/include/git2/errors.h b/git2/include/git2/errors.h deleted file mode 100644 index 9e0a1a9e6..000000000 --- a/git2/include/git2/errors.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_errors_h__ -#define INCLUDE_git_errors_h__ - -#include "common.h" - -/** - * @file git2/errors.h - * @brief Git error handling routines and variables - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Generic return codes */ -enum { - GIT_OK = 0, - GIT_ERROR = -1, - GIT_ENOTFOUND = -3, - GIT_EEXISTS = -4, - GIT_EAMBIGUOUS = -5, - GIT_EBUFS = -6, - GIT_EUSER = -7, - GIT_EBAREREPO = -8, - GIT_EORPHANEDHEAD = -9, - GIT_EUNMERGED = -10, - GIT_ENONFASTFORWARD = -11, - GIT_EINVALIDSPEC = -12, - - GIT_PASSTHROUGH = -30, - GIT_ITEROVER = -31, -}; - -typedef struct { - char *message; - int klass; -} git_error; - -/** Error classes */ -typedef enum { - GITERR_NOMEMORY, - GITERR_OS, - GITERR_INVALID, - GITERR_REFERENCE, - GITERR_ZLIB, - GITERR_REPOSITORY, - GITERR_CONFIG, - GITERR_REGEX, - GITERR_ODB, - GITERR_INDEX, - GITERR_OBJECT, - GITERR_NET, - GITERR_TAG, - GITERR_TREE, - GITERR_INDEXER, - GITERR_SSL, - GITERR_SUBMODULE, - GITERR_THREAD, - GITERR_STASH, - GITERR_CHECKOUT, - GITERR_FETCHHEAD, - GITERR_MERGE, -} git_error_t; - -/** - * Return the last `git_error` object that was generated for the - * current thread or NULL if no error has occurred. - * - * @return A git_error object. - */ -GIT_EXTERN(const git_error *) giterr_last(void); - -/** - * Clear the last library error that occurred for this thread. - */ -GIT_EXTERN(void) giterr_clear(void); - -/** - * Set the error message string for this thread. - * - * This function is public so that custom ODB backends and the like can - * relay an error message through libgit2. Most regular users of libgit2 - * will never need to call this function -- actually, calling it in most - * circumstances (for example, calling from within a callback function) - * will just end up having the value overwritten by libgit2 internals. - * - * This error message is stored in thread-local storage and only applies - * to the particular thread that this libgit2 call is made from. - * - * NOTE: Passing the `error_class` as GITERR_OS has a special behavior: we - * attempt to append the system default error message for the last OS error - * that occurred and then clear the last error. The specific implementation - * of looking up and clearing this last OS error will vary by platform. - * - * @param error_class One of the `git_error_t` enum above describing the - * general subsystem that is responsible for the error. - * @param message The formatted error message to keep - */ -GIT_EXTERN(void) giterr_set_str(int error_class, const char *string); - -/** - * Set the error message to a special value for memory allocation failure. - * - * The normal `giterr_set_str()` function attempts to `strdup()` the string - * that is passed in. This is not a good idea when the error in question - * is a memory allocation failure. That circumstance has a special setter - * function that sets the error string to a known and statically allocated - * internal value. - */ -GIT_EXTERN(void) giterr_set_oom(void); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/graph.h b/git2/include/git2/graph.h deleted file mode 100644 index 5850aa6e2..000000000 --- a/git2/include/git2/graph.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_graph_h__ -#define INCLUDE_git_graph_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/graph.h - * @brief Git graph traversal routines - * @defgroup git_revwalk Git graph traversal routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Count the number of unique commits between two commit objects - * - * @param ahead number of commits, starting at `one`, unique from commits in `two` - * @param behind number of commits, starting at `two`, unique from commits in `one` - * @param repo the repository where the commits exist - * @param one one of the commits - * @param two the other commit - */ -GIT_EXTERN(int) git_graph_ahead_behind(size_t *ahead, size_t *behind, git_repository *repo, const git_oid *one, const git_oid *two); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/ignore.h b/git2/include/git2/ignore.h deleted file mode 100644 index d0c1877a8..000000000 --- a/git2/include/git2/ignore.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_ignore_h__ -#define INCLUDE_git_ignore_h__ - -#include "common.h" -#include "types.h" - -GIT_BEGIN_DECL - -/** - * Add ignore rules for a repository. - * - * Excludesfile rules (i.e. .gitignore rules) are generally read from - * .gitignore files in the repository tree or from a shared system file - * only if a "core.excludesfile" config value is set. The library also - * keeps a set of per-repository internal ignores that can be configured - * in-memory and will not persist. This function allows you to add to - * that internal rules list. - * - * Example usage: - * - * error = git_ignore_add_rule(myrepo, "*.c\ndir/\nFile with space\n"); - * - * This would add three rules to the ignores. - * - * @param repo The repository to add ignore rules to. - * @param rules Text of rules, a la the contents of a .gitignore file. - * It is okay to have multiple rules in the text; if so, - * each rule should be terminated with a newline. - * @return 0 on success - */ -GIT_EXTERN(int) git_ignore_add_rule( - git_repository *repo, - const char *rules); - -/** - * Clear ignore rules that were explicitly added. - * - * Resets to the default internal ignore rules. This will not turn off - * rules in .gitignore files that actually exist in the filesystem. - * - * The default internal ignores ignore ".", ".." and ".git" entries. - * - * @param repo The repository to remove ignore rules from. - * @return 0 on success - */ -GIT_EXTERN(int) git_ignore_clear_internal_rules( - git_repository *repo); - -/** - * Test if the ignore rules apply to a given path. - * - * This function checks the ignore rules to see if they would apply to the - * given file. This indicates if the file would be ignored regardless of - * whether the file is already in the index or committed to the repository. - * - * One way to think of this is if you were to do "git add ." on the - * directory containing the file, would it be added or not? - * - * @param ignored boolean returning 0 if the file is not ignored, 1 if it is - * @param repo a repository object - * @param path the file to check ignores for, relative to the repo's workdir. - * @return 0 if ignore rules could be processed for the file (regardless - * of whether it exists or not), or an error < 0 if they could not. - */ -GIT_EXTERN(int) git_ignore_path_is_ignored( - int *ignored, - git_repository *repo, - const char *path); - -GIT_END_DECL - -#endif diff --git a/git2/include/git2/index.h b/git2/include/git2/index.h deleted file mode 100644 index 2df5103fd..000000000 --- a/git2/include/git2/index.h +++ /dev/null @@ -1,552 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_index_h__ -#define INCLUDE_git_index_h__ - -#include "common.h" -#include "indexer.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/index.h - * @brief Git index parsing and manipulation routines - * @defgroup git_index Git index parsing and manipulation routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#define GIT_IDXENTRY_NAMEMASK (0x0fff) -#define GIT_IDXENTRY_STAGEMASK (0x3000) -#define GIT_IDXENTRY_EXTENDED (0x4000) -#define GIT_IDXENTRY_VALID (0x8000) -#define GIT_IDXENTRY_STAGESHIFT 12 - -/* - * Flags are divided into two parts: in-memory flags and - * on-disk ones. Flags in GIT_IDXENTRY_EXTENDED_FLAGS - * will get saved on-disk. - * - * In-memory only flags: - */ -#define GIT_IDXENTRY_UPDATE (1 << 0) -#define GIT_IDXENTRY_REMOVE (1 << 1) -#define GIT_IDXENTRY_UPTODATE (1 << 2) -#define GIT_IDXENTRY_ADDED (1 << 3) - -#define GIT_IDXENTRY_HASHED (1 << 4) -#define GIT_IDXENTRY_UNHASHED (1 << 5) -#define GIT_IDXENTRY_WT_REMOVE (1 << 6) /* remove in work directory */ -#define GIT_IDXENTRY_CONFLICTED (1 << 7) - -#define GIT_IDXENTRY_UNPACKED (1 << 8) -#define GIT_IDXENTRY_NEW_SKIP_WORKTREE (1 << 9) - -/* - * Extended on-disk flags: - */ -#define GIT_IDXENTRY_INTENT_TO_ADD (1 << 13) -#define GIT_IDXENTRY_SKIP_WORKTREE (1 << 14) -/* GIT_IDXENTRY_EXTENDED2 is for future extension */ -#define GIT_IDXENTRY_EXTENDED2 (1 << 15) - -#define GIT_IDXENTRY_EXTENDED_FLAGS (GIT_IDXENTRY_INTENT_TO_ADD | GIT_IDXENTRY_SKIP_WORKTREE) - -/** Time used in a git index entry */ -typedef struct { - git_time_t seconds; - /* nsec should not be stored as time_t compatible */ - unsigned int nanoseconds; -} git_index_time; - -/** Memory representation of a file entry in the index. */ -typedef struct git_index_entry { - git_index_time ctime; - git_index_time mtime; - - unsigned int dev; - unsigned int ino; - unsigned int mode; - unsigned int uid; - unsigned int gid; - git_off_t file_size; - - git_oid oid; - - unsigned short flags; - unsigned short flags_extended; - - char *path; -} git_index_entry; - -/** Representation of a resolve undo entry in the index. */ -typedef struct git_index_reuc_entry { - unsigned int mode[3]; - git_oid oid[3]; - char *path; -} git_index_reuc_entry; - -/** Capabilities of system that affect index actions. */ -enum { - GIT_INDEXCAP_IGNORE_CASE = 1, - GIT_INDEXCAP_NO_FILEMODE = 2, - GIT_INDEXCAP_NO_SYMLINKS = 4, - GIT_INDEXCAP_FROM_OWNER = ~0u -}; - -/** @name Index File Functions - * - * These functions work on the index file itself. - */ -/**@{*/ - -/** - * Create a new bare Git index object as a memory representation - * of the Git index file in 'index_path', without a repository - * to back it. - * - * Since there is no ODB or working directory behind this index, - * any Index methods which rely on these (e.g. index_add) will - * fail with the GIT_EBAREINDEX error code. - * - * If you need to access the index of an actual repository, - * use the `git_repository_index` wrapper. - * - * The index must be freed once it's no longer in use. - * - * @param out the pointer for the new index - * @param index_path the path to the index file in disk - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_open(git_index **out, const char *index_path); - -/** - * Create an in-memory index object. - * - * This index object cannot be read/written to the filesystem, - * but may be used to perform in-memory index operations. - * - * The index must be freed once it's no longer in use. - * - * @param out the pointer for the new index - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_new(git_index **out); - -/** - * Free an existing index object. - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_free(git_index *index); - -/** - * Get the repository this index relates to - * - * @param index The index - * @return A pointer to the repository - */ -GIT_EXTERN(git_repository *) git_index_owner(const git_index *index); - -/** - * Read index capabilities flags. - * - * @param index An existing index object - * @return A combination of GIT_INDEXCAP values - */ -GIT_EXTERN(unsigned int) git_index_caps(const git_index *index); - -/** - * Set index capabilities flags. - * - * If you pass `GIT_INDEXCAP_FROM_OWNER` for the caps, then the - * capabilities will be read from the config of the owner object, - * looking at `core.ignorecase`, `core.filemode`, `core.symlinks`. - * - * @param index An existing index object - * @param caps A combination of GIT_INDEXCAP values - * @return 0 on success, -1 on failure - */ -GIT_EXTERN(int) git_index_set_caps(git_index *index, unsigned int caps); - -/** - * Update the contents of an existing index object in memory - * by reading from the hard disk. - * - * @param index an existing index object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_read(git_index *index); - -/** - * Write an existing index object from memory back to disk - * using an atomic file lock. - * - * @param index an existing index object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_write(git_index *index); - -/** - * Read a tree into the index file with stats - * - * The current index contents will be replaced by the specified tree. - * - * @param index an existing index object - * @param tree tree to read - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_read_tree(git_index *index, const git_tree *tree); - -/** - * Write the index as a tree - * - * This method will scan the index and write a representation - * of its current state back to disk; it recursively creates - * tree objects for each of the subtrees stored in the index, - * but only returns the OID of the root tree. This is the OID - * that can be used e.g. to create a commit. - * - * The index instance cannot be bare, and needs to be associated - * to an existing repository. - * - * The index must not contain any file in conflict. - * - * @param out Pointer where to store the OID of the written tree - * @param index Index to write - * @return 0 on success, GIT_EUNMERGED when the index is not clean - * or an error code - */ -GIT_EXTERN(int) git_index_write_tree(git_oid *out, git_index *index); - -/** - * Write the index as a tree to the given repository - * - * This method will do the same as `git_index_write_tree`, but - * letting the user choose the repository where the tree will - * be written. - * - * The index must not contain any file in conflict. - * - * @param out Pointer where to store OID of the the written tree - * @param index Index to write - * @param repo Repository where to write the tree - * @return 0 on success, GIT_EUNMERGED when the index is not clean - * or an error code - */ -GIT_EXTERN(int) git_index_write_tree_to(git_oid *out, git_index *index, git_repository *repo); - -/**@}*/ - -/** @name Raw Index Entry Functions - * - * These functions work on index entries, and allow for raw manipulation - * of the entries. - */ -/**@{*/ - -/* Index entry manipulation */ - -/** - * Get the count of entries currently in the index - * - * @param index an existing index object - * @return integer of count of current entries - */ -GIT_EXTERN(size_t) git_index_entrycount(const git_index *index); - -/** - * Clear the contents (all the entries) of an index object. - * This clears the index object in memory; changes must be manually - * written to disk for them to take effect. - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_clear(git_index *index); - -/** - * Get a pointer to one of the entries in the index - * - * The values of this entry can be modified (except the path) - * and the changes will be written back to disk on the next - * write() call. - * - * The entry should not be freed by the caller. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the entry; NULL if out of bounds - */ -GIT_EXTERN(const git_index_entry *) git_index_get_byindex( - git_index *index, size_t n); - -/** - * Get a pointer to one of the entries in the index - * - * The values of this entry can be modified (except the path) - * and the changes will be written back to disk on the next - * write() call. - * - * The entry should not be freed by the caller. - * - * @param index an existing index object - * @param path path to search - * @param stage stage to search - * @return a pointer to the entry; NULL if it was not found - */ -GIT_EXTERN(const git_index_entry *) git_index_get_bypath( - git_index *index, const char *path, int stage); - -/** - * Remove an entry from the index - * - * @param index an existing index object - * @param path path to search - * @param stage stage to search - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_remove(git_index *index, const char *path, int stage); - -/** - * Remove all entries from the index under a given directory - * - * @param index an existing index object - * @param dir container directory path - * @param stage stage to search - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_remove_directory( - git_index *index, const char *dir, int stage); - -/** - * Add or update an index entry from an in-memory struct - * - * If a previous index entry exists that has the same path and stage - * as the given 'source_entry', it will be replaced. Otherwise, the - * 'source_entry' will be added. - * - * A full copy (including the 'path' string) of the given - * 'source_entry' will be inserted on the index. - * - * @param index an existing index object - * @param source_entry new entry object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_add(git_index *index, const git_index_entry *source_entry); - -/** - * Return the stage number from a git index entry - * - * This entry is calculated from the entry's flag - * attribute like this: - * - * (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT - * - * @param entry The entry - * @returns the stage number - */ -GIT_EXTERN(int) git_index_entry_stage(const git_index_entry *entry); - -/**@}*/ - -/** @name Workdir Index Entry Functions - * - * These functions work on index entries specifically in the working - * directory (ie, stage 0). - */ -/**@{*/ - -/** - * Add or update an index entry from a file in disk - * - * The file `path` must be relative to the repository's - * working folder and must be readable. - * - * This method will fail in bare index instances. - * - * This forces the file to be added to the index, not looking - * at gitignore rules. Those rules can be evaluated through - * the git_status APIs (in status.h) before calling this. - * - * If this file currently is the result of a merge conflict, this - * file will no longer be marked as conflicting. The data about - * the conflict will be moved to the "resolve undo" (REUC) section. - * - * @param index an existing index object - * @param path filename to add - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_add_from_workdir(git_index *index, const char *path); - -/** - * Find the first index of any entries which point to given - * path in the Git index. - * - * @param index an existing index object - * @param path path to search - * @return an index >= 0 if found, -1 otherwise - */ -GIT_EXTERN(int) git_index_find(git_index *index, const char *path); - -/**@}*/ - -/** @name Conflict Index Entry Functions - * - * These functions work on conflict index entries specifically (ie, stages 1-3) - */ -/**@{*/ - -/** - * Add or update index entries to represent a conflict - * - * The entries are the entries from the tree included in the merge. Any - * entry may be null to indicate that that file was not present in the - * trees during the merge. For example, ancestor_entry may be NULL to - * indicate that a file was added in both branches and must be resolved. - * - * @param index an existing index object - * @param ancestor_entry the entry data for the ancestor of the conflict - * @param our_entry the entry data for our side of the merge conflict - * @param their_entry the entry data for their side of the merge conflict - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_conflict_add( - git_index *index, - const git_index_entry *ancestor_entry, - const git_index_entry *our_entry, - const git_index_entry *their_entry); - -/** - * Get the index entries that represent a conflict of a single file. - * - * The values of this entry can be modified (except the paths) - * and the changes will be written back to disk on the next - * write() call. - * - * @param ancestor_out Pointer to store the ancestor entry - * @param our_out Pointer to store the our entry - * @param their_out Pointer to store the their entry - * @param index an existing index object - * @param path path to search - */ -GIT_EXTERN(int) git_index_conflict_get(git_index_entry **ancestor_out, git_index_entry **our_out, git_index_entry **their_out, git_index *index, const char *path); - -/** - * Removes the index entries that represent a conflict of a single file. - * - * @param index an existing index object - * @param path to search - */ -GIT_EXTERN(int) git_index_conflict_remove(git_index *index, const char *path); - -/** - * Remove all conflicts in the index (entries with a stage greater than 0.) - * - * @param index an existing index object - */ -GIT_EXTERN(void) git_index_conflict_cleanup(git_index *index); - -/** - * Determine if the index contains entries representing file conflicts. - * - * @return 1 if at least one conflict is found, 0 otherwise. - */ -GIT_EXTERN(int) git_index_has_conflicts(const git_index *index); - -/**@}*/ - -/** @name Resolve Undo (REUC) index entry manipulation. - * - * These functions work on the Resolve Undo index extension and contains - * data about the original files that led to a merge conflict. - */ -/**@{*/ - -/** - * Get the count of resolve undo entries currently in the index. - * - * @param index an existing index object - * @return integer of count of current resolve undo entries - */ -GIT_EXTERN(unsigned int) git_index_reuc_entrycount(git_index *index); - -/** - * Finds the resolve undo entry that points to the given path in the Git - * index. - * - * @param index an existing index object - * @param path path to search - * @return an index >= 0 if found, -1 otherwise - */ -GIT_EXTERN(int) git_index_reuc_find(git_index *index, const char *path); - -/** - * Get a resolve undo entry from the index. - * - * The returned entry is read-only and should not be modified - * or freed by the caller. - * - * @param index an existing index object - * @param path path to search - * @return the resolve undo entry; NULL if not found - */ -GIT_EXTERN(const git_index_reuc_entry *) git_index_reuc_get_bypath(git_index *index, const char *path); - -/** - * Get a resolve undo entry from the index. - * - * The returned entry is read-only and should not be modified - * or freed by the caller. - * - * @param index an existing index object - * @param n the position of the entry - * @return a pointer to the resolve undo entry; NULL if out of bounds - */ -GIT_EXTERN(const git_index_reuc_entry *) git_index_reuc_get_byindex(git_index *index, size_t n); - -/** - * Adds a resolve undo entry for a file based on the given parameters. - * - * The resolve undo entry contains the OIDs of files that were involved - * in a merge conflict after the conflict has been resolved. This allows - * conflicts to be re-resolved later. - * - * If there exists a resolve undo entry for the given path in the index, - * it will be removed. - * - * This method will fail in bare index instances. - * - * @param index an existing index object - * @param path filename to add - * @param ancestor_mode mode of the ancestor file - * @param ancestor_id oid of the ancestor file - * @param our_mode mode of our file - * @param our_id oid of our file - * @param their_mode mode of their file - * @param their_id oid of their file - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_reuc_add(git_index *index, const char *path, - int ancestor_mode, git_oid *ancestor_id, - int our_mode, git_oid *our_id, - int their_mode, git_oid *their_id); - -/** - * Remove an resolve undo entry from the index - * - * @param index an existing index object - * @param n position of the resolve undo entry to remove - * @return 0 or an error code - */ -GIT_EXTERN(int) git_index_reuc_remove(git_index *index, size_t n); - -/**@}*/ - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/indexer.h b/git2/include/git2/indexer.h deleted file mode 100644 index c428d43a8..000000000 --- a/git2/include/git2/indexer.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef _INCLUDE_git_indexer_h__ -#define _INCLUDE_git_indexer_h__ - -#include "common.h" -#include "oid.h" - -GIT_BEGIN_DECL - -/** - * This is passed as the first argument to the callback to allow the - * user to see the progress. - */ -typedef struct git_transfer_progress { - unsigned int total_objects; - unsigned int indexed_objects; - unsigned int received_objects; - size_t received_bytes; -} git_transfer_progress; - - -/** - * Type for progress callbacks during indexing - */ -typedef void (*git_transfer_progress_callback)(const git_transfer_progress *stats, void *payload); - -typedef struct git_indexer git_indexer; -typedef struct git_indexer_stream git_indexer_stream; - -/** - * Create a new streaming indexer instance - * - * @param out where to store the indexer instance - * @param path to the directory where the packfile should be stored - * @param progress_cb function to call with progress information - * @param progress_payload payload for the progress callback - */ -GIT_EXTERN(int) git_indexer_stream_new( - git_indexer_stream **out, - const char *path, - git_transfer_progress_callback progress_cb, - void *progress_cb_payload); - -/** - * Add data to the indexer - * - * @param idx the indexer - * @param data the data to add - * @param size the size of the data in bytes - * @param stats stat storage - */ -GIT_EXTERN(int) git_indexer_stream_add(git_indexer_stream *idx, const void *data, size_t size, git_transfer_progress *stats); - -/** - * Finalize the pack and index - * - * Resolve any pending deltas and write out the index file - * - * @param idx the indexer - */ -GIT_EXTERN(int) git_indexer_stream_finalize(git_indexer_stream *idx, git_transfer_progress *stats); - -/** - * Get the packfile's hash - * - * A packfile's name is derived from the sorted hashing of all object - * names. This is only correct after the index has been finalized. - * - * @param idx the indexer instance - */ -GIT_EXTERN(const git_oid *) git_indexer_stream_hash(const git_indexer_stream *idx); - -/** - * Free the indexer and its resources - * - * @param idx the indexer to free - */ -GIT_EXTERN(void) git_indexer_stream_free(git_indexer_stream *idx); - -/** - * Create a new indexer instance - * - * @param out where to store the indexer instance - * @param packname the absolute filename of the packfile to index - */ -GIT_EXTERN(int) git_indexer_new(git_indexer **out, const char *packname); - -/** - * Iterate over the objects in the packfile and extract the information - * - * Indexing a packfile can be very expensive so this function is - * expected to be run in a worker thread and the stats used to provide - * feedback the user. - * - * @param idx the indexer instance - * @param stats storage for the running state - */ -GIT_EXTERN(int) git_indexer_run(git_indexer *idx, git_transfer_progress *stats); - -/** - * Write the index file to disk. - * - * The file will be stored as pack-$hash.idx in the same directory as - * the packfile. - * - * @param idx the indexer instance - */ -GIT_EXTERN(int) git_indexer_write(git_indexer *idx); - -/** - * Get the packfile's hash - * - * A packfile's name is derived from the sorted hashing of all object - * names. This is only correct after the index has been written to disk. - * - * @param idx the indexer instance - */ -GIT_EXTERN(const git_oid *) git_indexer_hash(const git_indexer *idx); - -/** - * Free the indexer and its resources - * - * @param idx the indexer to free - */ -GIT_EXTERN(void) git_indexer_free(git_indexer *idx); - -GIT_END_DECL - -#endif diff --git a/git2/include/git2/merge.h b/git2/include/git2/merge.h deleted file mode 100644 index f4c5d9881..000000000 --- a/git2/include/git2/merge.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_merge_h__ -#define INCLUDE_git_merge_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/merge.h - * @brief Git merge-base routines - * @defgroup git_revwalk Git merge-base routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Find a merge base between two commits - * - * @param out the OID of a merge base between 'one' and 'two' - * @param repo the repository where the commits exist - * @param one one of the commits - * @param two the other commit - * @return Zero on success; GIT_ENOTFOUND or -1 on failure. - */ -GIT_EXTERN(int) git_merge_base( - git_oid *out, - git_repository *repo, - const git_oid *one, - const git_oid *two); - -/** - * Find a merge base given a list of commits - * - * @param out the OID of a merge base considering all the commits - * @param repo the repository where the commits exist - * @param input_array oids of the commits - * @param length The number of commits in the provided `input_array` - * @return Zero on success; GIT_ENOTFOUND or -1 on failure. - */ -GIT_EXTERN(int) git_merge_base_many( - git_oid *out, - git_repository *repo, - const git_oid input_array[], - size_t length); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/message.h b/git2/include/git2/message.h deleted file mode 100644 index 395c88690..000000000 --- a/git2/include/git2/message.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_message_h__ -#define INCLUDE_git_message_h__ - -#include "common.h" - -/** - * @file git2/message.h - * @brief Git message management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Clean up message from excess whitespace and make sure that the last line - * ends with a '\n'. - * - * Optionally, can remove lines starting with a "#". - * - * @param out The user-allocated buffer which will be filled with the - * cleaned up message. Pass NULL if you just want to get the needed - * size of the prettified message as the output value. - * - * @param out_size Size of the `out` buffer in bytes. - * - * @param message The message to be prettified. - * - * @param strip_comments Non-zero to remove lines starting with "#", 0 to - * leave them in. - * - * @return -1 on error, else number of characters in prettified message - * including the trailing NUL byte - */ -GIT_EXTERN(int) git_message_prettify( - char *out, - size_t out_size, - const char *message, - int strip_comments); - -/** @} */ -GIT_END_DECL - -#endif /* INCLUDE_git_message_h__ */ diff --git a/git2/include/git2/net.h b/git2/include/git2/net.h deleted file mode 100644 index 6e3525f5d..000000000 --- a/git2/include/git2/net.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_net_h__ -#define INCLUDE_git_net_h__ - -#include "common.h" -#include "oid.h" -#include "types.h" - -/** - * @file git2/net.h - * @brief Git networking declarations - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -#define GIT_DEFAULT_PORT "9418" - -/* - * We need this because we need to know whether we should call - * git-upload-pack or git-receive-pack on the remote end when get_refs - * gets called. - */ - -typedef enum { - GIT_DIRECTION_FETCH = 0, - GIT_DIRECTION_PUSH = 1 -} git_direction; - - -/** - * Remote head description, given out on `ls` calls. - */ -struct git_remote_head { - int local:1; /* available locally */ - git_oid oid; - git_oid loid; - char *name; -}; - -/** - * Callback for listing the remote heads - */ -typedef int (*git_headlist_cb)(git_remote_head *rhead, void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/notes.h b/git2/include/git2/notes.h deleted file mode 100644 index c51d3732a..000000000 --- a/git2/include/git2/notes.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_note_h__ -#define INCLUDE_git_note_h__ - -#include "oid.h" - -/** - * @file git2/notes.h - * @brief Git notes management routines - * @defgroup git_note Git notes management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Callback for git_note_foreach. - * - * Receives: - * - blob_id: Oid of the blob containing the message - * - annotated_object_id: Oid of the git object being annotated - * - payload: Payload data passed to `git_note_foreach` - */ -typedef int (*git_note_foreach_cb)( - const git_oid *blob_id, const git_oid *annotated_object_id, void *payload); - -/** - * Read the note for an object - * - * The note must be freed manually by the user. - * - * @param out pointer to the read note; NULL in case of error - * @param repo repository where to look up the note - * @param notes_ref canonical name of the reference to use (optional); defaults to - * "refs/notes/commits" - * @param oid OID of the git object to read the note from - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_read( - git_note **out, - git_repository *repo, - const char *notes_ref, - const git_oid *oid); - -/** - * Get the note message - * - * @param note - * @return the note message - */ -GIT_EXTERN(const char *) git_note_message(const git_note *note); - - -/** - * Get the note object OID - * - * @param note - * @return the note object OID - */ -GIT_EXTERN(const git_oid *) git_note_oid(const git_note *note); - -/** - * Add a note for an object - * - * @param out pointer to store the OID (optional); NULL in case of error - * @param repo repository where to store the note - * @param author signature of the notes commit author - * @param committer signature of the notes commit committer - * @param notes_ref canonical name of the reference to use (optional); - * defaults to "refs/notes/commits" - * @param oid OID of the git object to decorate - * @param note Content of the note to add for object oid - * @param force Overwrite existing note - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_create( - git_oid *out, - git_repository *repo, - const git_signature *author, - const git_signature *committer, - const char *notes_ref, - const git_oid *oid, - const char *note, - int force); - - -/** - * Remove the note for an object - * - * @param repo repository where the note lives - * @param notes_ref canonical name of the reference to use (optional); - * defaults to "refs/notes/commits" - * @param author signature of the notes commit author - * @param committer signature of the notes commit committer - * @param oid OID of the git object to remove the note from - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_remove( - git_repository *repo, - const char *notes_ref, - const git_signature *author, - const git_signature *committer, - const git_oid *oid); - -/** - * Free a git_note object - * - * @param note git_note object - */ -GIT_EXTERN(void) git_note_free(git_note *note); - -/** - * Get the default notes reference for a repository - * - * @param out Pointer to the default notes reference - * @param repo The Git repository - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_note_default_ref(const char **out, git_repository *repo); - -/** - * Loop over all the notes within a specified namespace - * and issue a callback for each one. - * - * @param repo Repository where to find the notes. - * - * @param notes_ref Reference to read from (optional); defaults to - * "refs/notes/commits". - * - * @param note_cb Callback to invoke per found annotation. Return non-zero - * to stop looping. - * - * @param payload Extra parameter to callback function. - * - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_note_foreach( - git_repository *repo, - const char *notes_ref, - git_note_foreach_cb note_cb, - void *payload); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/object.h b/git2/include/git2/object.h deleted file mode 100644 index e029f0125..000000000 --- a/git2/include/git2/object.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_object_h__ -#define INCLUDE_git_object_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/object.h - * @brief Git revision object management routines - * @defgroup git_object Git revision object management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a reference to one of the objects in a repository. - * - * The generated reference is owned by the repository and - * should be closed with the `git_object_free` method - * instead of free'd manually. - * - * The 'type' parameter must match the type of the object - * in the odb; the method will fail otherwise. - * The special value 'GIT_OBJ_ANY' may be passed to let - * the method guess the object's type. - * - * @param object pointer to the looked-up object - * @param repo the repository to look up the object - * @param id the unique identifier for the object - * @param type the type of the object - * @return a reference to the object - */ -GIT_EXTERN(int) git_object_lookup( - git_object **object, - git_repository *repo, - const git_oid *id, - git_otype type); - -/** - * Lookup a reference to one of the objects in a repository, - * given a prefix of its identifier (short id). - * - * The object obtained will be so that its identifier - * matches the first 'len' hexadecimal characters - * (packets of 4 bits) of the given 'id'. - * 'len' must be at least GIT_OID_MINPREFIXLEN, and - * long enough to identify a unique object matching - * the prefix; otherwise the method will fail. - * - * The generated reference is owned by the repository and - * should be closed with the `git_object_free` method - * instead of free'd manually. - * - * The 'type' parameter must match the type of the object - * in the odb; the method will fail otherwise. - * The special value 'GIT_OBJ_ANY' may be passed to let - * the method guess the object's type. - * - * @param object_out pointer where to store the looked-up object - * @param repo the repository to look up the object - * @param id a short identifier for the object - * @param len the length of the short identifier - * @param type the type of the object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_object_lookup_prefix( - git_object **object_out, - git_repository *repo, - const git_oid *id, - size_t len, - git_otype type); - -/** - * Get the id (SHA1) of a repository object - * - * @param obj the repository object - * @return the SHA1 id - */ -GIT_EXTERN(const git_oid *) git_object_id(const git_object *obj); - -/** - * Get the object type of an object - * - * @param obj the repository object - * @return the object's type - */ -GIT_EXTERN(git_otype) git_object_type(const git_object *obj); - -/** - * Get the repository that owns this object - * - * Freeing or calling `git_repository_close` on the - * returned pointer will invalidate the actual object. - * - * Any other operation may be run on the repository without - * affecting the object. - * - * @param obj the object - * @return the repository who owns this object - */ -GIT_EXTERN(git_repository *) git_object_owner(const git_object *obj); - -/** - * Close an open object - * - * This method instructs the library to close an existing - * object; note that git_objects are owned and cached by the repository - * so the object may or may not be freed after this library call, - * depending on how aggressive is the caching mechanism used - * by the repository. - * - * IMPORTANT: - * It *is* necessary to call this method when you stop using - * an object. Failure to do so will cause a memory leak. - * - * @param object the object to close - */ -GIT_EXTERN(void) git_object_free(git_object *object); - -/** - * Convert an object type to it's string representation. - * - * The result is a pointer to a string in static memory and - * should not be free()'ed. - * - * @param type object type to convert. - * @return the corresponding string representation. - */ -GIT_EXTERN(const char *) git_object_type2string(git_otype type); - -/** - * Convert a string object type representation to it's git_otype. - * - * @param str the string to convert. - * @return the corresponding git_otype. - */ -GIT_EXTERN(git_otype) git_object_string2type(const char *str); - -/** - * Determine if the given git_otype is a valid loose object type. - * - * @param type object type to test. - * @return true if the type represents a valid loose object type, - * false otherwise. - */ -GIT_EXTERN(int) git_object_typeisloose(git_otype type); - -/** - * Get the size in bytes for the structure which - * acts as an in-memory representation of any given - * object type. - * - * For all the core types, this would the equivalent - * of calling `sizeof(git_commit)` if the core types - * were not opaque on the external API. - * - * @param type object type to get its size - * @return size in bytes of the object - */ -GIT_EXTERN(size_t) git_object__size(git_otype type); - -/** - * Recursively peel an object until an object of the specified type is met. - * - * The retrieved `peeled` object is owned by the repository and should be - * closed with the `git_object_free` method. - * - * If you pass `GIT_OBJ_ANY` as the target type, then the object will be - * peeled until the type changes (e.g. a tag will be chased until the - * referenced object is no longer a tag). - * - * @param peeled Pointer to the peeled git_object - * @param object The object to be processed - * @param target_type The type of the requested object (GIT_OBJ_COMMIT, - * GIT_OBJ_TAG, GIT_OBJ_TREE, GIT_OBJ_BLOB or GIT_OBJ_ANY). - * @return 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code - */ -GIT_EXTERN(int) git_object_peel( - git_object **peeled, - const git_object *object, - git_otype target_type); - -/** @} */ -GIT_END_DECL - -#endif diff --git a/git2/include/git2/odb.h b/git2/include/git2/odb.h deleted file mode 100644 index f39e7b541..000000000 --- a/git2/include/git2/odb.h +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_odb_h__ -#define INCLUDE_git_odb_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "odb_backend.h" -#include "indexer.h" - -/** - * @file git2/odb.h - * @brief Git object database routines - * @defgroup git_odb Git object database routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new object database with no backends. - * - * Before the ODB can be used for read/writing, a custom database - * backend must be manually added using `git_odb_add_backend()` - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_new(git_odb **out); - -/** - * Create a new object database and automatically add - * the two default backends: - * - * - git_odb_backend_loose: read and write loose object files - * from disk, assuming `objects_dir` as the Objects folder - * - * - git_odb_backend_pack: read objects from packfiles, - * assuming `objects_dir` as the Objects folder which - * contains a 'pack/' folder with the corresponding data - * - * @param out location to store the database pointer, if opened. - * Set to NULL if the open failed. - * @param objects_dir path of the backends' "objects" directory. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_open(git_odb **out, const char *objects_dir); - -/** - * Add a custom backend to an existing Object DB - * - * The backends are checked in relative ordering, based on the - * value of the `priority` parameter. - * - * Read for more information. - * - * @param odb database to add the backend to - * @param backend pointer to a git_odb_backend instance - * @param priority Value for ordering the backends queue - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority); - -/** - * Add a custom backend to an existing Object DB; this - * backend will work as an alternate. - * - * Alternate backends are always checked for objects *after* - * all the main backends have been exhausted. - * - * The backends are checked in relative ordering, based on the - * value of the `priority` parameter. - * - * Writing is disabled on alternate backends. - * - * Read for more information. - * - * @param odb database to add the backend to - * @param backend pointer to a git_odb_backend instance - * @param priority Value for ordering the backends queue - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority); - -/** - * Add an on-disk alternate to an existing Object DB. - * - * Note that the added path must point to an `objects`, not - * to a full repository, to use it as an alternate store. - * - * Alternate backends are always checked for objects *after* - * all the main backends have been exhausted. - * - * Writing is disabled on alternate backends. - * - * @param odb database to add the backend to - * @param path path to the objects folder for the alternate - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_odb_add_disk_alternate(git_odb *odb, const char *path); - -/** - * Close an open object database. - * - * @param db database pointer to close. If NULL no action is taken. - */ -GIT_EXTERN(void) git_odb_free(git_odb *db); - -/** - * Read an object from the database. - * - * This method queries all available ODB backends - * trying to read the given OID. - * - * The returned object is reference counted and - * internally cached, so it should be closed - * by the user once it's no longer in use. - * - * @param out pointer where to store the read object - * @param db database to search for the object in. - * @param id identity of the object to read. - * @return - * - 0 if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - */ -GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id); - -/** - * Read an object from the database, given a prefix - * of its identifier. - * - * This method queries all available ODB backends - * trying to match the 'len' first hexadecimal - * characters of the 'short_id'. - * The remaining (GIT_OID_HEXSZ-len)*4 bits of - * 'short_id' must be 0s. - * 'len' must be at least GIT_OID_MINPREFIXLEN, - * and the prefix must be long enough to identify - * a unique object in all the backends; the - * method will fail otherwise. - * - * The returned object is reference counted and - * internally cached, so it should be closed - * by the user once it's no longer in use. - * - * @param out pointer where to store the read object - * @param db database to search for the object in. - * @param short_id a prefix of the id of the object to read. - * @param len the length of the prefix - * @return - * - 0 if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - * - GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix) - */ -GIT_EXTERN(int) git_odb_read_prefix(git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len); - -/** - * Read the header of an object from the database, without - * reading its full contents. - * - * The header includes the length and the type of an object. - * - * Note that most backends do not support reading only the header - * of an object, so the whole object will be read and then the - * header will be returned. - * - * @param len_out pointer where to store the length - * @param type_out pointer where to store the type - * @param db database to search for the object in. - * @param id identity of the object to read. - * @return - * - 0 if the object was read; - * - GIT_ENOTFOUND if the object is not in the database. - */ -GIT_EXTERN(int) git_odb_read_header(size_t *len_out, git_otype *type_out, git_odb *db, const git_oid *id); - -/** - * Determine if the given object can be found in the object database. - * - * @param db database to be searched for the given object. - * @param id the object to search for. - * @return - * - 1, if the object was found - * - 0, otherwise - */ -GIT_EXTERN(int) git_odb_exists(git_odb *db, const git_oid *id); - -/** - * List all objects available in the database - * - * The callback will be called for each object available in the - * database. Note that the objects are likely to be returned in the index - * order, which would make accessing the objects in that order inefficient. - * Return a non-zero value from the callback to stop looping. - * - * @param db database to use - * @param cb the callback to call for each object - * @param payload data to pass to the callback - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_odb_foreach(git_odb *db, git_odb_foreach_cb cb, void *payload); - -/** - * Write an object directly into the ODB - * - * This method writes a full object straight into the ODB. - * For most cases, it is preferred to write objects through a write - * stream, which is both faster and less memory intensive, specially - * for big objects. - * - * This method is provided for compatibility with custom backends - * which are not able to support streaming writes - * - * @param out pointer to store the OID result of the write - * @param odb object database where to store the object - * @param data buffer with the data to store - * @param len size of the buffer - * @param type type of the data to store - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_write(git_oid *out, git_odb *odb, const void *data, size_t len, git_otype type); - -/** - * Open a stream to write an object into the ODB - * - * The type and final length of the object must be specified - * when opening the stream. - * - * The returned stream will be of type `GIT_STREAM_WRONLY` and - * will have the following methods: - * - * - stream->write: write `n` bytes into the stream - * - stream->finalize_write: close the stream and store the object in - * the odb - * - stream->free: free the stream - * - * The streaming write won't be effective until `stream->finalize_write` - * is called and returns without an error - * - * The stream must always be free'd or will leak memory. - * - * @see git_odb_stream - * - * @param out pointer where to store the stream - * @param db object database where the stream will write - * @param size final size of the object that will be written - * @param type type of the object that will be written - * @return 0 if the stream was created; error code otherwise - */ -GIT_EXTERN(int) git_odb_open_wstream(git_odb_stream **out, git_odb *db, size_t size, git_otype type); - -/** - * Open a stream to read an object from the ODB - * - * Note that most backends do *not* support streaming reads - * because they store their objects as compressed/delta'ed blobs. - * - * It's recommended to use `git_odb_read` instead, which is - * assured to work on all backends. - * - * The returned stream will be of type `GIT_STREAM_RDONLY` and - * will have the following methods: - * - * - stream->read: read `n` bytes from the stream - * - stream->free: free the stream - * - * The stream must always be free'd or will leak memory. - * - * @see git_odb_stream - * - * @param out pointer where to store the stream - * @param db object database where the stream will read from - * @param oid oid of the object the stream will read from - * @return 0 if the stream was created; error code otherwise - */ -GIT_EXTERN(int) git_odb_open_rstream(git_odb_stream **out, git_odb *db, const git_oid *oid); - -/** - * Open a stream for writing a pack file to the ODB. - * - * If the ODB layer understands pack files, then the given - * packfile will likely be streamed directly to disk (and a - * corresponding index created). If the ODB layer does not - * understand pack files, the objects will be stored in whatever - * format the ODB layer uses. - * - * @see git_odb_writepack - * - * @param out pointer to the writepack functions - * @param db object database where the stream will read from - * @param progress_cb function to call with progress information. - * Be aware that this is called inline with network and indexing operations, - * so performance may be affected. - * @param progress_payload payload for the progress callback - */ -GIT_EXTERN(int) git_odb_write_pack( - git_odb_writepack **out, - git_odb *db, - git_transfer_progress_callback progress_cb, - void *progress_payload); - -/** - * Determine the object-ID (sha1 hash) of a data buffer - * - * The resulting SHA-1 OID will be the identifier for the data - * buffer as if the data buffer it were to written to the ODB. - * - * @param out the resulting object-ID. - * @param data data to hash - * @param len size of the data - * @param type of the data to hash - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_hash(git_oid *out, const void *data, size_t len, git_otype type); - -/** - * Read a file from disk and fill a git_oid with the object id - * that the file would have if it were written to the Object - * Database as an object of the given type (w/o applying filters). - * Similar functionality to git.git's `git hash-object` without - * the `-w` flag, however, with the --no-filters flag. - * If you need filters, see git_repository_hashfile. - * - * @param out oid structure the result is written into. - * @param path file to read and determine object id for - * @param type the type of the object that will be hashed - * @return 0 or an error code - */ -GIT_EXTERN(int) git_odb_hashfile(git_oid *out, const char *path, git_otype type); - -/** - * Close an ODB object - * - * This method must always be called once a `git_odb_object` is no - * longer needed, otherwise memory will leak. - * - * @param object object to close - */ -GIT_EXTERN(void) git_odb_object_free(git_odb_object *object); - -/** - * Return the OID of an ODB object - * - * This is the OID from which the object was read from - * - * @param object the object - * @return a pointer to the OID - */ -GIT_EXTERN(const git_oid *) git_odb_object_id(git_odb_object *object); - -/** - * Return the data of an ODB object - * - * This is the uncompressed, raw data as read from the ODB, - * without the leading header. - * - * This pointer is owned by the object and shall not be free'd. - * - * @param object the object - * @return a pointer to the data - */ -GIT_EXTERN(const void *) git_odb_object_data(git_odb_object *object); - -/** - * Return the size of an ODB object - * - * This is the real size of the `data` buffer, not the - * actual size of the object. - * - * @param object the object - * @return the size - */ -GIT_EXTERN(size_t) git_odb_object_size(git_odb_object *object); - -/** - * Return the type of an ODB object - * - * @param object the object - * @return the type - */ -GIT_EXTERN(git_otype) git_odb_object_type(git_odb_object *object); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/odb_backend.h b/git2/include/git2/odb_backend.h deleted file mode 100644 index 029c61b9f..000000000 --- a/git2/include/git2/odb_backend.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_odb_backend_h__ -#define INCLUDE_git_odb_backend_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "indexer.h" - -/** - * @file git2/backend.h - * @brief Git custom backend functions - * @defgroup git_backend Git custom backend API - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -struct git_odb_stream; -struct git_odb_writepack; - -/** - * Function type for callbacks from git_odb_foreach. - */ -typedef int (*git_odb_foreach_cb)(const git_oid *id, void *payload); - -/** - * An instance for a custom backend - */ -struct git_odb_backend { - unsigned int version; - git_odb *odb; - - /* read and read_prefix each return to libgit2 a buffer which - * will be freed later. The buffer should be allocated using - * the function git_odb_backend_malloc to ensure that it can - * be safely freed later. */ - int (* read)( - void **, size_t *, git_otype *, - struct git_odb_backend *, - const git_oid *); - - /* To find a unique object given a prefix - * of its oid. - * The oid given must be so that the - * remaining (GIT_OID_HEXSZ - len)*4 bits - * are 0s. - */ - int (* read_prefix)( - git_oid *, - void **, size_t *, git_otype *, - struct git_odb_backend *, - const git_oid *, - size_t); - - int (* read_header)( - size_t *, git_otype *, - struct git_odb_backend *, - const git_oid *); - - /* The writer may assume that the object - * has already been hashed and is passed - * in the first parameter. - */ - int (* write)( - git_oid *, - struct git_odb_backend *, - const void *, - size_t, - git_otype); - - int (* writestream)( - struct git_odb_stream **, - struct git_odb_backend *, - size_t, - git_otype); - - int (* readstream)( - struct git_odb_stream **, - struct git_odb_backend *, - const git_oid *); - - int (* exists)( - struct git_odb_backend *, - const git_oid *); - - int (* foreach)( - struct git_odb_backend *, - git_odb_foreach_cb cb, - void *payload); - - int (* writepack)( - struct git_odb_writepack **, - struct git_odb_backend *, - git_transfer_progress_callback progress_cb, - void *progress_payload); - - void (* free)(struct git_odb_backend *); -}; - -#define GIT_ODB_BACKEND_VERSION 1 -#define GIT_ODB_BACKEND_INIT {GIT_ODB_BACKEND_VERSION} - -/** Streaming mode */ -enum { - GIT_STREAM_RDONLY = (1 << 1), - GIT_STREAM_WRONLY = (1 << 2), - GIT_STREAM_RW = (GIT_STREAM_RDONLY | GIT_STREAM_WRONLY), -}; - -/** A stream to read/write from a backend */ -struct git_odb_stream { - struct git_odb_backend *backend; - unsigned int mode; - - int (*read)(struct git_odb_stream *stream, char *buffer, size_t len); - int (*write)(struct git_odb_stream *stream, const char *buffer, size_t len); - int (*finalize_write)(git_oid *oid_p, struct git_odb_stream *stream); - void (*free)(struct git_odb_stream *stream); -}; - -/** A stream to write a pack file to the ODB */ -struct git_odb_writepack { - struct git_odb_backend *backend; - - int (*add)(struct git_odb_writepack *writepack, const void *data, size_t size, git_transfer_progress *stats); - int (*commit)(struct git_odb_writepack *writepack, git_transfer_progress *stats); - void (*free)(struct git_odb_writepack *writepack); -}; - -GIT_EXTERN(void *) git_odb_backend_malloc(git_odb_backend *backend, size_t len); - -/** - * Constructors for in-box ODB backends. - */ -GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **out, const char *objects_dir); -GIT_EXTERN(int) git_odb_backend_loose(git_odb_backend **out, const char *objects_dir, int compression_level, int do_fsync); -GIT_EXTERN(int) git_odb_backend_one_pack(git_odb_backend **out, const char *index_file); - -GIT_END_DECL - -#endif diff --git a/git2/include/git2/oid.h b/git2/include/git2/oid.h deleted file mode 100644 index 6be02da6e..000000000 --- a/git2/include/git2/oid.h +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_oid_h__ -#define INCLUDE_git_oid_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/oid.h - * @brief Git object id routines - * @defgroup git_oid Git object id routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Size (in bytes) of a raw/binary oid */ -#define GIT_OID_RAWSZ 20 - -/** Size (in bytes) of a hex formatted oid */ -#define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2) - -/** Minimum length (in number of hex characters, - * i.e. packets of 4 bits) of an oid prefix */ -#define GIT_OID_MINPREFIXLEN 4 - -/** Unique identity of any object (commit, tree, blob, tag). */ -typedef struct git_oid { - /** raw binary formatted id */ - unsigned char id[GIT_OID_RAWSZ]; -} git_oid; - -/** - * Parse a hex formatted object id into a git_oid. - * - * @param out oid structure the result is written into. - * @param str input hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (40 bytes). - * @return 0 or an error code - */ -GIT_EXTERN(int) git_oid_fromstr(git_oid *out, const char *str); - -/** - * Parse N characters of a hex formatted object id into a git_oid - * - * If N is odd, N-1 characters will be parsed instead. - * The remaining space in the git_oid will be set to zero. - * - * @param out oid structure the result is written into. - * @param str input hex string of at least size `length` - * @param length length of the input string - * @return 0 or an error code - */ -GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length); - -/** - * Copy an already raw oid into a git_oid structure. - * - * @param out oid structure the result is written into. - * @param raw the raw input bytes to be copied. - */ -GIT_EXTERN(void) git_oid_fromraw(git_oid *out, const unsigned char *raw); - -/** - * Format a git_oid into a hex string. - * - * @param out output hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (40 bytes). Only the - * oid digits are written; a '\\0' terminator must be added - * by the caller if it is required. - * @param oid oid structure to format. - */ -GIT_EXTERN(void) git_oid_fmt(char *out, const git_oid *id); - -/** - * Format a git_oid into a loose-object path string. - * - * The resulting string is "aa/...", where "aa" is the first two - * hex digits of the oid and "..." is the remaining 38 digits. - * - * @param out output hex string; must be pointing at the start of - * the hex sequence and have at least the number of bytes - * needed for an oid encoded in hex (41 bytes). Only the - * oid digits are written; a '\\0' terminator must be added - * by the caller if it is required. - * @param id oid structure to format. - */ -GIT_EXTERN(void) git_oid_pathfmt(char *out, const git_oid *id); - -/** - * Format a git_oid into a newly allocated c-string. - * - * @param oid the oid structure to format - * @return the c-string; NULL if memory is exhausted. Caller must - * deallocate the string with git__free(). - */ -GIT_EXTERN(char *) git_oid_allocfmt(const git_oid *id); - -/** - * Format a git_oid into a buffer as a hex format c-string. - * - * If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting - * oid c-string will be truncated to n-1 characters. If there are - * any input parameter errors (out == NULL, n == 0, oid == NULL), - * then a pointer to an empty string is returned, so that the return - * value can always be printed. - * - * @param out the buffer into which the oid string is output. - * @param n the size of the out buffer. - * @param id the oid structure to format. - * @return the out buffer pointer, assuming no input parameter - * errors, otherwise a pointer to an empty string. - */ -GIT_EXTERN(char *) git_oid_tostr(char *out, size_t n, const git_oid *id); - -/** - * Copy an oid from one structure to another. - * - * @param out oid structure the result is written into. - * @param src oid structure to copy from. - */ -GIT_EXTERN(void) git_oid_cpy(git_oid *out, const git_oid *src); - -/** - * Compare two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @return <0, 0, >0 if a < b, a == b, a > b. - */ -GIT_INLINE(int) git_oid_cmp(const git_oid *a, const git_oid *b) -{ - const unsigned char *sha1 = a->id; - const unsigned char *sha2 = b->id; - int i; - - for (i = 0; i < GIT_OID_RAWSZ; i++, sha1++, sha2++) { - if (*sha1 != *sha2) - return *sha1 - *sha2; - } - - return 0; -} - -/** - * Compare two oid structures for equality - * - * @param a first oid structure. - * @param b second oid structure. - * @return true if equal, false otherwise - */ -GIT_INLINE(int) git_oid_equal(const git_oid *a, const git_oid *b) -{ - return !git_oid_cmp(a, b); -} - -/** - * Compare the first 'len' hexadecimal characters (packets of 4 bits) - * of two oid structures. - * - * @param a first oid structure. - * @param b second oid structure. - * @param len the number of hex chars to compare - * @return 0 in case of a match - */ -GIT_EXTERN(int) git_oid_ncmp(const git_oid *a, const git_oid *b, size_t len); - -/** - * Check if an oid equals an hex formatted object id. - * - * @param id oid structure. - * @param str input hex string of an object id. - * @return GIT_ENOTOID if str is not a valid hex string, - * 0 in case of a match, GIT_ERROR otherwise. - */ -GIT_EXTERN(int) git_oid_streq(const git_oid *id, const char *str); - -/** - * Check is an oid is all zeros. - * - * @return 1 if all zeros, 0 otherwise. - */ -GIT_EXTERN(int) git_oid_iszero(const git_oid *id); - -/** - * OID Shortener object - */ -typedef struct git_oid_shorten git_oid_shorten; - -/** - * Create a new OID shortener. - * - * The OID shortener is used to process a list of OIDs - * in text form and return the shortest length that would - * uniquely identify all of them. - * - * E.g. look at the result of `git log --abbrev`. - * - * @param min_length The minimal length for all identifiers, - * which will be used even if shorter OIDs would still - * be unique. - * @return a `git_oid_shorten` instance, NULL if OOM - */ -GIT_EXTERN(git_oid_shorten *) git_oid_shorten_new(size_t min_length); - -/** - * Add a new OID to set of shortened OIDs and calculate - * the minimal length to uniquely identify all the OIDs in - * the set. - * - * The OID is expected to be a 40-char hexadecimal string. - * The OID is owned by the user and will not be modified - * or freed. - * - * For performance reasons, there is a hard-limit of how many - * OIDs can be added to a single set (around ~22000, assuming - * a mostly randomized distribution), which should be enough - * for any kind of program, and keeps the algorithm fast and - * memory-efficient. - * - * Attempting to add more than those OIDs will result in a - * GIT_ENOMEM error - * - * @param os a `git_oid_shorten` instance - * @param text_id an OID in text form - * @return the minimal length to uniquely identify all OIDs - * added so far to the set; or an error code (<0) if an - * error occurs. - */ -GIT_EXTERN(int) git_oid_shorten_add(git_oid_shorten *os, const char *text_id); - -/** - * Free an OID shortener instance - * - * @param os a `git_oid_shorten` instance - */ -GIT_EXTERN(void) git_oid_shorten_free(git_oid_shorten *os); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/pack.h b/git2/include/git2/pack.h deleted file mode 100644 index bc628c56a..000000000 --- a/git2/include/git2/pack.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_pack_h__ -#define INCLUDE_git_pack_h__ - -#include "common.h" -#include "oid.h" - -/** - * @file git2/pack.h - * @brief Git pack management routines - * @defgroup git_pack Git pack management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Initialize a new packbuilder - * - * @param out The new packbuilder object - * @param repo The repository - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_new(git_packbuilder **out, git_repository *repo); - -/** - * Set number of threads to spawn - * - * By default, libgit2 won't spawn any threads at all; - * when set to 0, libgit2 will autodetect the number of - * CPUs. - * - * @param pb The packbuilder - * @param n Number of threads to spawn - * @return number of actual threads to be used - */ -GIT_EXTERN(unsigned int) git_packbuilder_set_threads(git_packbuilder *pb, unsigned int n); - -/** - * Insert a single object - * - * For an optimal pack it's mandatory to insert objects in recency order, - * commits followed by trees and blobs. - * - * @param pb The packbuilder - * @param id The oid of the commit - * @param name The name; might be NULL - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert(git_packbuilder *pb, const git_oid *id, const char *name); - -/** - * Insert a root tree object - * - * This will add the tree as well as all referenced trees and blobs. - * - * @param pb The packbuilder - * @param id The oid of the root tree - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_insert_tree(git_packbuilder *pb, const git_oid *id); - -/** - * Write the new pack and the corresponding index to path - * - * @param pb The packbuilder - * @param path Directory to store the new pack and index - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_packbuilder_write(git_packbuilder *pb, const char *file); - -/** - * Create the new pack and pass each object to the callback - * - * @param pb the packbuilder - * @param cb the callback to call with each packed object's buffer - * @param payload the callback's data - * @return 0 or an error code - */ -typedef int (*git_packbuilder_foreach_cb)(void *buf, size_t size, void *payload); -GIT_EXTERN(int) git_packbuilder_foreach(git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload); - -/** - * Get the total number of objects the packbuilder will write out - * - * @param pb the packbuilder - * @return - */ -GIT_EXTERN(uint32_t) git_packbuilder_object_count(git_packbuilder *pb); - -/** - * Get the number of objects the packbuilder has already written out - * - * @param pb the packbuilder - * @return - */ -GIT_EXTERN(uint32_t) git_packbuilder_written(git_packbuilder *pb); - -/** - * Free the packbuilder and all associated data - * - * @param pb The packbuilder - */ -GIT_EXTERN(void) git_packbuilder_free(git_packbuilder *pb); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/push.h b/git2/include/git2/push.h deleted file mode 100644 index 51f059ac4..000000000 --- a/git2/include/git2/push.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_push_h__ -#define INCLUDE_git_push_h__ - -#include "common.h" - -/** - * @file git2/push.h - * @brief Git push management functions - * @defgroup git_push push management functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new push object - * - * @param out New push object - * @param remote Remote instance - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_push_new(git_push **out, git_remote *remote); - -/** - * Add a refspec to be pushed - * - * @param push The push object - * @param refspec Refspec string - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_push_add_refspec(git_push *push, const char *refspec); - -/** - * Actually push all given refspecs - * - * @param push The push object - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_push_finish(git_push *push); - -/** - * Check if remote side successfully unpacked - * - * @param push The push object - * - * @return true if equal, false otherwise - */ -GIT_EXTERN(int) git_push_unpack_ok(git_push *push); - -/** - * Call callback `cb' on each status - * - * @param push The push object - * @param cb The callback to call on each object - * - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_push_status_foreach(git_push *push, - int (*cb)(const char *ref, const char *msg, void *data), - void *data); - -/** - * Free the given push object - * - * @param push The push object - */ -GIT_EXTERN(void) git_push_free(git_push *push); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/reflog.h b/git2/include/git2/reflog.h deleted file mode 100644 index 4944530af..000000000 --- a/git2/include/git2/reflog.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_reflog_h__ -#define INCLUDE_git_reflog_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/reflog.h - * @brief Git reflog management routines - * @defgroup git_reflog Git reflog management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Read the reflog for the given reference - * - * If there is no reflog file for the given - * reference yet, an empty reflog object will - * be returned. - * - * The reflog must be freed manually by using - * git_reflog_free(). - * - * @param out pointer to reflog - * @param ref reference to read the reflog for - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_read(git_reflog **out, const git_reference *ref); - -/** - * Write an existing in-memory reflog object back to disk - * using an atomic file lock. - * - * @param reflog an existing reflog object - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_write(git_reflog *reflog); - -/** - * Add a new entry to the reflog. - * - * `msg` is optional and can be NULL. - * - * @param reflog an existing reflog object - * @param id the OID the reference is now pointing to - * @param committer the signature of the committer - * @param msg the reflog message - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_append(git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg); - -/** - * Rename the reflog for the given reference - * - * The reflog to be renamed is expected to already exist - * - * The new name will be checked for validity. - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param ref the reference - * @param name the new name of the reference - * @return 0 on success, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reflog_rename(git_reference *ref, const char *name); - -/** - * Delete the reflog for the given reference - * - * @param ref the reference - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reflog_delete(git_reference *ref); - -/** - * Get the number of log entries in a reflog - * - * @param reflog the previously loaded reflog - * @return the number of log entries - */ -GIT_EXTERN(size_t) git_reflog_entrycount(git_reflog *reflog); - -/** - * Lookup an entry by its index - * - * Requesting the reflog entry with an index of 0 (zero) will - * return the most recently created entry. - * - * @param reflog a previously loaded reflog - * @param idx the position of the entry to lookup. Should be greater than or - * equal to 0 (zero) and less than `git_reflog_entrycount()`. - * @return the entry; NULL if not found - */ -GIT_EXTERN(const git_reflog_entry *) git_reflog_entry_byindex(git_reflog *reflog, size_t idx); - -/** - * Remove an entry from the reflog by its index - * - * To ensure there's no gap in the log history, set `rewrite_previous_entry` - * param value to 1. When deleting entry `n`, member old_oid of entry `n-1` - * (if any) will be updated with the value of member new_oid of entry `n+1`. - * - * @param reflog a previously loaded reflog. - * - * @param idx the position of the entry to remove. Should be greater than or - * equal to 0 (zero) and less than `git_reflog_entrycount()`. - * - * @param rewrite_previous_entry 1 to rewrite the history; 0 otherwise. - * - * @return 0 on success, GIT_ENOTFOUND if the entry doesn't exist - * or an error code. - */ -GIT_EXTERN(int) git_reflog_drop( - git_reflog *reflog, - size_t idx, - int rewrite_previous_entry); - -/** - * Get the old oid - * - * @param entry a reflog entry - * @return the old oid - */ -GIT_EXTERN(const git_oid *) git_reflog_entry_id_old(const git_reflog_entry *entry); - -/** - * Get the new oid - * - * @param entry a reflog entry - * @return the new oid at this time - */ -GIT_EXTERN(const git_oid *) git_reflog_entry_id_new(const git_reflog_entry *entry); - -/** - * Get the committer of this entry - * - * @param entry a reflog entry - * @return the committer - */ -GIT_EXTERN(const git_signature *) git_reflog_entry_committer(const git_reflog_entry *entry); - -/** - * Get the log message - * - * @param entry a reflog entry - * @return the log msg - */ -GIT_EXTERN(const char *) git_reflog_entry_message(const git_reflog_entry *entry); - -/** - * Free the reflog - * - * @param reflog reflog to free - */ -GIT_EXTERN(void) git_reflog_free(git_reflog *reflog); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/refs.h b/git2/include/git2/refs.h deleted file mode 100644 index a0abbc339..000000000 --- a/git2/include/git2/refs.h +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_refs_h__ -#define INCLUDE_git_refs_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "strarray.h" - -/** - * @file git2/refs.h - * @brief Git reference management routines - * @defgroup git_reference Git reference management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a reference by name in a repository. - * - * The returned reference must be freed by the user. - * - * The name will be checked for validity. - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param out pointer to the looked-up reference - * @param repo the repository to look up the reference - * @param name the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...) - * @return 0 on success, ENOTFOUND, EINVALIDSPEC or an error code. - */ -GIT_EXTERN(int) git_reference_lookup(git_reference **out, git_repository *repo, const char *name); - -/** - * Lookup a reference by name and resolve immediately to OID. - * - * This function provides a quick way to resolve a reference name straight - * through to the object id that it refers to. This avoids having to - * allocate or free any `git_reference` objects for simple situations. - * - * The name will be checked for validity. - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param out Pointer to oid to be filled in - * @param repo The repository in which to look up the reference - * @param name The long name for the reference - * @return 0 on success, ENOTFOUND, EINVALIDSPEC or an error code. - */ -GIT_EXTERN(int) git_reference_name_to_id( - git_oid *out, git_repository *repo, const char *name); - -/** - * Create a new symbolic reference. - * - * A symbolic reference is a reference name that refers to another - * reference name. If the other name moves, the symbolic name will move, - * too. As a simple example, the "HEAD" reference might refer to - * "refs/heads/master" while on the "master" branch of a repository. - * - * The symbolic reference will be created in the repository and written to - * the disk. The generated reference object must be freed by the user. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * This function will return an error if a reference already exists with the - * given name unless `force` is true, in which case it will be overwritten. - * - * @param out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param target The target of the reference - * @param force Overwrite existing references - * @return 0 on success, EEXISTS, EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_symbolic_create(git_reference **out, git_repository *repo, const char *name, const char *target, int force); - -/** - * Create a new direct reference. - * - * A direct reference (also called an object id reference) refers directly - * to a specific object id (a.k.a. OID or SHA) in the repository. The id - * permanently refers to the object (although the reference itself can be - * moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" - * refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977. - * - * The direct reference will be created in the repository and written to - * the disk. The generated reference object must be freed by the user. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * This function will return an error if a reference already exists with the - * given name unless `force` is true, in which case it will be overwritten. - * - * @param out Pointer to the newly created reference - * @param repo Repository where that reference will live - * @param name The name of the reference - * @param id The object id pointed to by the reference. - * @param force Overwrite existing references - * @return 0 on success, EEXISTS, EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_create(git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force); - -/** - * Get the OID pointed to by a direct reference. - * - * Only available if the reference is direct (i.e. an object id reference, - * not a symbolic one). - * - * To find the OID of a symbolic ref, call `git_reference_resolve()` and - * then this function (or maybe use `git_reference_name_to_oid()` to - * directly resolve a reference name all the way through to an OID). - * - * @param ref The reference - * @return a pointer to the oid if available, NULL otherwise - */ -GIT_EXTERN(const git_oid *) git_reference_target(const git_reference *ref); - -/** - * Get full name to the reference pointed to by a symbolic reference. - * - * Only available if the reference is symbolic. - * - * @param ref The reference - * @return a pointer to the name if available, NULL otherwise - */ -GIT_EXTERN(const char *) git_reference_symbolic_target(const git_reference *ref); - -/** - * Get the type of a reference. - * - * Either direct (GIT_REF_OID) or symbolic (GIT_REF_SYMBOLIC) - * - * @param ref The reference - * @return the type - */ -GIT_EXTERN(git_ref_t) git_reference_type(const git_reference *ref); - -/** - * Get the full name of a reference. - * - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param ref The reference - * @return the full name for the ref - */ -GIT_EXTERN(const char *) git_reference_name(const git_reference *ref); - -/** - * Resolve a symbolic reference to a direct reference. - * - * This method iteratively peels a symbolic reference until it resolves to - * a direct reference to an OID. - * - * The peeled reference is returned in the `resolved_ref` argument, and - * must be freed manually once it's no longer needed. - * - * If a direct reference is passed as an argument, a copy of that - * reference is returned. This copy must be manually freed too. - * - * @param resolved_ref Pointer to the peeled reference - * @param ref The reference - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_resolve(git_reference **out, const git_reference *ref); - -/** - * Get the repository where a reference resides. - * - * @param ref The reference - * @return a pointer to the repo - */ -GIT_EXTERN(git_repository *) git_reference_owner(const git_reference *ref); - -/** - * Set the symbolic target of a reference. - * - * The reference must be a symbolic reference, otherwise this will fail. - * - * The reference will be automatically updated in memory and on disk. - * - * The target name will be checked for validity. - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param ref The reference - * @param target The new target for the reference - * @return 0 on success, EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_reference_symbolic_set_target(git_reference *ref, const char *target); - -/** - * Set the OID target of a reference. - * - * The reference must be a direct reference, otherwise this will fail. - * - * The reference will be automatically updated in memory and on disk. - * - * @param ref The reference - * @param id The new target OID for the reference - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_set_target(git_reference *ref, const git_oid *id); - -/** - * Rename an existing reference. - * - * This method works for both direct and symbolic references. - * - * The new name will be checked for validity. - * See `git_reference_create_symbolic()` for rules about valid names. - * - * The given git_reference will be updated in place. - * - * The reference will be immediately renamed in-memory and on disk. - * - * If the `force` flag is not enabled, and there's already - * a reference with the given name, the renaming will fail. - * - * IMPORTANT: - * The user needs to write a proper reflog entry if the - * reflog is enabled for the repository. We only rename - * the reflog if it exists. - * - * @param ref The reference to rename - * @param name The new name for the reference - * @param force Overwrite an existing reference - * @return 0 on success, EINVALIDSPEC, EEXISTS or an error code - * - */ -GIT_EXTERN(int) git_reference_rename(git_reference *ref, const char *name, int force); - -/** - * Delete an existing reference. - * - * This method works for both direct and symbolic references. - * - * The reference will be immediately removed on disk and from memory - * (i.e. freed). The given reference pointer will no longer be valid. - * - * @param ref The reference to remove - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_delete(git_reference *ref); - -/** - * Pack all the loose references in the repository. - * - * This method will load into the cache all the loose - * references on the repository and update the - * `packed-refs` file with them. - * - * Once the `packed-refs` file has been written properly, - * the loose references will be removed from disk. - * - * @param repo Repository where the loose refs will be packed - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_packall(git_repository *repo); - -/** - * Fill a list with all the references that can be found in a repository. - * - * Using the `list_flags` parameter, the listed references may be filtered - * by type (`GIT_REF_OID` or `GIT_REF_SYMBOLIC`) or using a bitwise OR of - * `git_ref_t` values. To include packed refs, include `GIT_REF_PACKED`. - * For convenience, use the value `GIT_REF_LISTALL` to obtain all - * references, including packed ones. - * - * The string array will be filled with the names of all references; these - * values are owned by the user and should be free'd manually when no - * longer needed, using `git_strarray_free()`. - * - * @param array Pointer to a git_strarray structure where - * the reference names will be stored - * @param repo Repository where to find the refs - * @param list_flags Filtering flags for the reference listing - * @return 0 or an error code - */ -GIT_EXTERN(int) git_reference_list(git_strarray *array, git_repository *repo, unsigned int list_flags); - -typedef int (*git_reference_foreach_cb)(const char *refname, void *payload); - -/** - * Perform a callback on each reference in the repository. - * - * Using the `list_flags` parameter, the references may be filtered by - * type (`GIT_REF_OID` or `GIT_REF_SYMBOLIC`) or using a bitwise OR of - * `git_ref_t` values. To include packed refs, include `GIT_REF_PACKED`. - * For convenience, use the value `GIT_REF_LISTALL` to obtain all - * references, including packed ones. - * - * The `callback` function will be called for each reference in the - * repository, receiving the name of the reference and the `payload` value - * passed to this method. Returning a non-zero value from the callback - * will terminate the iteration. - * - * @param repo Repository where to find the refs - * @param list_flags Filtering flags for the reference listing. - * @param callback Function which will be called for every listed ref - * @param payload Additional data to pass to the callback - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_reference_foreach( - git_repository *repo, - unsigned int list_flags, - git_reference_foreach_cb callback, - void *payload); - -/** - * Check if a reference has been loaded from a packfile. - * - * @param ref A git reference - * @return 0 in case it's not packed; 1 otherwise - */ -GIT_EXTERN(int) git_reference_is_packed(git_reference *ref); - -/** - * Reload a reference from disk. - * - * Reference pointers can become outdated if the Git repository is - * accessed simultaneously by other clients while the library is open. - * - * This method forces a reload of the reference from disk, to ensure that - * the provided information is still reliable. - * - * If the reload fails (e.g. the reference no longer exists on disk, or - * has become corrupted), an error code will be returned and the reference - * pointer will be invalidated and freed. - * - * @param ref The reference to reload - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_reference_reload(git_reference *ref); - -/** - * Free the given reference. - * - * @param ref git_reference - */ -GIT_EXTERN(void) git_reference_free(git_reference *ref); - -/** - * Compare two references. - * - * @param ref1 The first git_reference - * @param ref2 The second git_reference - * @return 0 if the same, else a stable but meaningless ordering. - */ -GIT_EXTERN(int) git_reference_cmp(git_reference *ref1, git_reference *ref2); - -/** - * Perform a callback on each reference in the repository whose name - * matches the given pattern. - * - * This function acts like `git_reference_foreach()` with an additional - * pattern match being applied to the reference name before issuing the - * callback function. See that function for more information. - * - * The pattern is matched using fnmatch or "glob" style where a '*' matches - * any sequence of letters, a '?' matches any letter, and square brackets - * can be used to define character ranges (such as "[0-9]" for digits). - * - * @param repo Repository where to find the refs - * @param glob Pattern to match (fnmatch-style) against reference name. - * @param list_flags Filtering flags for the reference listing. - * @param callback Function which will be called for every listed ref - * @param payload Additional data to pass to the callback - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_reference_foreach_glob( - git_repository *repo, - const char *glob, - unsigned int list_flags, - git_reference_foreach_cb callback, - void *payload); - -/** - * Check if a reflog exists for the specified reference. - * - * @param ref A git reference - * - * @return 0 when no reflog can be found, 1 when it exists; - * otherwise an error code. - */ -GIT_EXTERN(int) git_reference_has_log(git_reference *ref); - -/** - * Check if a reference is a local branch. - * - * @param ref A git reference - * - * @return 1 when the reference lives in the refs/heads - * namespace; 0 otherwise. - */ -GIT_EXTERN(int) git_reference_is_branch(git_reference *ref); - -/** - * Check if a reference is a remote tracking branch - * - * @param ref A git reference - * - * @return 1 when the reference lives in the refs/remotes - * namespace; 0 otherwise. - */ -GIT_EXTERN(int) git_reference_is_remote(git_reference *ref); - - -typedef enum { - GIT_REF_FORMAT_NORMAL = 0, - - /** - * Control whether one-level refnames are accepted - * (i.e., refnames that do not contain multiple /-separated - * components). Those are expected to be written only using - * uppercase letters and underscore (FETCH_HEAD, ...) - */ - GIT_REF_FORMAT_ALLOW_ONELEVEL = (1 << 0), - - /** - * Interpret the provided name as a reference pattern for a - * refspec (as used with remote repositories). If this option - * is enabled, the name is allowed to contain a single * () - * in place of a one full pathname component - * (e.g., foo//bar but not foo/bar). - */ - GIT_REF_FORMAT_REFSPEC_PATTERN = (1 << 1), -} git_reference_normalize_t; - -/** - * Normalize reference name and check validity. - * - * This will normalize the reference name by removing any leading slash - * '/' characters and collapsing runs of adjacent slashes between name - * components into a single slash. - * - * Once normalized, if the reference name is valid, it will be returned in - * the user allocated buffer. - * - * See `git_reference_create_symbolic()` for rules about valid names. - * - * @param buffer_out User allocated buffer to store normalized name - * @param buffer_size Size of buffer_out - * @param name Reference name to be checked. - * @param flags Flags to constrain name validation rules - see the - * GIT_REF_FORMAT constants above. - * @return 0 on success, GIT_EBUFS if buffer is too small, EINVALIDSPEC - * or an error code. - */ -GIT_EXTERN(int) git_reference_normalize_name( - char *buffer_out, - size_t buffer_size, - const char *name, - unsigned int flags); - -/** - * Recursively peel reference until object of the specified type is found. - * - * The retrieved `peeled` object is owned by the repository - * and should be closed with the `git_object_free` method. - * - * If you pass `GIT_OBJ_ANY` as the target type, then the object - * will be peeled until a non-tag object is met. - * - * @param peeled Pointer to the peeled git_object - * @param ref The reference to be processed - * @param target_type The type of the requested object (GIT_OBJ_COMMIT, - * GIT_OBJ_TAG, GIT_OBJ_TREE, GIT_OBJ_BLOB or GIT_OBJ_ANY). - * @return 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code - */ -GIT_EXTERN(int) git_reference_peel( - git_object **out, - git_reference *ref, - git_otype type); - -/** - * Ensure the reference name is well-formed. - * - * Valid reference names must follow one of two patterns: - * - * 1. Top-level names must contain only capital letters and underscores, - * and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). - * 2. Names prefixed with "refs/" can be almost anything. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * @param refname name to be checked. - * @return 1 if the reference name is acceptable; 0 if it isn't - */ -GIT_EXTERN(int) git_reference_is_valid_name(const char *refname); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/refspec.h b/git2/include/git2/refspec.h deleted file mode 100644 index ee06f8eca..000000000 --- a/git2/include/git2/refspec.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_refspec_h__ -#define INCLUDE_git_refspec_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/refspec.h - * @brief Git refspec attributes - * @defgroup git_refspec Git refspec attributes - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Get the source specifier - * - * @param refspec the refspec - * @return the refspec's source specifier - */ -GIT_EXTERN(const char *) git_refspec_src(const git_refspec *refspec); - -/** - * Get the destination specifier - * - * @param refspec the refspec - * @return the refspec's destination specifier - */ -GIT_EXTERN(const char *) git_refspec_dst(const git_refspec *refspec); - -/** - * Get the force update setting - * - * @param refspec the refspec - * @return 1 if force update has been set, 0 otherwise - */ -GIT_EXTERN(int) git_refspec_force(const git_refspec *refspec); - -/** - * Check if a refspec's source descriptor matches a reference - * - * @param refspec the refspec - * @param refname the name of the reference to check - * @return 1 if the refspec matches, 0 otherwise - */ -GIT_EXTERN(int) git_refspec_src_matches(const git_refspec *refspec, const char *refname); - -/** - * Transform a reference to its target following the refspec's rules - * - * @param out where to store the target name - * @param outlen the size of the `out` buffer - * @param spec the refspec - * @param name the name of the reference to transform - * @return 0, GIT_EBUFS or another error - */ -GIT_EXTERN(int) git_refspec_transform(char *out, size_t outlen, const git_refspec *spec, const char *name); - -GIT_END_DECL - -#endif diff --git a/git2/include/git2/remote.h b/git2/include/git2/remote.h deleted file mode 100644 index a0f5d5246..000000000 --- a/git2/include/git2/remote.h +++ /dev/null @@ -1,465 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_remote_h__ -#define INCLUDE_git_remote_h__ - -#include "common.h" -#include "repository.h" -#include "refspec.h" -#include "net.h" -#include "indexer.h" -#include "strarray.h" -#include "transport.h" - -/** - * @file git2/remote.h - * @brief Git remote management functions - * @defgroup git_remote remote management functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -typedef int (*git_remote_rename_problem_cb)(const char *problematic_refspec, void *payload); -/* - * TODO: This functions still need to be implemented: - * - _listcb/_foreach - * - _add - * - _rename - * - _del (needs support from config) - */ - -/** - * Add a remote with the default fetch refspec to the repository's configuration. This - * calls git_remote_save before returning. - * - * @param out the resulting remote - * @param repo the repository in which to create the remote - * @param name the remote's name - * @param url the remote's url - * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - */ -GIT_EXTERN(int) git_remote_create( - git_remote **out, - git_repository *repo, - const char *name, - const char *url); - -/** - * Create a remote in memory - * - * Create a remote with the given refspec in memory. You can use - * this when you have a URL instead of a remote's name. Note that in-memory - * remotes cannot be converted to persisted remotes. - * - * The name, when provided, will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param out pointer to the new remote object - * @param repo the associated repository. May be NULL for a "dangling" remote. - * @param fetch the fetch refspec to use for this remote. May be NULL for defaults. - * @param url the remote repository's URL - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_create_inmemory( - git_remote **out, - git_repository *repo, - const char *fetch, - const char *url); - -/** - * Sets the owning repository for the remote. This is only allowed on - * dangling remotes. - * - * @param remote the remote to configure - * @param repo the repository that will own the remote - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_set_repository(git_remote *remote, git_repository *repo); - -/** - * Get the information for a particular remote - * - * The name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param out pointer to the new remote object - * @param repo the associated repository - * @param name the remote's name - * @return 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_remote_load(git_remote **out, git_repository *repo, const char *name); - -/** - * Save a remote to its repository's configuration - * - * One can't save a in-memory remote. Doing so will - * result in a GIT_EINVALIDSPEC being returned. - * - * @param remote the remote to save to config - * @return 0, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_remote_save(const git_remote *remote); - -/** - * Get the remote's name - * - * @param remote the remote - * @return a pointer to the name or NULL for in-memory remotes - */ -GIT_EXTERN(const char *) git_remote_name(const git_remote *remote); - -/** - * Get the remote's url - * - * @param remote the remote - * @return a pointer to the url - */ -GIT_EXTERN(const char *) git_remote_url(const git_remote *remote); - -/** - * Get the remote's url for pushing - * - * @param remote the remote - * @return a pointer to the url or NULL if no special url for pushing is set - */ -GIT_EXTERN(const char *) git_remote_pushurl(const git_remote *remote); - -/** - * Set the remote's url - * - * Existing connections will not be updated. - * - * @param remote the remote - * @param url the url to set - * @return 0 or an error value - */ -GIT_EXTERN(int) git_remote_set_url(git_remote *remote, const char* url); - -/** - * Set the remote's url for pushing - * - * Existing connections will not be updated. - * - * @param remote the remote - * @param url the url to set or NULL to clear the pushurl - * @return 0 or an error value - */ -GIT_EXTERN(int) git_remote_set_pushurl(git_remote *remote, const char* url); - -/** - * Set the remote's fetch refspec - * - * @param remote the remote - * @apram spec the new fetch refspec - * @return 0 or an error value - */ -GIT_EXTERN(int) git_remote_set_fetchspec(git_remote *remote, const char *spec); - -/** - * Get the fetch refspec - * - * @param remote the remote - * @return a pointer to the fetch refspec or NULL if it doesn't exist - */ -GIT_EXTERN(const git_refspec *) git_remote_fetchspec(const git_remote *remote); - -/** - * Set the remote's push refspec - * - * @param remote the remote - * @param spec the new push refspec - * @return 0 or an error value - */ -GIT_EXTERN(int) git_remote_set_pushspec(git_remote *remote, const char *spec); - -/** - * Get the push refspec - * - * @param remote the remote - * @return a pointer to the push refspec or NULL if it doesn't exist - */ - -GIT_EXTERN(const git_refspec *) git_remote_pushspec(const git_remote *remote); - -/** - * Open a connection to a remote - * - * The transport is selected based on the URL. The direction argument - * is due to a limitation of the git protocol (over TCP or SSH) which - * starts up a specific binary which can only do the one or the other. - * - * @param remote the remote to connect to - * @param direction whether you want to receive or send data - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_connect(git_remote *remote, git_direction direction); - -/** - * Get a list of refs at the remote - * - * The remote (or more exactly its transport) must be connected. The - * memory belongs to the remote. - * - * If you a return a non-zero value from the callback, this will stop - * looping over the refs. - * - * @param remote the remote - * @param list_cb function to call with each ref discovered at the remote - * @param payload additional data to pass to the callback - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_remote_ls(git_remote *remote, git_headlist_cb list_cb, void *payload); - -/** - * Download the packfile - * - * Negotiate what objects should be downloaded and download the - * packfile with those objects. The packfile is downloaded with a - * temporary filename, as it's final name is not known yet. If there - * was no packfile needed (all the objects were available locally), - * filename will be NULL and the function will return success. - * - * @param remote the remote to download from - * @param progress_cb function to call with progress information. Be aware that - * this is called inline with network and indexing operations, so performance - * may be affected. - * @param progress_payload payload for the progress callback - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_download( - git_remote *remote, - git_transfer_progress_callback progress_cb, - void *payload); - -/** - * Check whether the remote is connected - * - * Check whether the remote's underlying transport is connected to the - * remote host. - * - * @param remote the remote - * @return 1 if it's connected, 0 otherwise. - */ -GIT_EXTERN(int) git_remote_connected(git_remote *remote); - -/** - * Cancel the operation - * - * At certain points in its operation, the network code checks whether - * the operation has been cancelled and if so stops the operation. - * - * @param remote the remote - */ -GIT_EXTERN(void) git_remote_stop(git_remote *remote); - -/** - * Disconnect from the remote - * - * Close the connection to the remote and free the underlying - * transport. - * - * @param remote the remote to disconnect from - */ -GIT_EXTERN(void) git_remote_disconnect(git_remote *remote); - -/** - * Free the memory associated with a remote - * - * This also disconnects from the remote, if the connection - * has not been closed yet (using git_remote_disconnect). - * - * @param remote the remote to free - */ -GIT_EXTERN(void) git_remote_free(git_remote *remote); - -/** - * Update the tips to the new state - * - * @param remote the remote to update - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_update_tips(git_remote *remote); - -/** - * Return whether a string is a valid remote URL - * - * @param url the url to check - * @param 1 if the url is valid, 0 otherwise - */ -GIT_EXTERN(int) git_remote_valid_url(const char *url); - -/** - * Return whether the passed URL is supported by this version of the library. - * - * @param url the url to check - * @return 1 if the url is supported, 0 otherwise -*/ -GIT_EXTERN(int) git_remote_supported_url(const char* url); - -/** - * Get a list of the configured remotes for a repo - * - * The string array must be freed by the user. - * - * @param out a string array which receives the names of the remotes - * @param repo the repository to query - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_list(git_strarray *out, git_repository *repo); - -/** - * Choose whether to check the server's certificate (applies to HTTPS only) - * - * @param remote the remote to configure - * @param check whether to check the server's certificate (defaults to yes) - */ -GIT_EXTERN(void) git_remote_check_cert(git_remote *remote, int check); - -/** - * Set a credentials acquisition callback for this remote. If the remote is - * not available for anonymous access, then you must set this callback in order - * to provide credentials to the transport at the time of authentication - * failure so that retry can be performed. - * - * @param remote the remote to configure - * @param cred_acquire_cb The credentials acquisition callback to use (defaults - * to NULL) - */ -GIT_EXTERN(void) git_remote_set_cred_acquire_cb( - git_remote *remote, - git_cred_acquire_cb cred_acquire_cb, - void *payload); - -/** - * Sets a custom transport for the remote. The caller can use this function - * to bypass the automatic discovery of a transport by URL scheme (i.e. - * http://, https://, git://) and supply their own transport to be used - * instead. After providing the transport to a remote using this function, - * the transport object belongs exclusively to that remote, and the remote will - * free it when it is freed with git_remote_free. - * - * @param remote the remote to configure - * @param transport the transport object for the remote to use - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_set_transport( - git_remote *remote, - git_transport *transport); - -/** - * Argument to the completion callback which tells it which operation - * finished. - */ -typedef enum git_remote_completion_type { - GIT_REMOTE_COMPLETION_DOWNLOAD, - GIT_REMOTE_COMPLETION_INDEXING, - GIT_REMOTE_COMPLETION_ERROR, -} git_remote_completion_type; - -/** - * The callback settings structure - * - * Set the calbacks to be called by the remote. - */ -struct git_remote_callbacks { - unsigned int version; - void (*progress)(const char *str, int len, void *data); - int (*completion)(git_remote_completion_type type, void *data); - int (*update_tips)(const char *refname, const git_oid *a, const git_oid *b, void *data); - void *payload; -}; - -#define GIT_REMOTE_CALLBACKS_VERSION 1 -#define GIT_REMOTE_CALLBACKS_INIT {GIT_REMOTE_CALLBACKS_VERSION} - -/** - * Set the callbacks for a remote - * - * Note that the remote keeps its own copy of the data and you need to - * call this function again if you want to change the callbacks. - * - * @param remote the remote to configure - * @param callbacks a pointer to the user's callback settings - * @return 0 or an error code - */ -GIT_EXTERN(int) git_remote_set_callbacks(git_remote *remote, git_remote_callbacks *callbacks); - -/** - * Get the statistics structure that is filled in by the fetch operation. - */ -GIT_EXTERN(const git_transfer_progress *) git_remote_stats(git_remote *remote); - -typedef enum { - GIT_REMOTE_DOWNLOAD_TAGS_UNSET, - GIT_REMOTE_DOWNLOAD_TAGS_NONE, - GIT_REMOTE_DOWNLOAD_TAGS_AUTO, - GIT_REMOTE_DOWNLOAD_TAGS_ALL -} git_remote_autotag_option_t; - -/** - * Retrieve the tag auto-follow setting - * - * @param remote the remote to query - * @return the auto-follow setting - */ -GIT_EXTERN(git_remote_autotag_option_t) git_remote_autotag(git_remote *remote); - -/** - * Set the tag auto-follow setting - * - * @param remote the remote to configure - * @param value a GIT_REMOTE_DOWNLOAD_TAGS value - */ -GIT_EXTERN(void) git_remote_set_autotag( - git_remote *remote, - git_remote_autotag_option_t value); - -/** - * Give the remote a new name - * - * All remote-tracking branches and configuration settings - * for the remote are updated. - * - * The new name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * A temporary in-memory remote cannot be given a name with this method. - * - * @param remote the remote to rename - * @param new_name the new name the remote should bear - * @param callback Optional callback to notify the consumer of fetch refspecs - * that haven't been automatically updated and need potential manual tweaking. - * @param payload Additional data to pass to the callback - * @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code - */ -GIT_EXTERN(int) git_remote_rename( - git_remote *remote, - const char *new_name, - git_remote_rename_problem_cb callback, - void *payload); - -/** - * Retrieve the update FETCH_HEAD setting. - * - * @param remote the remote to query - * @return the update FETCH_HEAD setting - */ -GIT_EXTERN(int) git_remote_update_fetchhead(git_remote *remote); - -/** - * Sets the update FETCH_HEAD setting. By default, FETCH_HEAD will be - * updated on every fetch. Set to 0 to disable. - * - * @param remote the remote to configure - * @param value 0 to disable updating FETCH_HEAD - */ -GIT_EXTERN(void) git_remote_set_update_fetchhead(git_remote *remote, int value); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/repository.h b/git2/include/git2/repository.h deleted file mode 100644 index e207e5bb5..000000000 --- a/git2/include/git2/repository.h +++ /dev/null @@ -1,647 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_repository_h__ -#define INCLUDE_git_repository_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/repository.h - * @brief Git repository management routines - * @defgroup git_repository Git repository management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Open a git repository. - * - * The 'path' argument must point to either a git repository - * folder, or an existing work dir. - * - * The method will automatically detect if 'path' is a normal - * or bare repository or fail is 'path' is neither. - * - * @param out pointer to the repo which will be opened - * @param path the path to the repository - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_open(git_repository **out, const char *path); - -/** - * Create a "fake" repository to wrap an object database - * - * Create a repository object to wrap an object database to be used - * with the API when all you have is an object database. This doesn't - * have any paths associated with it, so use with care. - * - * @param out pointer to the repo - * @param odb the object database to wrap - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_wrap_odb(git_repository **out, git_odb *odb); - -/** - * Look for a git repository and copy its path in the given buffer. - * The lookup start from base_path and walk across parent directories - * if nothing has been found. The lookup ends when the first repository - * is found, or when reaching a directory referenced in ceiling_dirs - * or when the filesystem changes (in case across_fs is true). - * - * The method will automatically detect if the repository is bare - * (if there is a repository). - * - * @param path_out The user allocated buffer which will - * contain the found path. - * - * @param path_size repository_path size - * - * @param start_path The base path where the lookup starts. - * - * @param across_fs If true, then the lookup will not stop when a - * filesystem device change is detected while exploring parent directories. - * - * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR separated list of - * absolute symbolic link free paths. The lookup will stop when any - * of this paths is reached. Note that the lookup always performs on - * start_path no matter start_path appears in ceiling_dirs ceiling_dirs - * might be NULL (which is equivalent to an empty string) - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_discover( - char *path_out, - size_t path_size, - const char *start_path, - int across_fs, - const char *ceiling_dirs); - -/** - * Option flags for `git_repository_open_ext`. - * - * * GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be - * immediately found in the start_path. Do not walk up from the - * start_path looking at parent directories. - * * GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not - * continue searching across filesystem boundaries (i.e. when `st_dev` - * changes from the `stat` system call). (E.g. Searching in a user's home - * directory "/home/user/source/" will not return "/.git/" as the found - * repo if "/" is a different filesystem than "/home".) - */ -typedef enum { - GIT_REPOSITORY_OPEN_NO_SEARCH = (1 << 0), - GIT_REPOSITORY_OPEN_CROSS_FS = (1 << 1), -} git_repository_open_flag_t; - -/** - * Find and open a repository with extended controls. - * - * @param out Pointer to the repo which will be opened. This can - * actually be NULL if you only want to use the error code to - * see if a repo at this path could be opened. - * @param path Path to open as git repository. If the flags - * permit "searching", then this can be a path to a subdirectory - * inside the working directory of the repository. - * @param flags A combination of the GIT_REPOSITORY_OPEN flags above. - * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR delimited list of path - * prefixes at which the search for a containing repository should - * terminate. - * @return 0 on success, GIT_ENOTFOUND if no repository could be found, - * or -1 if there was a repository but open failed for some reason - * (such as repo corruption or system errors). - */ -GIT_EXTERN(int) git_repository_open_ext( - git_repository **out, - const char *path, - unsigned int flags, - const char *ceiling_dirs); - -/** - * Free a previously allocated repository - * - * Note that after a repository is free'd, all the objects it has spawned - * will still exist until they are manually closed by the user - * with `git_object_free`, but accessing any of the attributes of - * an object without a backing repository will result in undefined - * behavior - * - * @param repo repository handle to close. If NULL nothing occurs. - */ -GIT_EXTERN(void) git_repository_free(git_repository *repo); - -/** - * Creates a new Git repository in the given folder. - * - * TODO: - * - Reinit the repository - * - * @param out pointer to the repo which will be created or reinitialized - * @param path the path to the repository - * @param is_bare if true, a Git repository without a working directory is - * created at the pointed path. If false, provided path will be - * considered as the working directory into which the .git directory - * will be created. - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_repository_init( - git_repository **out, - const char *path, - unsigned is_bare); - -/** - * Option flags for `git_repository_init_ext`. - * - * These flags configure extra behaviors to `git_repository_init_ext`. - * In every case, the default behavior is the zero value (i.e. flag is - * not set). Just OR the flag values together for the `flags` parameter - * when initializing a new repo. Details of individual values are: - * - * * BARE - Create a bare repository with no working directory. - * * NO_REINIT - Return an EEXISTS error if the repo_path appears to - * already be an git repository. - * * NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo - * path for non-bare repos (if it is not already there), but - * passing this flag prevents that behavior. - * * MKDIR - Make the repo_path (and workdir_path) as needed. Init is - * always willing to create the ".git" directory even without this - * flag. This flag tells init to create the trailing component of - * the repo and workdir paths as needed. - * * MKPATH - Recursively make all components of the repo and workdir - * paths as necessary. - * * EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to - * initialize a new repo. This flags enables external templates, - * looking the "template_path" from the options if set, or the - * `init.templatedir` global config if not, or falling back on - * "/usr/share/git-core/templates" if it exists. - */ -typedef enum { - GIT_REPOSITORY_INIT_BARE = (1u << 0), - GIT_REPOSITORY_INIT_NO_REINIT = (1u << 1), - GIT_REPOSITORY_INIT_NO_DOTGIT_DIR = (1u << 2), - GIT_REPOSITORY_INIT_MKDIR = (1u << 3), - GIT_REPOSITORY_INIT_MKPATH = (1u << 4), - GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE = (1u << 5), -} git_repository_init_flag_t; - -/** - * Mode options for `git_repository_init_ext`. - * - * Set the mode field of the `git_repository_init_options` structure - * either to the custom mode that you would like, or to one of the - * following modes: - * - * * SHARED_UMASK - Use permissions configured by umask - the default. - * * SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo - * to be group writable and "g+sx" for sticky group assignment. - * * SHARED_ALL - Use "--shared=all" behavior, adding world readability. - * * Anything else - Set to custom value. - */ -typedef enum { - GIT_REPOSITORY_INIT_SHARED_UMASK = 0, - GIT_REPOSITORY_INIT_SHARED_GROUP = 0002775, - GIT_REPOSITORY_INIT_SHARED_ALL = 0002777, -} git_repository_init_mode_t; - -/** - * Extended options structure for `git_repository_init_ext`. - * - * This contains extra options for `git_repository_init_ext` that enable - * additional initialization features. The fields are: - * - * * flags - Combination of GIT_REPOSITORY_INIT flags above. - * * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... - * constants above, or to a custom value that you would like. - * * workdir_path - The path to the working dir or NULL for default (i.e. - * repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH, - * IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not - * the "natural" working directory, a .git gitlink file will be - * created here linking to the repo_path. - * * description - If set, this will be used to initialize the "description" - * file in the repository, instead of using the template content. - * * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, - * this contains the path to use for the template directory. If - * this is NULL, the config or default directory options will be - * used instead. - * * initial_head - The name of the head to point HEAD at. If NULL, then - * this will be treated as "master" and the HEAD ref will be set - * to "refs/heads/master". If this begins with "refs/" it will be - * used verbatim; otherwise "refs/heads/" will be prefixed. - * * origin_url - If this is non-NULL, then after the rest of the - * repository initialization is completed, an "origin" remote - * will be added pointing to this URL. - */ -typedef struct { - unsigned int version; - uint32_t flags; - uint32_t mode; - const char *workdir_path; - const char *description; - const char *template_path; - const char *initial_head; - const char *origin_url; -} git_repository_init_options; - -#define GIT_REPOSITORY_INIT_OPTIONS_VERSION 1 -#define GIT_REPOSITORY_INIT_OPTIONS_INIT {GIT_REPOSITORY_INIT_OPTIONS_VERSION} - -/** - * Create a new Git repository in the given folder with extended controls. - * - * This will initialize a new git repository (creating the repo_path - * if requested by flags) and working directory as needed. It will - * auto-detect the case sensitivity of the file system and if the - * file system supports file mode bits correctly. - * - * @param out Pointer to the repo which will be created or reinitialized. - * @param repo_path The path to the repository. - * @param opts Pointer to git_repository_init_options struct. - * @return 0 or an error code on failure. - */ -GIT_EXTERN(int) git_repository_init_ext( - git_repository **out, - const char *repo_path, - git_repository_init_options *opts); - -/** - * Retrieve and resolve the reference pointed at by HEAD. - * - * The returned `git_reference` will be owned by caller and - * `git_reference_free()` must be called when done with it to release the - * allocated memory and prevent a leak. - * - * @param out pointer to the reference which will be retrieved - * @param repo a repository object - * - * @return 0 on success, GIT_EORPHANEDHEAD when HEAD points to a non existing - * branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise - */ -GIT_EXTERN(int) git_repository_head(git_reference **out, git_repository *repo); - -/** - * Check if a repository's HEAD is detached - * - * A repository's HEAD is detached when it points directly to a commit - * instead of a branch. - * - * @param repo Repo to test - * @return 1 if HEAD is detached, 0 if it's not; error code if there - * was an error. - */ -GIT_EXTERN(int) git_repository_head_detached(git_repository *repo); - -/** - * Check if the current branch is an orphan - * - * An orphan branch is one named from HEAD but which doesn't exist in - * the refs namespace, because it doesn't have any commit to point to. - * - * @param repo Repo to test - * @return 1 if the current branch is an orphan, 0 if it's not; error - * code if there was an error - */ -GIT_EXTERN(int) git_repository_head_orphan(git_repository *repo); - -/** - * Check if a repository is empty - * - * An empty repository has just been initialized and contains - * no references. - * - * @param repo Repo to test - * @return 1 if the repository is empty, 0 if it isn't, error code - * if the repository is corrupted - */ -GIT_EXTERN(int) git_repository_is_empty(git_repository *repo); - -/** - * Get the path of this repository - * - * This is the path of the `.git` folder for normal repositories, - * or of the repository itself for bare repositories. - * - * @param repo A repository object - * @return the path to the repository - */ -GIT_EXTERN(const char *) git_repository_path(git_repository *repo); - -/** - * Get the path of the working directory for this repository - * - * If the repository is bare, this function will always return - * NULL. - * - * @param repo A repository object - * @return the path to the working dir, if it exists - */ -GIT_EXTERN(const char *) git_repository_workdir(git_repository *repo); - -/** - * Set the path to the working directory for this repository - * - * The working directory doesn't need to be the same one - * that contains the `.git` folder for this repository. - * - * If this repository is bare, setting its working directory - * will turn it into a normal repository, capable of performing - * all the common workdir operations (checkout, status, index - * manipulation, etc). - * - * @param repo A repository object - * @param workdir The path to a working directory - * @param update_gitlink Create/update gitlink in workdir and set config - * "core.worktree" (if workdir is not the parent of the .git directory) - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_set_workdir( - git_repository *repo, const char *workdir, int update_gitlink); - -/** - * Check if a repository is bare - * - * @param repo Repo to test - * @return 1 if the repository is bare, 0 otherwise. - */ -GIT_EXTERN(int) git_repository_is_bare(git_repository *repo); - -/** - * Get the configuration file for this repository. - * - * If a configuration file has not been set, the default - * config set for the repository will be returned, including - * global and system configurations (if they are available). - * - * The configuration file must be freed once it's no longer - * being used by the user. - * - * @param out Pointer to store the loaded config file - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_config(git_config **out, git_repository *repo); - -/** - * Set the configuration file for this repository - * - * This configuration file will be used for all configuration - * queries involving this repository. - * - * The repository will keep a reference to the config file; - * the user must still free the config after setting it - * to the repository, or it will leak. - * - * @param repo A repository object - * @param config A Config object - */ -GIT_EXTERN(void) git_repository_set_config(git_repository *repo, git_config *config); - -/** - * Get the Object Database for this repository. - * - * If a custom ODB has not been set, the default - * database for the repository will be returned (the one - * located in `.git/objects`). - * - * The ODB must be freed once it's no longer being used by - * the user. - * - * @param out Pointer to store the loaded ODB - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_odb(git_odb **out, git_repository *repo); - -/** - * Set the Object Database for this repository - * - * The ODB will be used for all object-related operations - * involving this repository. - * - * The repository will keep a reference to the ODB; the user - * must still free the ODB object after setting it to the - * repository, or it will leak. - * - * @param repo A repository object - * @param odb An ODB object - */ -GIT_EXTERN(void) git_repository_set_odb(git_repository *repo, git_odb *odb); - -/** - * Get the Index file for this repository. - * - * If a custom index has not been set, the default - * index for the repository will be returned (the one - * located in `.git/index`). - * - * The index must be freed once it's no longer being used by - * the user. - * - * @param out Pointer to store the loaded index - * @param repo A repository object - * @return 0, or an error code - */ -GIT_EXTERN(int) git_repository_index(git_index **out, git_repository *repo); - -/** - * Set the index file for this repository - * - * This index will be used for all index-related operations - * involving this repository. - * - * The repository will keep a reference to the index file; - * the user must still free the index after setting it - * to the repository, or it will leak. - * - * @param repo A repository object - * @param index An index object - */ -GIT_EXTERN(void) git_repository_set_index(git_repository *repo, git_index *index); - -/** - * Retrieve git's prepared message - * - * Operations such as git revert/cherry-pick/merge with the -n option - * stop just short of creating a commit with the changes and save - * their prepared message in .git/MERGE_MSG so the next git-commit - * execution can present it to the user for them to amend if they - * wish. - * - * Use this function to get the contents of this file. Don't forget to - * remove the file after you create the commit. - * - * @param out Buffer to write data into or NULL to just read required size - * @param len Length of buffer in bytes - * @param repo Repository to read prepared message from - * @return Bytes written to buffer, GIT_ENOTFOUND if no message, or -1 on error - */ -GIT_EXTERN(int) git_repository_message(char *out, size_t len, git_repository *repo); - -/** - * Remove git's prepared message. - * - * Remove the message that `git_repository_message` retrieves. - */ -GIT_EXTERN(int) git_repository_message_remove(git_repository *repo); - -/** - * Remove all the metadata associated with an ongoing git merge, including - * MERGE_HEAD, MERGE_MSG, etc. - * - * @param repo A repository object - * @return 0 on success, or error - */ -GIT_EXTERN(int) git_repository_merge_cleanup(git_repository *repo); - -typedef int (*git_repository_fetchhead_foreach_cb)(const char *ref_name, - const char *remote_url, - const git_oid *oid, - unsigned int is_merge, - void *payload); - -/** - * Call callback 'callback' for each entry in the given FETCH_HEAD file. - * - * @param repo A repository object - * @param callback Callback function - * @param payload Pointer to callback data (optional) - * @return 0 on success, GIT_ENOTFOUND, GIT_EUSER or error - */ -GIT_EXTERN(int) git_repository_fetchhead_foreach(git_repository *repo, - git_repository_fetchhead_foreach_cb callback, - void *payload); - -typedef int (*git_repository_mergehead_foreach_cb)(const git_oid *oid, - void *payload); - -/** - * If a merge is in progress, call callback 'cb' for each commit ID in the - * MERGE_HEAD file. - * - * @param repo A repository object - * @param callback Callback function - * @param apyload Pointer to callback data (optional) - * @return 0 on success, GIT_ENOTFOUND, GIT_EUSER or error - */ -GIT_EXTERN(int) git_repository_mergehead_foreach(git_repository *repo, - git_repository_mergehead_foreach_cb callback, - void *payload); - -/** - * Calculate hash of file using repository filtering rules. - * - * If you simply want to calculate the hash of a file on disk with no filters, - * you can just use the `git_odb_hashfile()` API. However, if you want to - * hash a file in the repository and you want to apply filtering rules (e.g. - * crlf filters) before generating the SHA, then use this function. - * - * @param out Output value of calculated SHA - * @param repo Repository pointer - * @param path Path to file on disk whose contents should be hashed. If the - * repository is not NULL, this can be a relative path. - * @param type The object type to hash as (e.g. GIT_OBJ_BLOB) - * @param as_path The path to use to look up filtering rules. If this is - * NULL, then the `path` parameter will be used instead. If - * this is passed as the empty string, then no filters will be - * applied when calculating the hash. - */ -GIT_EXTERN(int) git_repository_hashfile( - git_oid *out, - git_repository *repo, - const char *path, - git_otype type, - const char *as_path); - -/** - * Make the repository HEAD point to the specified reference. - * - * If the provided reference points to a Tree or a Blob, the HEAD is - * unaltered and -1 is returned. - * - * If the provided reference points to a branch, the HEAD will point - * to that branch, staying attached, or become attached if it isn't yet. - * If the branch doesn't exist yet, no error will be return. The HEAD - * will then be attached to an unborn branch. - * - * Otherwise, the HEAD will be detached and will directly point to - * the Commit. - * - * @param repo Repository pointer - * @param refname Canonical name of the reference the HEAD should point at - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_set_head( - git_repository* repo, - const char* refname); - -/** - * Make the repository HEAD directly point to the Commit. - * - * If the provided committish cannot be found in the repository, the HEAD - * is unaltered and GIT_ENOTFOUND is returned. - * - * If the provided commitish cannot be peeled into a commit, the HEAD - * is unaltered and -1 is returned. - * - * Otherwise, the HEAD will eventually be detached and will directly point to - * the peeled Commit. - * - * @param repo Repository pointer - * @param commitish Object id of the Commit the HEAD should point to - * @return 0 on success, or an error code - */ -GIT_EXTERN(int) git_repository_set_head_detached( - git_repository* repo, - const git_oid* commitish); - -/** - * Detach the HEAD. - * - * If the HEAD is already detached and points to a Commit, 0 is returned. - * - * If the HEAD is already detached and points to a Tag, the HEAD is - * updated into making it point to the peeled Commit, and 0 is returned. - * - * If the HEAD is already detached and points to a non commitish, the HEAD is - * unaltered, and -1 is returned. - * - * Otherwise, the HEAD will be detached and point to the peeled Commit. - * - * @param repo Repository pointer - * @return 0 on success, GIT_EORPHANEDHEAD when HEAD points to a non existing - * branch or an error code - */ -GIT_EXTERN(int) git_repository_detach_head( - git_repository* repo); - -typedef enum { - GIT_REPOSITORY_STATE_NONE, - GIT_REPOSITORY_STATE_MERGE, - GIT_REPOSITORY_STATE_REVERT, - GIT_REPOSITORY_STATE_CHERRY_PICK, - GIT_REPOSITORY_STATE_BISECT, - GIT_REPOSITORY_STATE_REBASE, - GIT_REPOSITORY_STATE_REBASE_INTERACTIVE, - GIT_REPOSITORY_STATE_REBASE_MERGE, - GIT_REPOSITORY_STATE_APPLY_MAILBOX, - GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE, -} git_repository_state_t; - -/** - * Determines the status of a git repository - ie, whether an operation - * (merge, cherry-pick, etc) is in progress. - * - * @param repo Repository pointer - * @return The state of the repository - */ -GIT_EXTERN(int) git_repository_state(git_repository *repo); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/reset.h b/git2/include/git2/reset.h deleted file mode 100644 index 00d25dff0..000000000 --- a/git2/include/git2/reset.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_reset_h__ -#define INCLUDE_git_reset_h__ - -/** - * @file git2/reset.h - * @brief Git reset management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Kinds of reset operation - */ -typedef enum { - GIT_RESET_SOFT = 1, /** Move the head to the given commit */ - GIT_RESET_MIXED = 2, /** SOFT plus reset index to the commit */ - GIT_RESET_HARD = 3, /** MIXED plus changes in working tree discarded */ -} git_reset_t; - -/** - * Sets the current head to the specified commit oid and optionally - * resets the index and working tree to match. - * - * SOFT reset means the head will be moved to the commit. - * - * MIXED reset will trigger a SOFT reset, plus the index will be replaced - * with the content of the commit tree. - * - * HARD reset will trigger a MIXED reset and the working directory will be - * replaced with the content of the index. (Untracked and ignored files - * will be left alone, however.) - * - * TODO: Implement remaining kinds of resets. - * - * @param repo Repository where to perform the reset operation. - * - * @param target Object to which the Head should be moved to. This object - * must belong to the given `repo` and can either be a git_commit or a - * git_tag. When a git_tag is being passed, it should be dereferencable - * to a git_commit which oid will be used as the target of the branch. - * - * @param reset_type Kind of reset operation to perform. - * - * @return 0 on success or an error code < 0 - */ -GIT_EXTERN(int) git_reset( - git_repository *repo, git_object *target, git_reset_t reset_type); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/revparse.h b/git2/include/git2/revparse.h deleted file mode 100644 index 6edb7767c..000000000 --- a/git2/include/git2/revparse.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_revparse_h__ -#define INCLUDE_git_revparse_h__ - -#include "common.h" -#include "types.h" - - -/** - * @file git2/revparse.h - * @brief Git revision parsing routines - * @defgroup git_revparse Git revision parsing routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Find an object, as specified by a revision string. See `man gitrevisions`, or the documentation - * for `git rev-parse` for information on the syntax accepted. - * - * @param out pointer to output object - * @param repo the repository to search in - * @param spec the textual specification for an object - * @return 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, - * GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_revparse_single(git_object **out, git_repository *repo, const char *spec); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/revwalk.h b/git2/include/git2/revwalk.h deleted file mode 100644 index ad57b622e..000000000 --- a/git2/include/git2/revwalk.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_revwalk_h__ -#define INCLUDE_git_revwalk_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/revwalk.h - * @brief Git revision traversal routines - * @defgroup git_revwalk Git revision traversal routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Sort the repository contents in no particular ordering; - * this sorting is arbitrary, implementation-specific - * and subject to change at any time. - * This is the default sorting for new walkers. - */ -#define GIT_SORT_NONE (0) - -/** - * Sort the repository contents in topological order - * (parents before children); this sorting mode - * can be combined with time sorting. - */ -#define GIT_SORT_TOPOLOGICAL (1 << 0) - -/** - * Sort the repository contents by commit time; - * this sorting mode can be combined with - * topological sorting. - */ -#define GIT_SORT_TIME (1 << 1) - -/** - * Iterate through the repository contents in reverse - * order; this sorting mode can be combined with - * any of the above. - */ -#define GIT_SORT_REVERSE (1 << 2) - -/** - * Allocate a new revision walker to iterate through a repo. - * - * This revision walker uses a custom memory pool and an internal - * commit cache, so it is relatively expensive to allocate. - * - * For maximum performance, this revision walker should be - * reused for different walks. - * - * This revision walker is *not* thread safe: it may only be - * used to walk a repository on a single thread; however, - * it is possible to have several revision walkers in - * several different threads walking the same repository. - * - * @param out pointer to the new revision walker - * @param repo the repo to walk through - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_new(git_revwalk **out, git_repository *repo); - -/** - * Reset the revision walker for reuse. - * - * This will clear all the pushed and hidden commits, and - * leave the walker in a blank state (just like at - * creation) ready to receive new commit pushes and - * start a new walk. - * - * The revision walk is automatically reset when a walk - * is over. - * - * @param walker handle to reset. - */ -GIT_EXTERN(void) git_revwalk_reset(git_revwalk *walker); - -/** - * Mark a commit to start traversal from. - * - * The given OID must belong to a commit on the walked - * repository. - * - * The given commit will be used as one of the roots - * when starting the revision walk. At least one commit - * must be pushed the repository before a walk can - * be started. - * - * @param walk the walker being used for the traversal. - * @param id the oid of the commit to start from. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push(git_revwalk *walk, const git_oid *id); - -/** - * Push matching references - * - * The OIDs pointed to by the references that match the given glob - * pattern will be pushed to the revision walker. - * - * A leading 'refs/' is implied if not present as well as a trailing - * '/ *' if the glob lacks '?', '*' or '['. - * - * @param walk the walker being used for the traversal - * @param glob the glob pattern references should match - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push_glob(git_revwalk *walk, const char *glob); - -/** - * Push the repository's HEAD - * - * @param walk the walker being used for the traversal - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push_head(git_revwalk *walk); - -/** - * Mark a commit (and its ancestors) uninteresting for the output. - * - * The given OID must belong to a commit on the walked - * repository. - * - * The resolved commit and all its parents will be hidden from the - * output on the revision walk. - * - * @param walk the walker being used for the traversal. - * @param commit_id the oid of commit that will be ignored during the traversal - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide(git_revwalk *walk, const git_oid *commit_id); - -/** - * Hide matching references. - * - * The OIDs pointed to by the references that match the given glob - * pattern and their ancestors will be hidden from the output on the - * revision walk. - * - * A leading 'refs/' is implied if not present as well as a trailing - * '/ *' if the glob lacks '?', '*' or '['. - * - * @param walk the walker being used for the traversal - * @param glob the glob pattern references should match - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide_glob(git_revwalk *walk, const char *glob); - -/** - * Hide the repository's HEAD - * - * @param walk the walker being used for the traversal - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide_head(git_revwalk *walk); - -/** - * Push the OID pointed to by a reference - * - * The reference must point to a commit. - * - * @param walk the walker being used for the traversal - * @param refname the reference to push - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_push_ref(git_revwalk *walk, const char *refname); - -/** - * Hide the OID pointed to by a reference - * - * The reference must point to a commit. - * - * @param walk the walker being used for the traversal - * @param refname the reference to hide - * @return 0 or an error code - */ -GIT_EXTERN(int) git_revwalk_hide_ref(git_revwalk *walk, const char *refname); - -/** - * Get the next commit from the revision walk. - * - * The initial call to this method is *not* blocking when - * iterating through a repo with a time-sorting mode. - * - * Iterating with Topological or inverted modes makes the initial - * call blocking to preprocess the commit list, but this block should be - * mostly unnoticeable on most repositories (topological preprocessing - * times at 0.3s on the git.git repo). - * - * The revision walker is reset when the walk is over. - * - * @param out Pointer where to store the oid of the next commit - * @param walk the walker to pop the commit from. - * @return 0 if the next commit was found; - * GIT_ITEROVER if there are no commits left to iterate - */ -GIT_EXTERN(int) git_revwalk_next(git_oid *out, git_revwalk *walk); - -/** - * Change the sorting mode when iterating through the - * repository's contents. - * - * Changing the sorting mode resets the walker. - * - * @param walk the walker being used for the traversal. - * @param sort_mode combination of GIT_SORT_XXX flags - */ -GIT_EXTERN(void) git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode); - -/** - * Free a revision walker previously allocated. - * - * @param walk traversal handle to close. If NULL nothing occurs. - */ -GIT_EXTERN(void) git_revwalk_free(git_revwalk *walk); - -/** - * Return the repository on which this walker - * is operating. - * - * @param walk the revision walker - * @return the repository being walked - */ -GIT_EXTERN(git_repository *) git_revwalk_repository(git_revwalk *walk); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/signature.h b/git2/include/git2/signature.h deleted file mode 100644 index 00d19de66..000000000 --- a/git2/include/git2/signature.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_signature_h__ -#define INCLUDE_git_signature_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/signature.h - * @brief Git signature creation - * @defgroup git_signature Git signature creation - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Create a new action signature. - * - * Call `git_signature_free()` to free the data. - * - * Note: angle brackets ('<' and '>') characters are not allowed - * to be used in either the `name` or the `email` parameter. - * - * @param out new signature, in case of error NULL - * @param name name of the person - * @param email email of the person - * @param time time when the action happened - * @param offset timezone offset in minutes for the time - * @return 0 or an error code - */ -GIT_EXTERN(int) git_signature_new(git_signature **out, const char *name, const char *email, git_time_t time, int offset); - -/** - * Create a new action signature with a timestamp of 'now'. - * - * Call `git_signature_free()` to free the data. - * - * @param out new signature, in case of error NULL - * @param name name of the person - * @param email email of the person - * @return 0 or an error code - */ -GIT_EXTERN(int) git_signature_now(git_signature **out, const char *name, const char *email); - - -/** - * Create a copy of an existing signature. All internal strings are also - * duplicated. - * - * Call `git_signature_free()` to free the data. - * - * @param sig signature to duplicated - * @return a copy of sig, NULL on out of memory - */ -GIT_EXTERN(git_signature *) git_signature_dup(const git_signature *sig); - -/** - * Free an existing signature. - * - * Because the signature is not an opaque structure, it is legal to free it - * manually, but be sure to free the "name" and "email" strings in addition - * to the structure itself. - * - * @param sig signature to free - */ -GIT_EXTERN(void) git_signature_free(git_signature *sig); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/stash.h b/git2/include/git2/stash.h deleted file mode 100644 index cf8bc9d4c..000000000 --- a/git2/include/git2/stash.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_stash_h__ -#define INCLUDE_git_stash_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/stash.h - * @brief Git stash management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -typedef enum { - GIT_STASH_DEFAULT = 0, - - /* All changes already added to the index - * are left intact in the working directory - */ - GIT_STASH_KEEP_INDEX = (1 << 0), - - /* All untracked files are also stashed and then - * cleaned up from the working directory - */ - GIT_STASH_INCLUDE_UNTRACKED = (1 << 1), - - /* All ignored files are also stashed and then - * cleaned up from the working directory - */ - GIT_STASH_INCLUDE_IGNORED = (1 << 2), -} git_stash_flags; - -/** - * Save the local modifications to a new stash. - * - * @param out Object id of the commit containing the stashed state. - * This commit is also the target of the direct reference refs/stash. - * - * @param repo The owning repository. - * - * @param stasher The identity of the person performing the stashing. - * - * @param message Optional description along with the stashed state. - * - * @param flags Flags to control the stashing process. (see GIT_STASH_* above) - * - * @return 0 on success, GIT_ENOTFOUND where there's nothing to stash, - * or error code. - */ -GIT_EXTERN(int) git_stash_save( - git_oid *out, - git_repository *repo, - git_signature *stasher, - const char *message, - unsigned int flags); - -/** - * When iterating over all the stashed states, callback that will be - * issued per entry. - * - * @param index The position within the stash list. 0 points to the - * most recent stashed state. - * - * @param message The stash message. - * - * @param stash_id The commit oid of the stashed state. - * - * @param payload Extra parameter to callback function. - * - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -typedef int (*git_stash_cb)( - size_t index, - const char* message, - const git_oid *stash_id, - void *payload); - -/** - * Loop over all the stashed states and issue a callback for each one. - * - * If the callback returns a non-zero value, this will stop looping. - * - * @param repo Repository where to find the stash. - * - * @param callabck Callback to invoke per found stashed state. The most recent - * stash state will be enumerated first. - * - * @param payload Extra parameter to callback function. - * - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_stash_foreach( - git_repository *repo, - git_stash_cb callback, - void *payload); - -/** - * Remove a single stashed state from the stash list. - * - * @param repo The owning repository. - * - * @param index The position within the stash list. 0 points to the - * most recent stashed state. - * - * @return 0 on success, or error code - */ - -GIT_EXTERN(int) git_stash_drop( - git_repository *repo, - size_t index); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/status.h b/git2/include/git2/status.h deleted file mode 100644 index d0c4a496d..000000000 --- a/git2/include/git2/status.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_status_h__ -#define INCLUDE_git_status_h__ - -#include "common.h" -#include "types.h" - -/** - * @file git2/status.h - * @brief Git file status routines - * @defgroup git_status Git file status routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Status flags for a single file. - * - * A combination of these values will be returned to indicate the status of - * a file. Status compares the working directory, the index, and the - * current HEAD of the repository. The `GIT_STATUS_INDEX` set of flags - * represents the status of file in the index relative to the HEAD, and the - * `GIT_STATUS_WT` set of flags represent the status of the file in the - * working directory relative to the index. - */ -typedef enum { - GIT_STATUS_CURRENT = 0, - - GIT_STATUS_INDEX_NEW = (1u << 0), - GIT_STATUS_INDEX_MODIFIED = (1u << 1), - GIT_STATUS_INDEX_DELETED = (1u << 2), - GIT_STATUS_INDEX_RENAMED = (1u << 3), - GIT_STATUS_INDEX_TYPECHANGE = (1u << 4), - - GIT_STATUS_WT_NEW = (1u << 7), - GIT_STATUS_WT_MODIFIED = (1u << 8), - GIT_STATUS_WT_DELETED = (1u << 9), - GIT_STATUS_WT_TYPECHANGE = (1u << 10), - - GIT_STATUS_IGNORED = (1u << 14), -} git_status_t; - -/** - * Function pointer to receive status on individual files - * - * `path` is the relative path to the file from the root of the repository. - * - * `status_flags` is a combination of `git_status_t` values that apply. - * - * `payload` is the value you passed to the foreach function as payload. - */ -typedef int (*git_status_cb)( - const char *path, unsigned int status_flags, void *payload); - -/** - * Gather file statuses and run a callback for each one. - * - * The callback is passed the path of the file, the status (a combination of - * the `git_status_t` values above) and the `payload` data pointer passed - * into this function. - * - * If the callback returns a non-zero value, this function will stop looping - * and return GIT_EUSER. - * - * @param repo A repository object - * @param callback The function to call on each file - * @param payload Pointer to pass through to callback function - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_status_foreach( - git_repository *repo, - git_status_cb callback, - void *payload); - -/** - * For extended status, select the files on which to report status. - * - * - GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This is the - * rough equivalent of `git status --porcelain` where each file - * will receive a callback indicating its status in the index and - * in the workdir. - * - GIT_STATUS_SHOW_INDEX_ONLY will only make callbacks for index - * side of status. The status of the index contents relative to - * the HEAD will be given. - * - GIT_STATUS_SHOW_WORKDIR_ONLY will only make callbacks for the - * workdir side of status, reporting the status of workdir content - * relative to the index. - * - GIT_STATUS_SHOW_INDEX_THEN_WORKDIR behaves like index-only - * followed by workdir-only, causing two callbacks to be issued - * per file (first index then workdir). This is slightly more - * efficient than making separate calls. This makes it easier to - * emulate the output of a plain `git status`. - */ -typedef enum { - GIT_STATUS_SHOW_INDEX_AND_WORKDIR = 0, - GIT_STATUS_SHOW_INDEX_ONLY = 1, - GIT_STATUS_SHOW_WORKDIR_ONLY = 2, - GIT_STATUS_SHOW_INDEX_THEN_WORKDIR = 3, -} git_status_show_t; - -/** - * Flags to control status callbacks - * - * - GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made - * on untracked files. These will only be made if the workdir files are - * included in the status "show" option. - * - GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files should get - * callbacks. Again, these callbacks will only be made if the workdir - * files are included in the status "show" option. Right now, there is - * no option to include all files in directories that are ignored - * completely. - * - GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be - * made even on unmodified files. - * - GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that directories which - * appear to be submodules should just be skipped over. - * - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that the contents of - * untracked directories should be included in the status. Normally if - * an entire directory is new, then just the top-level directory will be - * included (with a trailing slash on the entry name). Given this flag, - * the directory itself will not be included, but all the files in it - * will. - * - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path - * will be treated as a literal path, and not as a pathspec. - * - * Calling `git_status_foreach()` is like calling the extended version - * with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, - * and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. - */ -typedef enum { - GIT_STATUS_OPT_INCLUDE_UNTRACKED = (1 << 0), - GIT_STATUS_OPT_INCLUDE_IGNORED = (1 << 1), - GIT_STATUS_OPT_INCLUDE_UNMODIFIED = (1 << 2), - GIT_STATUS_OPT_EXCLUDE_SUBMODULES = (1 << 3), - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = (1 << 4), - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH = (1 << 5), -} git_status_opt_t; - -/** - * Options to control how `git_status_foreach_ext()` will issue callbacks. - * - * This structure is set so that zeroing it out will give you relatively - * sane defaults. - * - * The `show` value is one of the `git_status_show_t` constants that - * control which files to scan and in what order. - * - * The `flags` value is an OR'ed combination of the `git_status_opt_t` - * values above. - * - * The `pathspec` is an array of path patterns to match (using - * fnmatch-style matching), or just an array of paths to match exactly if - * `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified in the flags. - */ -typedef struct { - unsigned int version; - git_status_show_t show; - unsigned int flags; - git_strarray pathspec; -} git_status_options; - -#define GIT_STATUS_OPTIONS_VERSION 1 -#define GIT_STATUS_OPTIONS_INIT {GIT_STATUS_OPTIONS_VERSION} - -/** - * Gather file status information and run callbacks as requested. - * - * This is an extended version of the `git_status_foreach()` API that - * allows for more granular control over which paths will be processed and - * in what order. See the `git_status_options` structure for details - * about the additional controls that this makes available. - * - * @param repo Repository object - * @param opts Status options structure - * @param callback The function to call on each file - * @param payload Pointer to pass through to callback function - * @return 0 on success, GIT_EUSER on non-zero callback, or error code - */ -GIT_EXTERN(int) git_status_foreach_ext( - git_repository *repo, - const git_status_options *opts, - git_status_cb callback, - void *payload); - -/** - * Get file status for a single file. - * - * This is not quite the same as calling `git_status_foreach_ext()` with - * the pathspec set to the specified path. - * - * @param status_flags The status value for the file - * @param repo A repository object - * @param path The file to retrieve status for, rooted at the repo's workdir - * @return 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD, - * index, and work tree, GIT_EINVALIDPATH if `path` points at a folder, - * GIT_EAMBIGUOUS if "path" matches multiple files, -1 on other error. - */ -GIT_EXTERN(int) git_status_file( - unsigned int *status_flags, - git_repository *repo, - const char *path); - -/** - * Test if the ignore rules apply to a given file. - * - * This function checks the ignore rules to see if they would apply to the - * given file. This indicates if the file would be ignored regardless of - * whether the file is already in the index or committed to the repository. - * - * One way to think of this is if you were to do "git add ." on the - * directory containing the file, would it be added or not? - * - * @param ignored Boolean returning 0 if the file is not ignored, 1 if it is - * @param repo A repository object - * @param path The file to check ignores for, rooted at the repo's workdir. - * @return 0 if ignore rules could be processed for the file (regardless - * of whether it exists or not), or an error < 0 if they could not. - */ -GIT_EXTERN(int) git_status_should_ignore( - int *ignored, - git_repository *repo, - const char *path); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/strarray.h b/git2/include/git2/strarray.h deleted file mode 100644 index 6ea570c14..000000000 --- a/git2/include/git2/strarray.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_strarray_h__ -#define INCLUDE_git_strarray_h__ - -#include "common.h" - -/** - * @file git2/strarray.h - * @brief Git string array routines - * @defgroup git_strarray Git string array routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** Array of strings */ -typedef struct git_strarray { - char **strings; - size_t count; -} git_strarray; - -/** - * Close a string array object - * - * This method should be called on `git_strarray` objects where the strings - * array is allocated and contains allocated strings, such as what you - * would get from `git_strarray_copy()`. Not doing so, will result in a - * memory leak. - * - * This does not free the `git_strarray` itself, since the library will - * never allocate that object directly itself (it is more commonly embedded - * inside another struct or created on the stack). - * - * @param array git_strarray from which to free string data - */ -GIT_EXTERN(void) git_strarray_free(git_strarray *array); - -/** - * Copy a string array object from source to target. - * - * Note: target is overwritten and hence should be empty, - * otherwise its contents are leaked. - * - * @param tgt target - * @param src source - * @return 0 on success, < 0 on allocation failure - */ -GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src); - - -/** @} */ -GIT_END_DECL - -#endif - diff --git a/git2/include/git2/submodule.h b/git2/include/git2/submodule.h deleted file mode 100644 index 1abd33e79..000000000 --- a/git2/include/git2/submodule.h +++ /dev/null @@ -1,527 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_submodule_h__ -#define INCLUDE_git_submodule_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" - -/** - * @file git2/submodule.h - * @brief Git submodule management utilities - * @defgroup git_submodule Git submodule management routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Opaque structure representing a submodule. - * - * Submodule support in libgit2 builds a list of known submodules and keeps - * it in the repository. The list is built from the .gitmodules file, the - * .git/config file, the index, and the HEAD tree. Items in the working - * directory that look like submodules (i.e. a git repo) but are not - * mentioned in those places won't be tracked. - */ -typedef struct git_submodule git_submodule; - -/** - * Values that could be specified for the update rule of a submodule. - * - * Use the DEFAULT value if you have altered the update value via - * `git_submodule_set_update()` and wish to reset to the original default. - */ -typedef enum { - GIT_SUBMODULE_UPDATE_DEFAULT = -1, - GIT_SUBMODULE_UPDATE_CHECKOUT = 0, - GIT_SUBMODULE_UPDATE_REBASE = 1, - GIT_SUBMODULE_UPDATE_MERGE = 2, - GIT_SUBMODULE_UPDATE_NONE = 3 -} git_submodule_update_t; - -/** - * Values that could be specified for how closely to examine the - * working directory when getting submodule status. - * - * Use the DEFUALT value if you have altered the ignore value via - * `git_submodule_set_ignore()` and wish to reset to the original value. - */ -typedef enum { - GIT_SUBMODULE_IGNORE_DEFAULT = -1, /* reset to default */ - GIT_SUBMODULE_IGNORE_NONE = 0, /* any change or untracked == dirty */ - GIT_SUBMODULE_IGNORE_UNTRACKED = 1, /* dirty if tracked files change */ - GIT_SUBMODULE_IGNORE_DIRTY = 2, /* only dirty if HEAD moved */ - GIT_SUBMODULE_IGNORE_ALL = 3 /* never dirty */ -} git_submodule_ignore_t; - -/** - * Return codes for submodule status. - * - * A combination of these flags will be returned to describe the status of a - * submodule. Depending on the "ignore" property of the submodule, some of - * the flags may never be returned because they indicate changes that are - * supposed to be ignored. - * - * Submodule info is contained in 4 places: the HEAD tree, the index, config - * files (both .git/config and .gitmodules), and the working directory. Any - * or all of those places might be missing information about the submodule - * depending on what state the repo is in. We consider all four places to - * build the combination of status flags. - * - * There are four values that are not really status, but give basic info - * about what sources of submodule data are available. These will be - * returned even if ignore is set to "ALL". - * - * * IN_HEAD - superproject head contains submodule - * * IN_INDEX - superproject index contains submodule - * * IN_CONFIG - superproject gitmodules has submodule - * * IN_WD - superproject workdir has submodule - * - * The following values will be returned so long as ignore is not "ALL". - * - * * INDEX_ADDED - in index, not in head - * * INDEX_DELETED - in head, not in index - * * INDEX_MODIFIED - index and head don't match - * * WD_UNINITIALIZED - workdir contains empty directory - * * WD_ADDED - in workdir, not index - * * WD_DELETED - in index, not workdir - * * WD_MODIFIED - index and workdir head don't match - * - * The following can only be returned if ignore is "NONE" or "UNTRACKED". - * - * * WD_INDEX_MODIFIED - submodule workdir index is dirty - * * WD_WD_MODIFIED - submodule workdir has modified files - * - * Lastly, the following will only be returned for ignore "NONE". - * - * * WD_UNTRACKED - wd contains untracked files - */ -typedef enum { - GIT_SUBMODULE_STATUS_IN_HEAD = (1u << 0), - GIT_SUBMODULE_STATUS_IN_INDEX = (1u << 1), - GIT_SUBMODULE_STATUS_IN_CONFIG = (1u << 2), - GIT_SUBMODULE_STATUS_IN_WD = (1u << 3), - GIT_SUBMODULE_STATUS_INDEX_ADDED = (1u << 4), - GIT_SUBMODULE_STATUS_INDEX_DELETED = (1u << 5), - GIT_SUBMODULE_STATUS_INDEX_MODIFIED = (1u << 6), - GIT_SUBMODULE_STATUS_WD_UNINITIALIZED = (1u << 7), - GIT_SUBMODULE_STATUS_WD_ADDED = (1u << 8), - GIT_SUBMODULE_STATUS_WD_DELETED = (1u << 9), - GIT_SUBMODULE_STATUS_WD_MODIFIED = (1u << 10), - GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED = (1u << 11), - GIT_SUBMODULE_STATUS_WD_WD_MODIFIED = (1u << 12), - GIT_SUBMODULE_STATUS_WD_UNTRACKED = (1u << 13), -} git_submodule_status_t; - -#define GIT_SUBMODULE_STATUS_IS_UNMODIFIED(S) \ - (((S) & ~(GIT_SUBMODULE_STATUS_IN_HEAD | \ - GIT_SUBMODULE_STATUS_IN_INDEX | \ - GIT_SUBMODULE_STATUS_IN_CONFIG | \ - GIT_SUBMODULE_STATUS_IN_WD)) == 0) - -#define GIT_SUBMODULE_STATUS_IS_WD_DIRTY(S) \ - (((S) & (GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED | \ - GIT_SUBMODULE_STATUS_WD_WD_MODIFIED | \ - GIT_SUBMODULE_STATUS_WD_UNTRACKED)) != 0) - -/** - * Lookup submodule information by name or path. - * - * Given either the submodule name or path (they are usually the same), this - * returns a structure describing the submodule. - * - * There are two expected error scenarios: - * - * - The submodule is not mentioned in the HEAD, the index, and the config, - * but does "exist" in the working directory (i.e. there is a subdirectory - * that is a valid self-contained git repo). In this case, this function - * returns GIT_EEXISTS to indicate the the submodule exists but not in a - * state where a git_submodule can be instantiated. - * - The submodule is not mentioned in the HEAD, index, or config and the - * working directory doesn't contain a value git repo at that path. - * There may or may not be anything else at that path, but nothing that - * looks like a submodule. In this case, this returns GIT_ENOTFOUND. - * - * The submodule object is owned by the containing repo and will be freed - * when the repo is freed. The caller need not free the submodule. - * - * @param submodule Pointer to submodule description object pointer.. - * @param repo The repository. - * @param name The name of the submodule. Trailing slashes will be ignored. - * @return 0 on success, GIT_ENOTFOUND if submodule does not exist, - * GIT_EEXISTS if submodule exists in working directory only, -1 on - * other errors. - */ -GIT_EXTERN(int) git_submodule_lookup( - git_submodule **submodule, - git_repository *repo, - const char *name); - -/** - * Iterate over all tracked submodules of a repository. - * - * See the note on `git_submodule` above. This iterates over the tracked - * submodules as decribed therein. - * - * If you are concerned about items in the working directory that look like - * submodules but are not tracked, the diff API will generate a diff record - * for workdir items that look like submodules but are not tracked, showing - * them as added in the workdir. Also, the status API will treat the entire - * subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item. - * - * @param repo The repository - * @param callback Function to be called with the name of each submodule. - * Return a non-zero value to terminate the iteration. - * @param payload Extra data to pass to callback - * @return 0 on success, -1 on error, or non-zero return value of callback - */ -GIT_EXTERN(int) git_submodule_foreach( - git_repository *repo, - int (*callback)(git_submodule *sm, const char *name, void *payload), - void *payload); - -/** - * Set up a new git submodule for checkout. - * - * This does "git submodule add" up to the fetch and checkout of the - * submodule contents. It preps a new submodule, creates an entry in - * .gitmodules and creates an empty initialized repository either at the - * given path in the working directory or in .git/modules with a gitlink - * from the working directory to the new repo. - * - * To fully emulate "git submodule add" call this function, then open the - * submodule repo and perform the clone step as needed. Lastly, call - * `git_submodule_add_finalize()` to wrap up adding the new submodule and - * .gitmodules to the index to be ready to commit. - * - * @param submodule The newly created submodule ready to open for clone - * @param repo Superproject repository to contain the new submodule - * @param url URL for the submodules remote - * @param path Path at which the submodule should be created - * @param use_gitlink Should workdir contain a gitlink to the repo in - * .git/modules vs. repo directly in workdir. - * @return 0 on success, GIT_EEXISTS if submodule already exists, - * -1 on other errors. - */ -GIT_EXTERN(int) git_submodule_add_setup( - git_submodule **submodule, - git_repository *repo, - const char *url, - const char *path, - int use_gitlink); - -/** - * Resolve the setup of a new git submodule. - * - * This should be called on a submodule once you have called add setup - * and done the clone of the submodule. This adds the .gitmodules file - * and the newly cloned submodule to the index to be ready to be committed - * (but doesn't actually do the commit). - * - * @param submodule The submodule to finish adding. - */ -GIT_EXTERN(int) git_submodule_add_finalize(git_submodule *submodule); - -/** - * Add current submodule HEAD commit to index of superproject. - * - * @param submodule The submodule to add to the index - * @param write_index Boolean if this should immediately write the index - * file. If you pass this as false, you will have to get the - * git_index and explicitly call `git_index_write()` on it to - * save the change. - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_submodule_add_to_index( - git_submodule *submodule, - int write_index); - -/** - * Write submodule settings to .gitmodules file. - * - * This commits any in-memory changes to the submodule to the gitmodules - * file on disk. You may also be interested in `git_submodule_init()` which - * writes submodule info to ".git/config" (which is better for local changes - * to submodule settings) and/or `git_submodule_sync()` which writes - * settings about remotes to the actual submodule repository. - * - * @param submodule The submodule to write. - * @return 0 on success, <0 on failure. - */ -GIT_EXTERN(int) git_submodule_save(git_submodule *submodule); - -/** - * Get the containing repository for a submodule. - * - * This returns a pointer to the repository that contains the submodule. - * This is a just a reference to the repository that was passed to the - * original `git_submodule_lookup()` call, so if that repository has been - * freed, then this may be a dangling reference. - * - * @param submodule Pointer to submodule object - * @return Pointer to `git_repository` - */ -GIT_EXTERN(git_repository *) git_submodule_owner(git_submodule *submodule); - -/** - * Get the name of submodule. - * - * @param submodule Pointer to submodule object - * @return Pointer to the submodule name - */ -GIT_EXTERN(const char *) git_submodule_name(git_submodule *submodule); - -/** - * Get the path to the submodule. - * - * The path is almost always the same as the submodule name, but the - * two are actually not required to match. - * - * @param submodule Pointer to submodule object - * @return Pointer to the submodule path - */ -GIT_EXTERN(const char *) git_submodule_path(git_submodule *submodule); - -/** - * Get the URL for the submodule. - * - * @param submodule Pointer to submodule object - * @return Pointer to the submodule url - */ -GIT_EXTERN(const char *) git_submodule_url(git_submodule *submodule); - -/** - * Set the URL for the submodule. - * - * This sets the URL in memory for the submodule. This will be used for - * any following submodule actions while this submodule data is in memory. - * - * After calling this, you may wish to call `git_submodule_save()` to write - * the changes back to the ".gitmodules" file and `git_submodule_sync()` to - * write the changes to the checked out submodule repository. - * - * @param submodule Pointer to the submodule object - * @param url URL that should be used for the submodule - * @return 0 on success, <0 on failure - */ -GIT_EXTERN(int) git_submodule_set_url(git_submodule *submodule, const char *url); - -/** - * Get the OID for the submodule in the index. - * - * @param submodule Pointer to submodule object - * @return Pointer to git_oid or NULL if submodule is not in index. - */ -GIT_EXTERN(const git_oid *) git_submodule_index_id(git_submodule *submodule); - -/** - * Get the OID for the submodule in the current HEAD tree. - * - * @param submodule Pointer to submodule object - * @return Pointer to git_oid or NULL if submodule is not in the HEAD. - */ -GIT_EXTERN(const git_oid *) git_submodule_head_id(git_submodule *submodule); - -/** - * Get the OID for the submodule in the current working directory. - * - * This returns the OID that corresponds to looking up 'HEAD' in the checked - * out submodule. If there are pending changes in the index or anything - * else, this won't notice that. You should call `git_submodule_status()` - * for a more complete picture about the state of the working directory. - * - * @param submodule Pointer to submodule object - * @return Pointer to git_oid or NULL if submodule is not checked out. - */ -GIT_EXTERN(const git_oid *) git_submodule_wd_id(git_submodule *submodule); - -/** - * Get the ignore rule for the submodule. - * - * There are four ignore values: - * - * - **GIT_SUBMODULE_IGNORE_NONE** will consider any change to the contents - * of the submodule from a clean checkout to be dirty, including the - * addition of untracked files. This is the default if unspecified. - * - **GIT_SUBMODULE_IGNORE_UNTRACKED** examines the contents of the - * working tree (i.e. call `git_status_foreach()` on the submodule) but - * UNTRACKED files will not count as making the submodule dirty. - * - **GIT_SUBMODULE_IGNORE_DIRTY** means to only check if the HEAD of the - * submodule has moved for status. This is fast since it does not need to - * scan the working tree of the submodule at all. - * - **GIT_SUBMODULE_IGNORE_ALL** means not to open the submodule repo. - * The working directory will be consider clean so long as there is a - * checked out version present. - */ -GIT_EXTERN(git_submodule_ignore_t) git_submodule_ignore( - git_submodule *submodule); - -/** - * Set the ignore rule for the submodule. - * - * This sets the ignore rule in memory for the submodule. This will be used - * for any following actions (such as `git_submodule_status()`) while the - * submodule is in memory. You should call `git_submodule_save()` if you - * want to persist the new ignore role. - * - * Calling this again with GIT_SUBMODULE_IGNORE_DEFAULT or calling - * `git_submodule_reload()` will revert the rule to the value that was in the - * original config. - * - * @return old value for ignore - */ -GIT_EXTERN(git_submodule_ignore_t) git_submodule_set_ignore( - git_submodule *submodule, - git_submodule_ignore_t ignore); - -/** - * Get the update rule for the submodule. - */ -GIT_EXTERN(git_submodule_update_t) git_submodule_update( - git_submodule *submodule); - -/** - * Set the update rule for the submodule. - * - * This sets the update rule in memory for the submodule. You should call - * `git_submodule_save()` if you want to persist the new update rule. - * - * Calling this again with GIT_SUBMODULE_UPDATE_DEFAULT or calling - * `git_submodule_reload()` will revert the rule to the value that was in the - * original config. - * - * @return old value for update - */ -GIT_EXTERN(git_submodule_update_t) git_submodule_set_update( - git_submodule *submodule, - git_submodule_update_t update); - -/** - * Read the fetchRecurseSubmodules rule for a submodule. - * - * This accesses the submodule..fetchRecurseSubmodules value for - * the submodule that controls fetching behavior for the submodule. - * - * Note that at this time, libgit2 does not honor this setting and the - * fetch functionality current ignores submodules. - * - * @return 0 if fetchRecurseSubmodules is false, 1 if true - */ -GIT_EXTERN(int) git_submodule_fetch_recurse_submodules( - git_submodule *submodule); - -/** - * Set the fetchRecurseSubmodules rule for a submodule. - * - * This sets the submodule..fetchRecurseSubmodules value for - * the submodule. You should call `git_submodule_save()` if you want - * to persist the new value. - * - * @param submodule The submodule to modify - * @param fetch_recurse_submodules Boolean value - * @return old value for fetchRecurseSubmodules - */ -GIT_EXTERN(int) git_submodule_set_fetch_recurse_submodules( - git_submodule *submodule, - int fetch_recurse_submodules); - -/** - * Copy submodule info into ".git/config" file. - * - * Just like "git submodule init", this copies information about the - * submodule into ".git/config". You can use the accessor functions - * above to alter the in-memory git_submodule object and control what - * is written to the config, overriding what is in .gitmodules. - * - * @param submodule The submodule to write into the superproject config - * @param overwrite By default, existing entries will not be overwritten, - * but setting this to true forces them to be updated. - * @return 0 on success, <0 on failure. - */ -GIT_EXTERN(int) git_submodule_init(git_submodule *submodule, int overwrite); - -/** - * Copy submodule remote info into submodule repo. - * - * This copies the information about the submodules URL into the checked out - * submodule config, acting like "git submodule sync". This is useful if - * you have altered the URL for the submodule (or it has been altered by a - * fetch of upstream changes) and you need to update your local repo. - */ -GIT_EXTERN(int) git_submodule_sync(git_submodule *submodule); - -/** - * Open the repository for a submodule. - * - * This is a newly opened repository object. The caller is responsible for - * calling `git_repository_free()` on it when done. Multiple calls to this - * function will return distinct `git_repository` objects. This will only - * work if the submodule is checked out into the working directory. - * - * @param subrepo Pointer to the submodule repo which was opened - * @param submodule Submodule to be opened - * @return 0 on success, <0 if submodule repo could not be opened. - */ -GIT_EXTERN(int) git_submodule_open( - git_repository **repo, - git_submodule *submodule); - -/** - * Reread submodule info from config, index, and HEAD. - * - * Call this to reread cached submodule information for this submodule if - * you have reason to believe that it has changed. - */ -GIT_EXTERN(int) git_submodule_reload(git_submodule *submodule); - -/** - * Reread all submodule info. - * - * Call this to reload all cached submodule information for the repo. - */ -GIT_EXTERN(int) git_submodule_reload_all(git_repository *repo); - -/** - * Get the status for a submodule. - * - * This looks at a submodule and tries to determine the status. It - * will return a combination of the `GIT_SUBMODULE_STATUS` values above. - * How deeply it examines the working directory to do this will depend - * on the `git_submodule_ignore_t` value for the submodule - which can be - * set either temporarily or permanently with `git_submodule_set_ignore()`. - * - * @param status Combination of `GIT_SUBMODULE_STATUS` flags - * @param submodule Submodule for which to get status - * @return 0 on success, <0 on error - */ -GIT_EXTERN(int) git_submodule_status( - unsigned int *status, - git_submodule *submodule); - -/** - * Get the locations of submodule information. - * - * This is a bit like a very lightweight version of `git_submodule_status`. - * It just returns a made of the first four submodule status values (i.e. - * the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the - * submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). - * This can be useful if you want to know if the submodule is present in the - * working directory at this point in time, etc. - * - * @param status Combination of first four `GIT_SUBMODULE_STATUS` flags - * @param submodule Submodule for which to get status - * @return 0 on success, <0 on error - */ -GIT_EXTERN(int) git_submodule_location( - unsigned int *location_status, - git_submodule *submodule); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/tag.h b/git2/include/git2/tag.h deleted file mode 100644 index 1ffeb0b4a..000000000 --- a/git2/include/git2/tag.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_tag_h__ -#define INCLUDE_git_tag_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" -#include "strarray.h" - -/** - * @file git2/tag.h - * @brief Git tag parsing routines - * @defgroup git_tag Git tag management - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a tag object from the repository. - * - * @param out pointer to the looked up tag - * @param repo the repo to use when locating the tag. - * @param id identity of the tag to locate. - * @return 0 or an error code - */ -GIT_INLINE(int) git_tag_lookup( - git_tag **out, git_repository *repo, const git_oid *id) -{ - return git_object_lookup( - (git_object **)out, repo, id, (git_otype)GIT_OBJ_TAG); -} - -/** - * Lookup a tag object from the repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param out pointer to the looked up tag - * @param repo the repo to use when locating the tag. - * @param id identity of the tag to locate. - * @param len the length of the short identifier - * @return 0 or an error code - */ -GIT_INLINE(int) git_tag_lookup_prefix( - git_tag **out, git_repository *repo, const git_oid *id, size_t len) -{ - return git_object_lookup_prefix( - (git_object **)out, repo, id, len, (git_otype)GIT_OBJ_TAG); -} - -/** - * Close an open tag - * - * You can no longer use the git_tag pointer after this call. - * - * IMPORTANT: You MUST call this method when you are through with a tag to - * release memory. Failure to do so will cause a memory leak. - * - * @param tag the tag to close - */ - -GIT_INLINE(void) git_tag_free(git_tag *tag) -{ - git_object_free((git_object *)tag); -} - - -/** - * Get the id of a tag. - * - * @param tag a previously loaded tag. - * @return object identity for the tag. - */ -GIT_EXTERN(const git_oid *) git_tag_id(const git_tag *tag); - -/** - * Get the tagged object of a tag - * - * This method performs a repository lookup for the - * given object and returns it - * - * @param target_out pointer where to store the target - * @param tag a previously loaded tag. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_target(git_object **target_out, const git_tag *tag); - -/** - * Get the OID of the tagged object of a tag - * - * @param tag a previously loaded tag. - * @return pointer to the OID - */ -GIT_EXTERN(const git_oid *) git_tag_target_id(const git_tag *tag); - -/** - * Get the type of a tag's tagged object - * - * @param tag a previously loaded tag. - * @return type of the tagged object - */ -GIT_EXTERN(git_otype) git_tag_target_type(const git_tag *tag); - -/** - * Get the name of a tag - * - * @param tag a previously loaded tag. - * @return name of the tag - */ -GIT_EXTERN(const char *) git_tag_name(const git_tag *tag); - -/** - * Get the tagger (author) of a tag - * - * @param tag a previously loaded tag. - * @return reference to the tag's author - */ -GIT_EXTERN(const git_signature *) git_tag_tagger(const git_tag *tag); - -/** - * Get the message of a tag - * - * @param tag a previously loaded tag. - * @return message of the tag - */ -GIT_EXTERN(const char *) git_tag_message(const git_tag *tag); - - -/** - * Create a new tag in the repository from an object - * - * A new reference will also be created pointing to - * this tag object. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * The message will not be cleaned up. This can be achieved - * through `git_message_prettify()`. - * - * The tag name will be checked for validity. You must avoid - * the characters '~', '^', ':', '\\', '?', '[', and '*', and the - * sequences ".." and "@{" which have special meaning to revparse. - * - * @param oid Pointer where to store the OID of the - * newly created tag. If the tag already exists, this parameter - * will be the oid of the existing tag, and the function will - * return a GIT_EEXISTS error code. - * - * @param repo Repository where to store the tag - * - * @param tag_name Name for the tag; this name is validated - * for consistency. It should also not conflict with an - * already existing tag name - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param tagger Signature of the tagger for this tag, and - * of the tagging time - * - * @param message Full message for this tag - * - * @param force Overwrite existing references - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code - * A tag object is written to the ODB, and a proper reference - * is written in the /refs/tags folder, pointing to it - */ -GIT_EXTERN(int) git_tag_create( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - const git_signature *tagger, - const char *message, - int force); - -/** - * Create a new tag in the repository from a buffer - * - * @param oid Pointer where to store the OID of the newly created tag - * @param repo Repository where to store the tag - * @param buffer Raw tag data - * @param force Overwrite existing tags - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_tag_create_frombuffer( - git_oid *oid, - git_repository *repo, - const char *buffer, - int force); - -/** - * Create a new lightweight tag pointing at a target object - * - * A new direct reference will be created pointing to - * this target object. If `force` is true and a reference - * already exists with the given name, it'll be replaced. - * - * The tag name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param oid Pointer where to store the OID of the provided - * target object. If the tag already exists, this parameter - * will be filled with the oid of the existing pointed object - * and the function will return a GIT_EEXISTS error code. - * - * @param repo Repository where to store the lightweight tag - * - * @param tag_name Name for the tag; this name is validated - * for consistency. It should also not conflict with an - * already existing tag name - * - * @param target Object to which this tag points. This object - * must belong to the given `repo`. - * - * @param force Overwrite existing references - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code - * A proper reference is written in the /refs/tags folder, - * pointing to the provided target object - */ -GIT_EXTERN(int) git_tag_create_lightweight( - git_oid *oid, - git_repository *repo, - const char *tag_name, - const git_object *target, - int force); - -/** - * Delete an existing tag reference. - * - * The tag name will be checked for validity. - * See `git_tag_create()` for rules about valid names. - * - * @param repo Repository where lives the tag - * - * @param tag_name Name of the tag to be deleted; - * this name is validated for consistency. - * - * @return 0 on success, GIT_EINVALIDSPEC or an error code - */ -GIT_EXTERN(int) git_tag_delete( - git_repository *repo, - const char *tag_name); - -/** - * Fill a list with all the tags in the Repository - * - * The string array will be filled with the names of the - * matching tags; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param tag_names Pointer to a git_strarray structure where - * the tag names will be stored - * @param repo Repository where to find the tags - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_list( - git_strarray *tag_names, - git_repository *repo); - -/** - * Fill a list with all the tags in the Repository - * which name match a defined pattern - * - * If an empty pattern is provided, all the tags - * will be returned. - * - * The string array will be filled with the names of the - * matching tags; these values are owned by the user and - * should be free'd manually when no longer needed, using - * `git_strarray_free`. - * - * @param tag_names Pointer to a git_strarray structure where - * the tag names will be stored - * @param pattern Standard fnmatch pattern - * @param repo Repository where to find the tags - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_list_match( - git_strarray *tag_names, - const char *pattern, - git_repository *repo); - - -typedef int (*git_tag_foreach_cb)(const char *name, git_oid *oid, void *payload); - -/** - * Call callback `cb' for each tag in the repository - * - * @param repo Repository - * @param callback Callback function - * @param payload Pointer to callback data (optional) - */ -GIT_EXTERN(int) git_tag_foreach( - git_repository *repo, - git_tag_foreach_cb callback, - void *payload); - - -/** - * Recursively peel a tag until a non tag git_object is found - * - * The retrieved `tag_target` object is owned by the repository - * and should be closed with the `git_object_free` method. - * - * @param tag_target_out Pointer to the peeled git_object - * @param tag The tag to be processed - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tag_peel( - git_object **tag_target_out, - const git_tag *tag); - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/threads.h b/git2/include/git2/threads.h deleted file mode 100644 index 11f89729a..000000000 --- a/git2/include/git2/threads.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_threads_h__ -#define INCLUDE_git_threads_h__ - -#include "common.h" - -/** - * @file git2/threads.h - * @brief Library level thread functions - * @defgroup git_thread Threading functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Init the threading system. - * - * If libgit2 has been built with GIT_THREADS - * on, this function must be called once before - * any other library functions. - * - * If libgit2 has been built without GIT_THREADS - * support, this function is a no-op. - * - * @return 0 or an error code - */ -GIT_EXTERN(int) git_threads_init(void); - -/** - * Shutdown the threading system. - * - * If libgit2 has been built with GIT_THREADS - * on, this function must be called before shutting - * down the library. - * - * If libgit2 has been built without GIT_THREADS - * support, this function is a no-op. - */ -GIT_EXTERN(void) git_threads_shutdown(void); - -/** @} */ -GIT_END_DECL -#endif - diff --git a/git2/include/git2/transport.h b/git2/include/git2/transport.h deleted file mode 100644 index fba5fb920..000000000 --- a/git2/include/git2/transport.h +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_transport_h__ -#define INCLUDE_git_transport_h__ - -#include "indexer.h" -#include "net.h" -#include "types.h" - -/** - * @file git2/transport.h - * @brief Git transport interfaces and functions - * @defgroup git_transport interfaces and functions - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/* - *** Begin interface for credentials acquisition *** - */ - -typedef enum { - /* git_cred_userpass_plaintext */ - GIT_CREDTYPE_USERPASS_PLAINTEXT = 1, -} git_credtype_t; - -/* The base structure for all credential types */ -typedef struct git_cred { - git_credtype_t credtype; - void (*free)( - struct git_cred *cred); -} git_cred; - -/* A plaintext username and password */ -typedef struct git_cred_userpass_plaintext { - git_cred parent; - char *username; - char *password; -} git_cred_userpass_plaintext; - -/** - * Creates a new plain-text username and password credential object. - * - * @param out The newly created credential object. - * @param username The username of the credential. - * @param password The password of the credential. - */ -GIT_EXTERN(int) git_cred_userpass_plaintext_new( - git_cred **out, - const char *username, - const char *password); - -/** - * Signature of a function which acquires a credential object. - * - * @param cred The newly created credential object. - * @param url The resource for which we are demanding a credential. - * @param allowed_types A bitmask stating which cred types are OK to return. - */ -typedef int (*git_cred_acquire_cb)( - git_cred **cred, - const char *url, - unsigned int allowed_types, - void *payload); - -/* - *** End interface for credentials acquisition *** - *** Begin base transport interface *** - */ - -typedef enum { - GIT_TRANSPORTFLAGS_NONE = 0, - /* If the connection is secured with SSL/TLS, the authenticity - * of the server certificate should not be verified. */ - GIT_TRANSPORTFLAGS_NO_CHECK_CERT = 1 -} git_transport_flags_t; - -typedef void (*git_transport_message_cb)(const char *str, int len, void *data); - -typedef struct git_transport { - unsigned int version; - /* Set progress and error callbacks */ - int (*set_callbacks)(struct git_transport *transport, - git_transport_message_cb progress_cb, - git_transport_message_cb error_cb, - void *payload); - - /* Connect the transport to the remote repository, using the given - * direction. */ - int (*connect)(struct git_transport *transport, - const char *url, - git_cred_acquire_cb cred_acquire_cb, - void *cred_acquire_payload, - int direction, - int flags); - - /* This function may be called after a successful call to connect(). The - * provided callback is invoked for each ref discovered on the remote - * end. */ - int (*ls)(struct git_transport *transport, - git_headlist_cb list_cb, - void *payload); - - /* Executes the push whose context is in the git_push object. */ - int (*push)(struct git_transport *transport, git_push *push); - - /* This function may be called after a successful call to connect(), when - * the direction is FETCH. The function performs a negotiation to calculate - * the wants list for the fetch. */ - int (*negotiate_fetch)(struct git_transport *transport, - git_repository *repo, - const git_remote_head * const *refs, - size_t count); - - /* This function may be called after a successful call to negotiate_fetch(), - * when the direction is FETCH. This function retrieves the pack file for - * the fetch from the remote end. */ - int (*download_pack)(struct git_transport *transport, - git_repository *repo, - git_transfer_progress *stats, - git_transfer_progress_callback progress_cb, - void *progress_payload); - - /* Checks to see if the transport is connected */ - int (*is_connected)(struct git_transport *transport); - - /* Reads the flags value previously passed into connect() */ - int (*read_flags)(struct git_transport *transport, int *flags); - - /* Cancels any outstanding transport operation */ - void (*cancel)(struct git_transport *transport); - - /* This function is the reverse of connect() -- it terminates the - * connection to the remote end. */ - int (*close)(struct git_transport *transport); - - /* Frees/destructs the git_transport object. */ - void (*free)(struct git_transport *transport); -} git_transport; - -#define GIT_TRANSPORT_VERSION 1 -#define GIT_TRANSPORT_INIT {GIT_TRANSPORT_VERSION} - -/** - * Function to use to create a transport from a URL. The transport database - * is scanned to find a transport that implements the scheme of the URI (i.e. - * git:// or http://) and a transport object is returned to the caller. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param url The URL to connect to - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_new(git_transport **out, git_remote *owner, const char *url); - -/** - * Function which checks to see if a transport could be created for the - * given URL (i.e. checks to see if libgit2 has a transport that supports - * the given URL's scheme) - * - * @param url The URL to check - * @return Zero if the URL is not valid; nonzero otherwise - */ -GIT_EXTERN(int) git_transport_valid_url(const char *url); - -/* Signature of a function which creates a transport */ -typedef int (*git_transport_cb)(git_transport **out, git_remote *owner, void *param); - -/* Transports which come with libgit2 (match git_transport_cb). The expected - * value for "param" is listed in-line below. */ - -/** - * Create an instance of the dummy transport. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param payload You must pass NULL for this parameter. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_dummy( - git_transport **out, - git_remote *owner, - /* NULL */ void *payload); - -/** - * Create an instance of the local transport. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param payload You must pass NULL for this parameter. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_local( - git_transport **out, - git_remote *owner, - /* NULL */ void *payload); - -/** - * Create an instance of the smart transport. - * - * @param out The newly created transport (out) - * @param owner The git_remote which will own this transport - * @param payload A pointer to a git_smart_subtransport_definition - * @return 0 or an error code - */ -GIT_EXTERN(int) git_transport_smart( - git_transport **out, - git_remote *owner, - /* (git_smart_subtransport_definition *) */ void *payload); - -/* - *** End of base transport interface *** - *** Begin interface for subtransports for the smart transport *** - */ - -/* The smart transport knows how to speak the git protocol, but it has no - * knowledge of how to establish a connection between it and another endpoint, - * or how to move data back and forth. For this, a subtransport interface is - * declared, and the smart transport delegates this work to the subtransports. - * Three subtransports are implemented: git, http, and winhttp. (The http and - * winhttp transports each implement both http and https.) */ - -/* Subtransports can either be RPC = 0 (persistent connection) or RPC = 1 - * (request/response). The smart transport handles the differences in its own - * logic. The git subtransport is RPC = 0, while http and winhttp are both - * RPC = 1. */ - -/* Actions that the smart transport can ask - * a subtransport to perform */ -typedef enum { - GIT_SERVICE_UPLOADPACK_LS = 1, - GIT_SERVICE_UPLOADPACK = 2, - GIT_SERVICE_RECEIVEPACK_LS = 3, - GIT_SERVICE_RECEIVEPACK = 4, -} git_smart_service_t; - -struct git_smart_subtransport; - -/* A stream used by the smart transport to read and write data - * from a subtransport */ -typedef struct git_smart_subtransport_stream { - /* The owning subtransport */ - struct git_smart_subtransport *subtransport; - - int (*read)( - struct git_smart_subtransport_stream *stream, - char *buffer, - size_t buf_size, - size_t *bytes_read); - - int (*write)( - struct git_smart_subtransport_stream *stream, - const char *buffer, - size_t len); - - void (*free)( - struct git_smart_subtransport_stream *stream); -} git_smart_subtransport_stream; - -/* An implementation of a subtransport which carries data for the - * smart transport */ -typedef struct git_smart_subtransport { - int (* action)( - git_smart_subtransport_stream **out, - struct git_smart_subtransport *transport, - const char *url, - git_smart_service_t action); - - /* Subtransports are guaranteed a call to close() between - * calls to action(), except for the following two "natural" progressions - * of actions against a constant URL. - * - * 1. UPLOADPACK_LS -> UPLOADPACK - * 2. RECEIVEPACK_LS -> RECEIVEPACK */ - int (* close)(struct git_smart_subtransport *transport); - - void (* free)(struct git_smart_subtransport *transport); -} git_smart_subtransport; - -/* A function which creates a new subtransport for the smart transport */ -typedef int (*git_smart_subtransport_cb)( - git_smart_subtransport **out, - git_transport* owner); - -typedef struct git_smart_subtransport_definition { - /* The function to use to create the git_smart_subtransport */ - git_smart_subtransport_cb callback; - - /* True if the protocol is stateless; false otherwise. For example, - * http:// is stateless, but git:// is not. */ - unsigned rpc : 1; -} git_smart_subtransport_definition; - -/* Smart transport subtransports that come with libgit2 */ - -/** - * Create an instance of the http subtransport. This subtransport - * also supports https. On Win32, this subtransport may be implemented - * using the WinHTTP library. - * - * @param out The newly created subtransport - * @param owner The smart transport to own this subtransport - * @return 0 or an error code - */ -GIT_EXTERN(int) git_smart_subtransport_http( - git_smart_subtransport **out, - git_transport* owner); - -/** - * Create an instance of the git subtransport. - * - * @param out The newly created subtransport - * @param owner The smart transport to own this subtransport - * @return 0 or an error code - */ -GIT_EXTERN(int) git_smart_subtransport_git( - git_smart_subtransport **out, - git_transport* owner); - -/* - *** End interface for subtransports for the smart transport *** - */ - -/** @} */ -GIT_END_DECL -#endif diff --git a/git2/include/git2/tree.h b/git2/include/git2/tree.h deleted file mode 100644 index 7726a6599..000000000 --- a/git2/include/git2/tree.h +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_tree_h__ -#define INCLUDE_git_tree_h__ - -#include "common.h" -#include "types.h" -#include "oid.h" -#include "object.h" - -/** - * @file git2/tree.h - * @brief Git tree parsing, loading routines - * @defgroup git_tree Git tree parsing, loading routines - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Lookup a tree object from the repository. - * - * @param out Pointer to the looked up tree - * @param repo The repo to use when locating the tree. - * @param id Identity of the tree to locate. - * @return 0 or an error code - */ -GIT_INLINE(int) git_tree_lookup( - git_tree **out, git_repository *repo, const git_oid *id) -{ - return git_object_lookup((git_object **)out, repo, id, GIT_OBJ_TREE); -} - -/** - * Lookup a tree object from the repository, - * given a prefix of its identifier (short id). - * - * @see git_object_lookup_prefix - * - * @param tree pointer to the looked up tree - * @param repo the repo to use when locating the tree. - * @param id identity of the tree to locate. - * @param len the length of the short identifier - * @return 0 or an error code - */ -GIT_INLINE(int) git_tree_lookup_prefix( - git_tree **out, - git_repository *repo, - const git_oid *id, - size_t len) -{ - return git_object_lookup_prefix( - (git_object **)out, repo, id, len, GIT_OBJ_TREE); -} - -/** - * Close an open tree - * - * You can no longer use the git_tree pointer after this call. - * - * IMPORTANT: You MUST call this method when you stop using a tree to - * release memory. Failure to do so will cause a memory leak. - * - * @param tree The tree to close - */ -GIT_INLINE(void) git_tree_free(git_tree *tree) -{ - git_object_free((git_object *)tree); -} - -/** - * Get the id of a tree. - * - * @param tree a previously loaded tree. - * @return object identity for the tree. - */ -GIT_EXTERN(const git_oid *) git_tree_id(const git_tree *tree); - -/** - * Get the repository that contains the tree. - * - * @param tree A previously loaded tree. - * @return Repository that contains this tree. - */ -GIT_EXTERN(git_repository *) git_tree_owner(const git_tree *tree); - -/** - * Get the number of entries listed in a tree - * - * @param tree a previously loaded tree. - * @return the number of entries in the tree - */ -GIT_EXTERN(size_t) git_tree_entrycount(const git_tree *tree); - -/** - * Lookup a tree entry by its filename - * - * This returns a git_tree_entry that is owned by the git_tree. You don't - * have to free it, but you must not use it after the git_tree is released. - * - * @param tree a previously loaded tree. - * @param filename the filename of the desired entry - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byname( - git_tree *tree, const char *filename); - -/** - * Lookup a tree entry by its position in the tree - * - * This returns a git_tree_entry that is owned by the git_tree. You don't - * have to free it, but you must not use it after the git_tree is released. - * - * @param tree a previously loaded tree. - * @param idx the position in the entry list - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byindex( - git_tree *tree, size_t idx); - -/** - * Lookup a tree entry by SHA value. - * - * This returns a git_tree_entry that is owned by the git_tree. You don't - * have to free it, but you must not use it after the git_tree is released. - * - * Warning: this must examine every entry in the tree, so it is not fast. - * - * @param tree a previously loaded tree. - * @param oid the sha being looked for - * @return the tree entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_tree_entry_byoid( - const git_tree *tree, const git_oid *oid); - -/** - * Retrieve a tree entry contained in a tree or in any of its subtrees, - * given its relative path. - * - * Unlike the other lookup functions, the returned tree entry is owned by - * the user and must be freed explicitly with `git_tree_entry_free()`. - * - * @param out Pointer where to store the tree entry - * @param root Previously loaded tree which is the root of the relative path - * @param subtree_path Path to the contained entry - * @return 0 on success; GIT_ENOTFOUND if the path does not exist - */ -GIT_EXTERN(int) git_tree_entry_bypath( - git_tree_entry **out, - git_tree *root, - const char *path); - -/** - * Duplicate a tree entry - * - * Create a copy of a tree entry. The returned copy is owned by the user, - * and must be freed explicitly with `git_tree_entry_free()`. - * - * @param entry A tree entry to duplicate - * @return a copy of the original entry or NULL on error (alloc failure) - */ -GIT_EXTERN(git_tree_entry *) git_tree_entry_dup(const git_tree_entry *entry); - -/** - * Free a user-owned tree entry - * - * IMPORTANT: This function is only needed for tree entries owned by the - * user, such as the ones returned by `git_tree_entry_dup()` or - * `git_tree_entry_bypath()`. - * - * @param entry The entry to free - */ -GIT_EXTERN(void) git_tree_entry_free(git_tree_entry *entry); - -/** - * Get the filename of a tree entry - * - * @param entry a tree entry - * @return the name of the file - */ -GIT_EXTERN(const char *) git_tree_entry_name(const git_tree_entry *entry); - -/** - * Get the id of the object pointed by the entry - * - * @param entry a tree entry - * @return the oid of the object - */ -GIT_EXTERN(const git_oid *) git_tree_entry_id(const git_tree_entry *entry); - -/** - * Get the type of the object pointed by the entry - * - * @param entry a tree entry - * @return the type of the pointed object - */ -GIT_EXTERN(git_otype) git_tree_entry_type(const git_tree_entry *entry); - -/** - * Get the UNIX file attributes of a tree entry - * - * @param entry a tree entry - * @return filemode as an integer - */ -GIT_EXTERN(git_filemode_t) git_tree_entry_filemode(const git_tree_entry *entry); - -/** - * Convert a tree entry to the git_object it points too. - * - * You must call `git_object_free()` on the object when you are done with it. - * - * @param object pointer to the converted object - * @param repo repository where to lookup the pointed object - * @param entry a tree entry - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_entry_to_object( - git_object **object_out, - git_repository *repo, - const git_tree_entry *entry); - -/** - * Create a new tree builder. - * - * The tree builder can be used to create or modify trees in memory and - * write them as tree objects to the database. - * - * If the `source` parameter is not NULL, the tree builder will be - * initialized with the entries of the given tree. - * - * If the `source` parameter is NULL, the tree builder will start with no - * entries and will have to be filled manually. - * - * @param out Pointer where to store the tree builder - * @param source Source tree to initialize the builder (optional) - * @return 0 on success; error code otherwise - */ -GIT_EXTERN(int) git_treebuilder_create( - git_treebuilder **out, const git_tree *source); - -/** - * Clear all the entires in the builder - * - * @param bld Builder to clear - */ -GIT_EXTERN(void) git_treebuilder_clear(git_treebuilder *bld); - -/** - * Free a tree builder - * - * This will clear all the entries and free to builder. - * Failing to free the builder after you're done using it - * will result in a memory leak - * - * @param bld Builder to free - */ -GIT_EXTERN(void) git_treebuilder_free(git_treebuilder *bld); - -/** - * Get an entry from the builder from its filename - * - * The returned entry is owned by the builder and should - * not be freed manually. - * - * @param bld Tree builder - * @param filename Name of the entry - * @return pointer to the entry; NULL if not found - */ -GIT_EXTERN(const git_tree_entry *) git_treebuilder_get( - git_treebuilder *bld, const char *filename); - -/** - * Add or update an entry to the builder - * - * Insert a new entry for `filename` in the builder with the - * given attributes. - * - * If an entry named `filename` already exists, its attributes - * will be updated with the given ones. - * - * The optional pointer `out` can be used to retrieve a pointer to - * the newly created/updated entry. Pass NULL if you do not need it. - * - * No attempt is being made to ensure that the provided oid points - * to an existing git object in the object database, nor that the - * attributes make sense regarding the type of the pointed at object. - * - * @param out Pointer to store the entry (optional) - * @param bld Tree builder - * @param filename Filename of the entry - * @param id SHA1 oid of the entry - * @param filemode Folder attributes of the entry. This parameter must - * be valued with one of the following entries: 0040000, 0100644, - * 0100755, 0120000 or 0160000. - * @return 0 or an error code - */ -GIT_EXTERN(int) git_treebuilder_insert( - const git_tree_entry **out, - git_treebuilder *bld, - const char *filename, - const git_oid *id, - git_filemode_t filemode); - -/** - * Remove an entry from the builder by its filename - * - * @param bld Tree builder - * @param filename Filename of the entry to remove - */ -GIT_EXTERN(int) git_treebuilder_remove( - git_treebuilder *bld, const char *filename); - -typedef int (*git_treebuilder_filter_cb)( - const git_tree_entry *entry, void *payload); - -/** - * Filter the entries in the tree - * - * The `filter` callback will be called for each entry in the tree with a - * pointer to the entry and the provided `payload`; if the callback returns - * non-zero, the entry will be filtered (removed from the builder). - * - * @param bld Tree builder - * @param filter Callback to filter entries - * @param payload Extra data to pass to filter - */ -GIT_EXTERN(void) git_treebuilder_filter( - git_treebuilder *bld, - git_treebuilder_filter_cb filter, - void *payload); - -/** - * Write the contents of the tree builder as a tree object - * - * The tree builder will be written to the given `repo`, and its - * identifying SHA1 hash will be stored in the `id` pointer. - * - * @param id Pointer to store the OID of the newly written tree - * @param repo Repository in which to store the object - * @param bld Tree builder to write - * @return 0 or an error code - */ -GIT_EXTERN(int) git_treebuilder_write( - git_oid *id, git_repository *repo, git_treebuilder *bld); - - -/** Callback for the tree traversal method */ -typedef int (*git_treewalk_cb)( - const char *root, const git_tree_entry *entry, void *payload); - -/** Tree traversal modes */ -typedef enum { - GIT_TREEWALK_PRE = 0, /* Pre-order */ - GIT_TREEWALK_POST = 1, /* Post-order */ -} git_treewalk_mode; - -/** - * Traverse the entries in a tree and its subtrees in post or pre order. - * - * The entries will be traversed in the specified order, children subtrees - * will be automatically loaded as required, and the `callback` will be - * called once per entry with the current (relative) root for the entry and - * the entry data itself. - * - * If the callback returns a positive value, the passed entry will be - * skipped on the traversal (in pre mode). A negative value stops the walk. - * - * @param tree The tree to walk - * @param mode Traversal mode (pre or post-order) - * @param callback Function to call on each tree entry - * @param payload Opaque pointer to be passed on each callback - * @return 0 or an error code - */ -GIT_EXTERN(int) git_tree_walk( - const git_tree *tree, - git_treewalk_mode mode, - git_treewalk_cb callback, - void *payload); - -/** @} */ - -GIT_END_DECL -#endif diff --git a/git2/include/git2/types.h b/git2/include/git2/types.h deleted file mode 100644 index c16bb8872..000000000 --- a/git2/include/git2/types.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_types_h__ -#define INCLUDE_git_types_h__ - -#include "common.h" - -/** - * @file git2/types.h - * @brief libgit2 base & compatibility types - * @ingroup Git - * @{ - */ -GIT_BEGIN_DECL - -/** - * Cross-platform compatibility types for off_t / time_t - * - * NOTE: This needs to be in a public header so that both the library - * implementation and client applications both agree on the same types. - * Otherwise we get undefined behavior. - * - * Use the "best" types that each platform provides. Currently we truncate - * these intermediate representations for compatibility with the git ABI, but - * if and when it changes to support 64 bit types, our code will naturally - * adapt. - * NOTE: These types should match those that are returned by our internal - * stat() functions, for all platforms. - */ -#include -#ifdef __amigaos4__ -#include -#endif - -#if defined(_MSC_VER) - -typedef __int64 git_off_t; -typedef __time64_t git_time_t; - -#elif defined(__MINGW32__) - -typedef off64_t git_off_t; -typedef __time64_t git_time_t; - -#elif defined(__HAIKU__) - -typedef __haiku_std_int64 git_off_t; -typedef __haiku_std_int64 git_time_t; - -#else /* POSIX */ - -/* - * Note: Can't use off_t since if a client program includes - * before us (directly or indirectly), they'll get 32 bit off_t in their client - * app, even though /we/ define _FILE_OFFSET_BITS=64. - */ -typedef int64_t git_off_t; -typedef int64_t git_time_t; - -#endif - -/** Basic type (loose or packed) of any Git object. */ -typedef enum { - GIT_OBJ_ANY = -2, /**< Object can be any of the following */ - GIT_OBJ_BAD = -1, /**< Object is invalid. */ - GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */ - GIT_OBJ_COMMIT = 1, /**< A commit object. */ - GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */ - GIT_OBJ_BLOB = 3, /**< A file revision object. */ - GIT_OBJ_TAG = 4, /**< An annotated tag object. */ - GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */ - GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */ - GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */ -} git_otype; - -/** An open object database handle. */ -typedef struct git_odb git_odb; - -/** A custom backend in an ODB */ -typedef struct git_odb_backend git_odb_backend; - -/** An object read from the ODB */ -typedef struct git_odb_object git_odb_object; - -/** A stream to read/write from the ODB */ -typedef struct git_odb_stream git_odb_stream; - -/** A stream to write a packfile to the ODB */ -typedef struct git_odb_writepack git_odb_writepack; - -/** - * Representation of an existing git repository, - * including all its object contents - */ -typedef struct git_repository git_repository; - -/** Representation of a generic object in a repository */ -typedef struct git_object git_object; - -/** Representation of an in-progress walk through the commits in a repo */ -typedef struct git_revwalk git_revwalk; - -/** Parsed representation of a tag object. */ -typedef struct git_tag git_tag; - -/** In-memory representation of a blob object. */ -typedef struct git_blob git_blob; - -/** Parsed representation of a commit object. */ -typedef struct git_commit git_commit; - -/** Representation of each one of the entries in a tree object. */ -typedef struct git_tree_entry git_tree_entry; - -/** Representation of a tree object. */ -typedef struct git_tree git_tree; - -/** Constructor for in-memory trees */ -typedef struct git_treebuilder git_treebuilder; - -/** Memory representation of an index file. */ -typedef struct git_index git_index; - -/** Memory representation of a set of config files */ -typedef struct git_config git_config; - -/** Interface to access a configuration file */ -typedef struct git_config_backend git_config_backend; - -/** Representation of a reference log entry */ -typedef struct git_reflog_entry git_reflog_entry; - -/** Representation of a reference log */ -typedef struct git_reflog git_reflog; - -/** Representation of a git note */ -typedef struct git_note git_note; - -/** Representation of a git packbuilder */ -typedef struct git_packbuilder git_packbuilder; - -/** Time in a signature */ -typedef struct git_time { - git_time_t time; /** time in seconds from epoch */ - int offset; /** timezone offset, in minutes */ -} git_time; - -/** An action signature (e.g. for committers, taggers, etc) */ -typedef struct git_signature { - char *name; /** full name of the author */ - char *email; /** email of the author */ - git_time when; /** time when the action happened */ -} git_signature; - -/** In-memory representation of a reference. */ -typedef struct git_reference git_reference; - -/** Basic type of any Git reference. */ -typedef enum { - GIT_REF_INVALID = 0, /** Invalid reference */ - GIT_REF_OID = 1, /** A reference which points at an object id */ - GIT_REF_SYMBOLIC = 2, /** A reference which points at another reference */ - GIT_REF_PACKED = 4, - GIT_REF_HAS_PEEL = 8, - GIT_REF_LISTALL = GIT_REF_OID|GIT_REF_SYMBOLIC|GIT_REF_PACKED, -} git_ref_t; - -/** Basic type of any Git branch. */ -typedef enum { - GIT_BRANCH_LOCAL = 1, - GIT_BRANCH_REMOTE = 2, -} git_branch_t; - -/** Valid modes for index and tree entries. */ -typedef enum { - GIT_FILEMODE_NEW = 0000000, - GIT_FILEMODE_TREE = 0040000, - GIT_FILEMODE_BLOB = 0100644, - GIT_FILEMODE_BLOB_EXECUTABLE = 0100755, - GIT_FILEMODE_LINK = 0120000, - GIT_FILEMODE_COMMIT = 0160000, -} git_filemode_t; - -typedef struct git_refspec git_refspec; -typedef struct git_remote git_remote; -typedef struct git_push git_push; - -typedef struct git_remote_head git_remote_head; -typedef struct git_remote_callbacks git_remote_callbacks; - -/** @} */ -GIT_END_DECL - -#endif diff --git a/git2/include/git2/version.h b/git2/include/git2/version.h deleted file mode 100644 index bc03e85d6..000000000 --- a/git2/include/git2/version.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) the libgit2 contributors. All rights reserved. - * - * This file is part of libgit2, distributed under the GNU GPL v2 with - * a Linking Exception. For full terms see the included COPYING file. - */ -#ifndef INCLUDE_git_version_h__ -#define INCLUDE_git_version_h__ - -#define LIBGIT2_VERSION "0.17.0" -#define LIBGIT2_VER_MAJOR 0 -#define LIBGIT2_VER_MINOR 17 -#define LIBGIT2_VER_REVISION 0 - -#endif diff --git a/git2/libgit2.gypi b/git2/libgit2.gypi deleted file mode 100644 index 0494be661..000000000 --- a/git2/libgit2.gypi +++ /dev/null @@ -1,50 +0,0 @@ -{ - 'variables': { - 'includes_common': [ - 'git2/include/git2.h', - 'git2/include/git2/attr.h', - 'git2/include/git2/blob.h', - 'git2/include/git2/branch.h', - 'git2/include/git2/commit.h', - 'git2/include/git2/common.h', - 'git2/include/git2/config.h', - 'git2/include/git2/diff.h', - 'git2/include/git2/errors.h', - 'git2/include/git2/index.h', - 'git2/include/git2/indexer.h', - 'git2/include/git2/merge.h', - 'git2/include/git2/net.h', - 'git2/include/git2/notes.h', - 'git2/include/git2/object.h', - 'git2/include/git2/odb.h', - 'git2/include/git2/odb_backend.h', - 'git2/include/git2/oid.h', - 'git2/include/git2/reflog.h', - 'git2/include/git2/refs.h', - 'git2/include/git2/refspec.h', - 'git2/include/git2/remote.h', - 'git2/include/git2/repository.h', - 'git2/include/git2/revwalk.h', - 'git2/include/git2/signature.h', - 'git2/include/git2/status.h', - 'git2/include/git2/submodule.h', - 'git2/include/git2/tag.h', - 'git2/include/git2/threads.h', - 'git2/include/git2/tree.h', - 'git2/include/git2/types.h', - 'git2/include/git2/version.h', - 'git2/include/git2/checkout.h', - 'git2/include/git2/clone.h', - 'git2/include/git2/ignore.h', - 'git2/include/git2/message.h', - 'git2/include/git2/pack.h', - 'git2/include/git2/reset.h', - 'git2/include/git2/revparse.h', - 'git2/include/git2/strarray.h', - 'git2/include/git2/graph.h', - 'git2/include/git2/push.h', - 'git2/include/git2/stash.h', - 'git2/include/git2/transport.h', - ], - } -} diff --git a/native/atom_cef_render_process_handler.mm b/native/atom_cef_render_process_handler.mm index 428e9237f..fd0a60a58 100644 --- a/native/atom_cef_render_process_handler.mm +++ b/native/atom_cef_render_process_handler.mm @@ -1,7 +1,6 @@ #import #import "native/v8_extensions/atom.h" #import "native/v8_extensions/native.h" -#import "native/v8_extensions/git.h" #import "native/message_translation.h" #import "path_watcher.h" #import "atom_cef_render_process_handler.h" @@ -119,5 +118,4 @@ void AtomCefRenderProcessHandler::InjectExtensionsIntoV8Context(CefRefPtrCreateContextBinding(context); (new v8_extensions::Native())->CreateContextBinding(context); - (new v8_extensions::Git())->CreateContextBinding(context); } diff --git a/native/v8_extensions/git.h b/native/v8_extensions/git.h deleted file mode 100644 index 74876fe11..000000000 --- a/native/v8_extensions/git.h +++ /dev/null @@ -1,22 +0,0 @@ -#include "include/cef_base.h" -#include "include/cef_v8.h" - -namespace v8_extensions { - class Git : public CefV8Handler { - public: - Git(); - void CreateContextBinding(CefRefPtr context); - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE; - - // Provide the reference counting implementation for this class. - IMPLEMENT_REFCOUNTING(Git); - - private: - Git(Git const&); - void operator=(Git const&); - }; -} diff --git a/native/v8_extensions/git.mm b/native/v8_extensions/git.mm deleted file mode 100644 index 49aa98bf1..000000000 --- a/native/v8_extensions/git.mm +++ /dev/null @@ -1,493 +0,0 @@ -#import "git.h" -#import "include/git2.h" -#import - -namespace v8_extensions { - - class GitRepository : public CefBase { - private: - git_repository *repo; - - static int CollectStatus(const char *path, unsigned int status, void *payload) { - if ((status & GIT_STATUS_IGNORED) == 0) { - std::map *statuses = (std::map *) payload; - statuses->insert(std::pair(path, status)); - } - return 0; - } - - static int CollectDiffHunk(const git_diff_delta *delta, const git_diff_range *range, - const char *header, size_t header_len, void *payload) { - std::vector *ranges = (std::vector *) payload; - ranges->push_back(*range); - return 0; - } - - public: - GitRepository(const char *pathInRepo) { - if (git_repository_open_ext(&repo, pathInRepo, 0, NULL) != GIT_OK) { - repo = NULL; - } - } - - ~GitRepository() { - Destroy(); - } - - void Destroy() { - if (Exists()) { - git_repository_free(repo); - repo = NULL; - } - } - - BOOL Exists() { - return repo != NULL; - } - - CefRefPtr GetPath() { - return CefV8Value::CreateString(git_repository_path(repo)); - } - - CefRefPtr GetHead() { - git_reference *head; - if (git_repository_head(&head, repo) == GIT_OK) { - if (git_repository_head_detached(repo) == 1) { - const git_oid* sha = git_reference_target(head); - if (sha) { - char oid[GIT_OID_HEXSZ + 1]; - git_oid_tostr(oid, GIT_OID_HEXSZ + 1, sha); - git_reference_free(head); - return CefV8Value::CreateString(oid); - } - } - - CefRefPtr result = CefV8Value::CreateString(git_reference_name(head)); - git_reference_free(head); - return result; - } - - return CefV8Value::CreateNull(); - } - - CefRefPtr GetStatuses() { - std::map statuses; - git_status_foreach(repo, CollectStatus, &statuses); - std::map::iterator iter = statuses.begin(); - CefRefPtr v8Statuses = CefV8Value::CreateObject(NULL); - for (; iter != statuses.end(); ++iter) { - v8Statuses->SetValue(iter->first, CefV8Value::CreateInt(iter->second), V8_PROPERTY_ATTRIBUTE_NONE); - } - return v8Statuses; - } - - int GetCommitCount(const git_oid* fromCommit, const git_oid* toCommit) { - int count = 0; - git_revwalk *revWalk; - if (git_revwalk_new(&revWalk, repo) == GIT_OK) { - git_revwalk_push(revWalk, fromCommit); - git_revwalk_hide(revWalk, toCommit); - git_oid currentCommit; - while (git_revwalk_next(¤tCommit, revWalk) == GIT_OK) - count++; - git_revwalk_free(revWalk); - } - return count; - } - - void GetShortBranchName(const char** out, const char* branchName) { - *out = NULL; - if (branchName == NULL) - return; - int branchNameLength = strlen(branchName); - if (branchNameLength < 12) - return; - if (strncmp("refs/heads/", branchName, 11) != 0) - return; - - int shortNameLength = branchNameLength - 11; - char* shortName = (char*) malloc(sizeof(char) * (shortNameLength + 1)); - shortName[shortNameLength] = '\0'; - strncpy(shortName, &branchName[11], shortNameLength); - *out = shortName; - } - - void GetUpstreamBranch(const char** out, git_reference *branch) { - *out = NULL; - - const char* branchName = git_reference_name(branch); - const char* shortBranchName; - GetShortBranchName(&shortBranchName, branchName); - if (shortBranchName == NULL) - return; - - int shortBranchNameLength = strlen(shortBranchName); - char* remoteKey = (char*) malloc(sizeof(char) * (shortBranchNameLength + 15)); - sprintf(remoteKey, "branch.%s.remote", shortBranchName); - char* mergeKey = (char*) malloc(sizeof(char) * (shortBranchNameLength + 14)); - sprintf(mergeKey, "branch.%s.merge", shortBranchName); - free((char*)shortBranchName); - - git_config *config; - if (git_repository_config(&config, repo) != GIT_OK) { - free(remoteKey); - free(mergeKey); - return; - } - - const char *remote; - const char *merge; - if (git_config_get_string(&remote, config, remoteKey) == GIT_OK - && git_config_get_string(&merge, config, mergeKey) == GIT_OK) { - int remoteLength = strlen(remote); - if (remoteLength > 0) { - const char *shortMergeBranchName; - GetShortBranchName(&shortMergeBranchName, merge); - if (shortMergeBranchName != NULL) { - int updateBranchLength = remoteLength + strlen(shortMergeBranchName) + 14; - char* upstreamBranch = (char*) malloc(sizeof(char) * (updateBranchLength + 1)); - sprintf(upstreamBranch, "refs/remotes/%s/%s", remote, shortMergeBranchName); - *out = upstreamBranch; - } - free((char*)shortMergeBranchName); - } - } - - free(remoteKey); - free(mergeKey); - git_config_free(config); - } - - CefRefPtr GetAheadBehindCounts() { - CefRefPtr result = NULL; - git_reference *head; - if (git_repository_head(&head, repo) == GIT_OK) { - const char* upstreamBranchName; - GetUpstreamBranch(&upstreamBranchName, head); - if (upstreamBranchName != NULL) { - git_reference *upstream; - if (git_reference_lookup(&upstream, repo, upstreamBranchName) == GIT_OK) { - const git_oid* headSha = git_reference_target(head); - const git_oid* upstreamSha = git_reference_target(upstream); - git_oid mergeBase; - if (git_merge_base(&mergeBase, repo, headSha, upstreamSha) == GIT_OK) { - result = CefV8Value::CreateObject(NULL); - int ahead = GetCommitCount(headSha, &mergeBase); - result->SetValue("ahead", CefV8Value::CreateInt(ahead), V8_PROPERTY_ATTRIBUTE_NONE); - int behind = GetCommitCount(upstreamSha, &mergeBase); - result->SetValue("behind", CefV8Value::CreateInt(behind), V8_PROPERTY_ATTRIBUTE_NONE); - } - git_reference_free(upstream); - } - free((char*)upstreamBranchName); - } - git_reference_free(head); - } - - if (result != NULL) - return result; - else - return CefV8Value::CreateNull(); - } - - CefRefPtr IsIgnored(const char *path) { - int ignored; - if (git_ignore_path_is_ignored(&ignored, repo, path) == GIT_OK) { - return CefV8Value::CreateBool(ignored == 1); - } - else { - return CefV8Value::CreateBool(false); - } - } - - CefRefPtr GetStatus(const char *path) { - unsigned int status = 0; - if (git_status_file(&status, repo, path) == GIT_OK) { - return CefV8Value::CreateInt(status); - } - else { - return CefV8Value::CreateInt(0); - } - } - - CefRefPtr CheckoutHead(const char *path) { - char *copiedPath = (char *)malloc(sizeof(char) * (strlen(path) + 1)); - strcpy(copiedPath, path); - git_checkout_opts options = GIT_CHECKOUT_OPTS_INIT; - options.checkout_strategy = GIT_CHECKOUT_FORCE; - git_strarray paths; - paths.count = 1; - paths.strings = &copiedPath; - options.paths = paths; - - int result = git_checkout_head(repo, &options); - free(copiedPath); - return CefV8Value::CreateBool(result == GIT_OK); - } - - CefRefPtr GetDiffStats(const char *path) { - git_reference *head; - if (git_repository_head(&head, repo) != GIT_OK) { - return CefV8Value::CreateNull(); - } - - const git_oid* sha = git_reference_target(head); - git_commit *commit; - int commitStatus = git_commit_lookup(&commit, repo, sha); - git_reference_free(head); - if (commitStatus != GIT_OK) { - return CefV8Value::CreateNull(); - } - - git_tree *tree; - int treeStatus = git_commit_tree(&tree, commit); - git_commit_free(commit); - if (treeStatus != GIT_OK) { - return CefV8Value::CreateNull(); - } - - char *copiedPath = (char *)malloc(sizeof(char) * (strlen(path) + 1)); - strcpy(copiedPath, path); - git_diff_options options = GIT_DIFF_OPTIONS_INIT; - git_strarray paths; - paths.count = 1; - paths.strings = &copiedPath; - options.pathspec = paths; - options.context_lines = 1; - options.flags = GIT_DIFF_DISABLE_PATHSPEC_MATCH; - - git_diff_list *diffs; - int diffStatus = git_diff_tree_to_workdir(&diffs, repo, tree, &options); - git_tree_free(tree); - free(copiedPath); - if (diffStatus != GIT_OK || git_diff_num_deltas(diffs) != 1) { - return CefV8Value::CreateNull(); - } - - git_diff_patch *patch; - int patchStatus = git_diff_get_patch(&patch, NULL, diffs, 0); - git_diff_list_free(diffs); - if (patchStatus != GIT_OK) { - return CefV8Value::CreateNull(); - } - - int added = 0; - int deleted = 0; - int hunks = git_diff_patch_num_hunks(patch); - for (int i = 0; i < hunks; i++) { - int lines = git_diff_patch_num_lines_in_hunk(patch, i); - for (int j = 0; j < lines; j++) { - char lineType; - if (git_diff_patch_get_line_in_hunk(&lineType, NULL, NULL, NULL, NULL, patch, i, j) == GIT_OK) { - switch (lineType) { - case GIT_DIFF_LINE_ADDITION: - added++; - break; - case GIT_DIFF_LINE_DELETION: - deleted++; - break; - } - } - } - } - git_diff_patch_free(patch); - - CefRefPtr result = CefV8Value::CreateObject(NULL); - result->SetValue("added", CefV8Value::CreateInt(added), V8_PROPERTY_ATTRIBUTE_NONE); - result->SetValue("deleted", CefV8Value::CreateInt(deleted), V8_PROPERTY_ATTRIBUTE_NONE); - return result; - } - - CefRefPtr GetLineDiffs(const char *path, const char *text) { - git_reference *head; - if (git_repository_head(&head, repo) != GIT_OK) - return CefV8Value::CreateNull(); - - const git_oid* sha = git_reference_target(head); - git_commit *commit; - int commitStatus = git_commit_lookup(&commit, repo, sha); - git_reference_free(head); - if (commitStatus != GIT_OK) - return CefV8Value::CreateNull(); - - git_tree *tree; - int treeStatus = git_commit_tree(&tree, commit); - git_commit_free(commit); - if (treeStatus != GIT_OK) - return CefV8Value::CreateNull(); - - git_tree_entry* treeEntry; - git_tree_entry_bypath(&treeEntry, tree, path); - git_blob *blob = NULL; - if (treeEntry != NULL) { - const git_oid *blobSha = git_tree_entry_id(treeEntry); - if (blobSha == NULL || git_blob_lookup(&blob, repo, blobSha) != GIT_OK) - blob = NULL; - } - git_tree_free(tree); - if (blob == NULL) - return CefV8Value::CreateNull(); - - int size = strlen(text); - std::vector ranges; - git_diff_options options = GIT_DIFF_OPTIONS_INIT; - options.context_lines = 1; - if (git_diff_blob_to_buffer(blob, text, size, &options, NULL, CollectDiffHunk, NULL, &ranges) == GIT_OK) { - CefRefPtr v8Ranges = CefV8Value::CreateArray(ranges.size()); - for(int i = 0; i < ranges.size(); i++) { - CefRefPtr v8Range = CefV8Value::CreateObject(NULL); - v8Range->SetValue("oldStart", CefV8Value::CreateInt(ranges[i].old_start), V8_PROPERTY_ATTRIBUTE_NONE); - v8Range->SetValue("oldLines", CefV8Value::CreateInt(ranges[i].old_lines), V8_PROPERTY_ATTRIBUTE_NONE); - v8Range->SetValue("newStart", CefV8Value::CreateInt(ranges[i].new_start), V8_PROPERTY_ATTRIBUTE_NONE); - v8Range->SetValue("newLines", CefV8Value::CreateInt(ranges[i].new_lines), V8_PROPERTY_ATTRIBUTE_NONE); - v8Ranges->SetValue(i, v8Range); - } - git_blob_free(blob); - return v8Ranges; - } else { - git_blob_free(blob); - return CefV8Value::CreateNull(); - } - } - - CefRefPtr IsSubmodule(const char *path) { - BOOL isSubmodule = false; - git_index* index; - if (git_repository_index(&index, repo) == GIT_OK) { - const git_index_entry *entry = git_index_get_bypath(index, path, 0); - isSubmodule = entry != NULL && (entry->mode & S_IFMT) == GIT_FILEMODE_COMMIT; - git_index_free(index); - } - return CefV8Value::CreateBool(isSubmodule); - } - - void RefreshIndex() { - git_index* index; - if (git_repository_index(&index, repo) == GIT_OK) { - git_index_read(index); - git_index_free(index); - } - } - - IMPLEMENT_REFCOUNTING(GitRepository); - }; - - Git::Git() : CefV8Handler() { - git_threads_init(); - } - - void Git::CreateContextBinding(CefRefPtr context) { - const char* methodNames[] = { - "getRepository", "getHead", "getPath", "isIgnored", "getStatus", "checkoutHead", - "getDiffStats", "isSubmodule", "refreshIndex", "destroy", "getStatuses", - "getAheadBehindCounts", "getLineDiffs" - }; - - CefRefPtr nativeObject = CefV8Value::CreateObject(NULL); - int arrayLength = sizeof(methodNames) / sizeof(const char *); - for (int i = 0; i < arrayLength; i++) { - const char *functionName = methodNames[i]; - CefRefPtr function = CefV8Value::CreateFunction(functionName, this); - nativeObject->SetValue(functionName, function, V8_PROPERTY_ATTRIBUTE_NONE); - } - - CefRefPtr global = context->GetGlobal(); - global->SetValue("$git", nativeObject, V8_PROPERTY_ATTRIBUTE_NONE); - } - - bool Git::Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - @autoreleasepool { - if (name == "getRepository") { - GitRepository *repository = new GitRepository(arguments[0]->GetStringValue().ToString().c_str()); - if (repository->Exists()) { - CefRefPtr userData = repository; - retval = CefV8Value::CreateObject(NULL); - retval->SetUserData(userData); - } else { - retval = CefV8Value::CreateNull(); - } - return true; - } - - if (name == "getHead") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->GetHead(); - return true; - } - - if (name == "getPath") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->GetPath(); - return true; - } - - if (name == "isIgnored") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->IsIgnored(arguments[0]->GetStringValue().ToString().c_str()); - return true; - } - - if (name == "getStatus") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->GetStatus(arguments[0]->GetStringValue().ToString().c_str()); - return true; - } - - if (name == "checkoutHead") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->CheckoutHead(arguments[0]->GetStringValue().ToString().c_str()); - return true; - } - - if (name == "getDiffStats") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->GetDiffStats(arguments[0]->GetStringValue().ToString().c_str()); - return true; - } - - if (name == "isSubmodule") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->IsSubmodule(arguments[0]->GetStringValue().ToString().c_str()); - return true; - } - - if (name == "refreshIndex") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - userData->RefreshIndex(); - return true; - } - - if (name == "destroy") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - userData->Destroy(); - return true; - } - - if (name == "getStatuses") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->GetStatuses(); - return true; - } - - if (name == "getAheadBehindCounts") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - retval = userData->GetAheadBehindCounts(); - return true; - } - - if (name == "getLineDiffs") { - GitRepository *userData = (GitRepository *)object->GetUserData().get(); - std::string path = arguments[0]->GetStringValue().ToString(); - std::string text = arguments[1]->GetStringValue().ToString(); - retval = userData->GetLineDiffs(path.c_str(), text.c_str()); - return true; - } - - return false; - } - } -} diff --git a/package.json b/package.json index 11a5b12a4..5e8f9e82c 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "ctags": "0.1.0", "oniguruma": "0.4.0", "mkdirp": "0.3.5", - "git-utils": "0.1.0" + "git-utils": "0.2.0" }, "scripts": { diff --git a/src/app/git.coffee b/src/app/git.coffee index b9f469b1c..fe4b6a8a8 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -2,8 +2,8 @@ _ = require 'underscore' fs = require 'fs' Subscriber = require 'subscriber' EventEmitter = require 'event-emitter' -GitRepository = require 'git-repository' RepositoryStatusTask = require 'repository-status-task' +GitUtils = nodeRequire 'git-utils' module.exports = class Git @@ -31,9 +31,13 @@ class Git statusTask: null constructor: (path, options={}) -> + @repo = GitUtils.open(path) + unless @repo? + throw new Error("No Git repository found searching path: #{path}") + @statuses = {} @upstream = {ahead: 0, behind: 0} - @repo = GitRepository.open(path) + refreshOnWindowFocus = options.refreshOnWindowFocus ? true if refreshOnWindowFocus $ = require 'jquery' @@ -64,12 +68,11 @@ class Git @statusTask.off() @statusTask = null - @getRepo().destroy() @repo = null @unsubscribe() getWorkingDirectory: -> - @getPath()?.replace(/\/\.git\/?$/, '') + @getRepo().getWorkingDirectory() getHead: -> @getRepo().getHead() ? '' @@ -116,12 +119,7 @@ class Git path getShortHead: -> - head = @getHead() - return head.substring(11) if head.indexOf('refs/heads/') is 0 - return head.substring(10) if head.indexOf('refs/tags/') is 0 - return head.substring(13) if head.indexOf('refs/remotes/') is 0 - return head.substring(0, 7) if head.match(/[a-fA-F0-9]{40}/) - return head + @getRepo().getShortHead() checkoutHead: (path) -> headCheckedOut = @getRepo().checkoutHead(@relativize(path)) @@ -129,7 +127,7 @@ class Git headCheckedOut getDiffStats: (path) -> - @getRepo().getDiffStats(@relativize(path)) ? added: 0, deleted: 0 + _.clone(@getRepo().getDiffStats(@relativize(path))) isSubmodule: (path) -> @getRepo().isSubmodule(@relativize(path)) @@ -154,10 +152,7 @@ class Git directoryStatus getAheadBehindCounts: -> - @getRepo().getAheadBehindCounts() ? ahead: 0, behind: 0 - - getLineDiffs: (path, text) -> - @getRepo().getLineDiffs(@relativize(path), text) ? [] + @getRepo().getAheadBehindCount() _.extend Git.prototype, Subscriber _.extend Git.prototype, EventEmitter diff --git a/src/stdlib/git-repository.coffee b/src/stdlib/git-repository.coffee deleted file mode 100644 index 4a1291e8b..000000000 --- a/src/stdlib/git-repository.coffee +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = -class GitRepository - @open: (path) -> - unless repo = $git.getRepository(path) - throw new Error("No Git repository found searching path: #{path}") - repo.constructor = GitRepository - repo.__proto__ = GitRepository.prototype - repo - - getHead: $git.getHead - getPath: $git.getPath - getStatus: $git.getStatus - getStatuses: $git.getStatuses - isIgnored: $git.isIgnored - checkoutHead: $git.checkoutHead - getDiffStats: $git.getDiffStats - isSubmodule: $git.isSubmodule - refreshIndex: $git.refreshIndex - destroy: $git.destroy - getAheadBehindCounts: $git.getAheadBehindCounts - getLineDiffs: $git.getLineDiffs From 28f89672d0944cbe2ba14231b4725e1a2117083e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 14:37:57 -0800 Subject: [PATCH 037/281] Use status helpers from git-utils module --- src/app/git.coffee | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/app/git.coffee b/src/app/git.coffee index fe4b6a8a8..bf66d65bb 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -14,18 +14,6 @@ class Git catch e null - statusFlags: - index_new: 1 << 0 - index_modified: 1 << 1 - index_deleted: 1 << 2 - index_renamed: 1 << 3 - index_typechange: 1 << 4 - working_dir_new: 1 << 7 - working_dir_modified: 1 << 8 - working_dir_delete: 1 << 9 - working_dir_typechange: 1 << 10 - ignore: 1 << 14 - statuses: null upstream: null statusTask: null @@ -91,22 +79,14 @@ class Git isPathIgnored: (path) -> @getRepo().isIgnored(@relativize(path)) - isStatusModified: (status=0) -> - modifiedFlags = @statusFlags.working_dir_modified | - @statusFlags.working_dir_delete | - @statusFlags.working_dir_typechange | - @statusFlags.index_modified | - @statusFlags.index_deleted | - @statusFlags.index_typechange - (status & modifiedFlags) > 0 + isStatusModified: (status) -> + @getRepo().isStatusModified(status) isPathModified: (path) -> @isStatusModified(@getPathStatus(path)) - isStatusNew: (status=0) -> - newFlags = @statusFlags.working_dir_new | - @statusFlags.index_new - (status & newFlags) > 0 + isStatusNew: (status) -> + @getRepo().isStatusNew(status) isPathNew: (path) -> @isStatusNew(@getPathStatus(path)) From 7c41907a7d3a1892907c09ff9d9a58f3d013d767 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 14:55:17 -0800 Subject: [PATCH 038/281] Check if path exists before moving fs.move() no longer throws an exception if the target exists so check for it explicitly when the dialog is confirmed. --- src/packages/tree-view/lib/tree-view.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/packages/tree-view/lib/tree-view.coffee b/src/packages/tree-view/lib/tree-view.coffee index bf1df2b2e..fb3da5783 100644 --- a/src/packages/tree-view/lib/tree-view.coffee +++ b/src/packages/tree-view/lib/tree-view.coffee @@ -220,6 +220,14 @@ class TreeView extends ScrollView iconClass: 'move' onConfirm: (newPath) => newPath = project.resolve(newPath) + if oldPath is newPath + dialog.close() + return + + if fs.exists(newPath) + dialog.showError("Error: #{newPath} already exists. Try a different path.") + return + directoryPath = fs.directory(newPath) try fs.makeTree(directoryPath) unless fs.exists(directoryPath) From e6ec46d7f000312a9b9b7c221cb1818b8f0a1208 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 21:26:18 -0800 Subject: [PATCH 039/281] Upgrade to git-utils 0.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e8f9e82c..f7cff9a6f 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "ctags": "0.1.0", "oniguruma": "0.4.0", "mkdirp": "0.3.5", - "git-utils": "0.2.0" + "git-utils": "0.3.0" }, "scripts": { From 9bf7c9459dae4d2a9780396f5153cd1e492252fe Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sat, 9 Mar 2013 21:28:13 -0800 Subject: [PATCH 040/281] Upgrade to oniguruma 0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f7cff9a6f..acee00c34 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "dependencies": { "coffee-script": "1.5", "ctags": "0.1.0", - "oniguruma": "0.4.0", + "oniguruma": "0.5.0", "mkdirp": "0.3.5", "git-utils": "0.3.0" }, From 2212222c479703db5400b480c48e28b346727729 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 11:22:36 -0700 Subject: [PATCH 041/281] Use underscore node module --- benchmark/benchmark-helper.coffee | 3 +- benchmark/benchmark-suite.coffee | 2 +- package.json | 3 +- spec/app/buffer-spec.coffee | 2 +- spec/app/display-buffer-spec.coffee | 2 +- spec/app/editor-spec.coffee | 2 +- spec/app/event-emitter-spec.coffee | 4 +- spec/app/grammar-view-spec.coffee | 2 +- spec/app/pane-container-spec.coffee | 2 +- spec/app/project-spec.coffee | 2 +- spec/app/text-mate-grammar-spec.coffee | 2 +- spec/app/tokenized-buffer-spec.coffee | 2 +- spec/atom-reporter.coffee | 2 +- spec/spec-helper.coffee | 2 +- spec/stdlib/underscore-extensions-spec.coffee | 2 +- spec/time-reporter.coffee | 2 +- src/app/atom-package.coffee | 2 +- src/app/atom.coffee | 2 +- src/app/binding-set.coffee | 2 +- src/app/buffer-change-operation.coffee | 2 +- src/app/buffer-marker.coffee | 2 +- src/app/buffer.coffee | 2 +- src/app/config.coffee | 2 +- src/app/cursor-view.coffee | 2 +- src/app/cursor.coffee | 2 +- src/app/directory.coffee | 2 +- src/app/display-buffer-marker.coffee | 2 +- src/app/display-buffer.coffee | 2 +- src/app/edit-session.coffee | 2 +- src/app/editor.coffee | 2 +- src/app/event-emitter.coffee | 2 +- src/app/file.coffee | 2 +- src/app/git.coffee | 2 +- src/app/keymap.coffee | 2 +- src/app/language-mode.coffee | 2 +- src/app/pane-column.coffee | 2 +- src/app/pane-row.coffee | 2 +- src/app/pane.coffee | 2 +- src/app/project.coffee | 2 +- src/app/range.coffee | 2 +- src/app/repository-status-task.coffee | 2 +- src/app/root-view.coffee | 2 +- src/app/screen-line.coffee | 2 +- src/app/selection.coffee | 2 +- src/app/syntax.coffee | 2 +- src/app/text-mate-grammar.coffee | 2 +- src/app/text-mate-package.coffee | 2 +- src/app/text-mate-theme.coffee | 2 +- src/app/token.coffee | 2 +- src/app/tokenized-buffer.coffee | 2 +- src/app/undo-manager.coffee | 2 +- .../lib/bracket-matcher.coffee | 2 +- .../lib/command-logger-view.coffee | 2 +- .../lib/command-palette-view.coffee | 2 +- .../spec/command-palette-spec.coffee | 2 +- .../lib/command-panel-view.coffee | 2 +- .../lib/commands/composite-command.coffee | 2 +- .../command-panel/lib/preview-list.coffee | 2 +- .../spec/command-interpreter-spec.coffee | 2 +- .../spec/command-panel-spec.coffee | 2 +- .../editor-stats/lib/editor-stats-view.coffee | 2 +- .../spec/editor-stats-spec.coffee | 2 +- .../fuzzy-finder/lib/fuzzy-finder-view.coffee | 2 +- .../fuzzy-finder/lib/fuzzy-finder.coffee | 2 +- .../lib/load-paths-handler.coffee | 2 +- .../spec/fuzzy-finder-spec.coffee | 2 +- .../spec/markdown-preview-spec.coffee | 2 +- .../lib/package-generator-view.coffee | 2 +- .../snippets/lib/snippet-expansion.coffee | 2 +- src/packages/snippets/lib/snippet.coffee | 2 +- src/packages/snippets/lib/snippets.coffee | 2 +- .../snippets/spec/snippets-spec.coffee | 2 +- .../spell-check/lib/spell-check-view.coffee | 2 +- .../status-bar/lib/status-bar-view.coffee | 2 +- .../status-bar/spec/status-bar-spec.coffee | 2 +- src/packages/tabs/lib/tab-bar-view.coffee | 2 +- src/packages/tabs/spec/tabs-spec.coffee | 2 +- src/packages/tree-view/lib/tree-view.coffee | 2 +- .../tree-view/spec/tree-view-spec.coffee | 2 +- .../wrap-guide/lib/wrap-guide-view.coffee | 2 +- src/stdlib/cson.coffee | 2 +- src/stdlib/event.coffee | 2 +- src/stdlib/fs.coffee | 2 +- src/stdlib/jquery-extensions.coffee | 2 +- src/stdlib/path.coffee | 2 +- src/stdlib/space-pen-extensions.coffee | 2 +- src/stdlib/task.coffee | 2 +- src/stdlib/underscore-extensions.coffee | 2 +- vendor/underscore.js | 964 ------------------ 89 files changed, 89 insertions(+), 1055 deletions(-) delete mode 100644 vendor/underscore.js diff --git a/benchmark/benchmark-helper.coffee b/benchmark/benchmark-helper.coffee index dff4cee35..bfe5ba06e 100644 --- a/benchmark/benchmark-helper.coffee +++ b/benchmark/benchmark-helper.coffee @@ -1,6 +1,6 @@ nakedLoad 'jasmine-jquery' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' Keymap = require 'keymap' Point = require 'point' Config = require 'config' @@ -127,4 +127,3 @@ $.fn.textInput = (data) -> event = document.createEvent 'TextEvent' event.initTextEvent('textInput', true, true, window, data) this.each -> this.dispatchEvent(event) - diff --git a/benchmark/benchmark-suite.coffee b/benchmark/benchmark-suite.coffee index c0d142a6d..b2ff4bdfc 100644 --- a/benchmark/benchmark-suite.coffee +++ b/benchmark/benchmark-suite.coffee @@ -1,7 +1,7 @@ require 'benchmark-helper' fs = require 'fs' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' TokenizedBuffer = require 'tokenized-buffer' describe "editor.", -> diff --git a/package.json b/package.json index acee00c34..8dae9dcb0 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "ctags": "0.1.0", "oniguruma": "0.5.0", "mkdirp": "0.3.5", - "git-utils": "0.3.0" + "git-utils": "0.3.0", + "underscore": "1.3.3" }, "scripts": { diff --git a/spec/app/buffer-spec.coffee b/spec/app/buffer-spec.coffee index 84b58ddeb..77253422f 100644 --- a/spec/app/buffer-spec.coffee +++ b/spec/app/buffer-spec.coffee @@ -1,7 +1,7 @@ Project = require 'project' Buffer = require 'buffer' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe 'Buffer', -> [filePath, fileContents, buffer] = [] diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 2381d76e2..11b177235 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -1,6 +1,6 @@ DisplayBuffer = require 'display-buffer' Buffer = require 'buffer' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "DisplayBuffer", -> [editSession, displayBuffer, buffer, changeHandler, tabLength] = [] diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 04e6c9b57..da885955e 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -5,7 +5,7 @@ Range = require 'range' Project = require 'project' $ = require 'jquery' {$$} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' describe "Editor", -> diff --git a/spec/app/event-emitter-spec.coffee b/spec/app/event-emitter-spec.coffee index dd02fdaa3..a8ff230f7 100644 --- a/spec/app/event-emitter-spec.coffee +++ b/spec/app/event-emitter-spec.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' describe "EventEmitter mixin", -> @@ -167,5 +167,3 @@ describe "EventEmitter mixin", -> object.off 'foo' expect(object.subscriptionCount()).toBe 2 - - diff --git a/spec/app/grammar-view-spec.coffee b/spec/app/grammar-view-spec.coffee index 45157aab0..548a30d22 100644 --- a/spec/app/grammar-view-spec.coffee +++ b/spec/app/grammar-view-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' GrammarView = require 'grammar-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "GrammarView", -> [editor, textGrammar, jsGrammar] = [] diff --git a/spec/app/pane-container-spec.coffee b/spec/app/pane-container-spec.coffee index 56ea53336..05b76f09b 100644 --- a/spec/app/pane-container-spec.coffee +++ b/spec/app/pane-container-spec.coffee @@ -1,7 +1,7 @@ PaneContainer = require 'pane-container' Pane = require 'pane' {View, $$} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' describe "PaneContainer", -> diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index e12a4f093..278c00f5f 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -1,6 +1,6 @@ Project = require 'project' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' BufferedProcess = require 'buffered-process' describe "Project", -> diff --git a/spec/app/text-mate-grammar-spec.coffee b/spec/app/text-mate-grammar-spec.coffee index 07d06ca02..e727f0382 100644 --- a/spec/app/text-mate-grammar-spec.coffee +++ b/spec/app/text-mate-grammar-spec.coffee @@ -2,7 +2,7 @@ TextMateGrammar = require 'text-mate-grammar' TextMatePackage = require 'text-mate-package' plist = require 'plist' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "TextMateGrammar", -> grammar = null diff --git a/spec/app/tokenized-buffer-spec.coffee b/spec/app/tokenized-buffer-spec.coffee index 86bd50520..3fb102d75 100644 --- a/spec/app/tokenized-buffer-spec.coffee +++ b/spec/app/tokenized-buffer-spec.coffee @@ -2,7 +2,7 @@ TokenizedBuffer = require 'tokenized-buffer' LanguageMode = require 'language-mode' Buffer = require 'buffer' Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "TokenizedBuffer", -> [editSession, tokenizedBuffer, buffer, changeHandler] = [] diff --git a/spec/atom-reporter.coffee b/spec/atom-reporter.coffee index c02035cc8..f8b7714c5 100644 --- a/spec/atom-reporter.coffee +++ b/spec/atom-reporter.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' {View, $$} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class AtomReporter extends View diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 4632db296..5f19f9264 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -3,7 +3,7 @@ window.setUpEnvironment() nakedLoad 'jasmine-jquery' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' Keymap = require 'keymap' Config = require 'config' Point = require 'point' diff --git a/spec/stdlib/underscore-extensions-spec.coffee b/spec/stdlib/underscore-extensions-spec.coffee index 5ae310cde..eed055ced 100644 --- a/spec/stdlib/underscore-extensions-spec.coffee +++ b/spec/stdlib/underscore-extensions-spec.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "underscore extensions", -> describe "_.adviseBefore", -> diff --git a/spec/time-reporter.coffee b/spec/time-reporter.coffee index 7004072ef..1862103e5 100644 --- a/spec/time-reporter.coffee +++ b/spec/time-reporter.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class TimeReporter extends jasmine.Reporter diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index 4c3195b0e..8bd99562e 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -1,6 +1,6 @@ Package = require 'package' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' module.exports = diff --git a/src/app/atom.coffee b/src/app/atom.coffee index 2e4635c18..eb00a399a 100644 --- a/src/app/atom.coffee +++ b/src/app/atom.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' Package = require 'package' TextMatePackage = require 'text-mate-package' Theme = require 'theme' diff --git a/src/app/binding-set.coffee b/src/app/binding-set.coffee index 168de6bbe..318e91c36 100644 --- a/src/app/binding-set.coffee +++ b/src/app/binding-set.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' Specificity = require 'specificity' diff --git a/src/app/buffer-change-operation.coffee b/src/app/buffer-change-operation.coffee index cbbf68b0a..c70180914 100644 --- a/src/app/buffer-change-operation.coffee +++ b/src/app/buffer-change-operation.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class BufferChangeOperation diff --git a/src/app/buffer-marker.coffee b/src/app/buffer-marker.coffee index 199171595..d315120c1 100644 --- a/src/app/buffer-marker.coffee +++ b/src/app/buffer-marker.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' Point = require 'point' Range = require 'range' EventEmitter = require 'event-emitter' diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index 00d0483e4..9c16f3eb8 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' File = require 'file' Point = require 'point' diff --git a/src/app/config.coffee b/src/app/config.coffee index 2940b33f4..d01180a3f 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' configDirPath = fs.absolute("~/.atom") diff --git a/src/app/cursor-view.coffee b/src/app/cursor-view.coffee index 03fae93de..755229a0a 100644 --- a/src/app/cursor-view.coffee +++ b/src/app/cursor-view.coffee @@ -1,7 +1,7 @@ {View} = require 'space-pen' Point = require 'point' Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CursorView extends View diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index 5708d4bf7..22d492f01 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -1,7 +1,7 @@ Point = require 'point' Range = require 'range' EventEmitter = require 'event-emitter' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Cursor diff --git a/src/app/directory.coffee b/src/app/directory.coffee index 808e839e7..f2daa21f3 100644 --- a/src/app/directory.coffee +++ b/src/app/directory.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' File = require 'file' EventEmitter = require 'event-emitter' diff --git a/src/app/display-buffer-marker.coffee b/src/app/display-buffer-marker.coffee index c8ed1648a..c8cf38c16 100644 --- a/src/app/display-buffer-marker.coffee +++ b/src/app/display-buffer-marker.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' module.exports = diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 0f24a235d..9b9d307f7 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' TokenizedBuffer = require 'tokenized-buffer' LineMap = require 'line-map' Point = require 'point' diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 0104a297f..1a158dad7 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -7,7 +7,7 @@ Selection = require 'selection' EventEmitter = require 'event-emitter' Subscriber = require 'subscriber' Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' module.exports = diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 1e2c0b464..a8c2992f5 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -8,7 +8,7 @@ CursorView = require 'cursor-view' SelectionView = require 'selection-view' fs = require 'fs' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Editor extends View diff --git a/src/app/event-emitter.coffee b/src/app/event-emitter.coffee index 3abcb74ac..bdcce5529 100644 --- a/src/app/event-emitter.coffee +++ b/src/app/event-emitter.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = on: (eventName, handler) -> diff --git a/src/app/file.coffee b/src/app/file.coffee index 9edde198f..7f203af71 100644 --- a/src/app/file.coffee +++ b/src/app/file.coffee @@ -1,7 +1,7 @@ EventEmitter = require 'event-emitter' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class File diff --git a/src/app/git.coffee b/src/app/git.coffee index bf66d65bb..f824406e8 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' Subscriber = require 'subscriber' EventEmitter = require 'event-emitter' diff --git a/src/app/keymap.coffee b/src/app/keymap.coffee index 695e733d1..b3d45872d 100644 --- a/src/app/keymap.coffee +++ b/src/app/keymap.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' BindingSet = require 'binding-set' diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 80fcc301d..d88f78bd7 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' require 'underscore-extensions' {OnigRegExp} = nodeRequire 'oniguruma' diff --git a/src/app/pane-column.coffee b/src/app/pane-column.coffee index 43ba40cbb..d603837e8 100644 --- a/src/app/pane-column.coffee +++ b/src/app/pane-column.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' PaneAxis = require 'pane-axis' module.exports = diff --git a/src/app/pane-row.coffee b/src/app/pane-row.coffee index ce7a09f82..76b49a7d6 100644 --- a/src/app/pane-row.coffee +++ b/src/app/pane-row.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' PaneAxis = require 'pane-axis' module.exports = diff --git a/src/app/pane.coffee b/src/app/pane.coffee index ef29ce72f..414507b2b 100644 --- a/src/app/pane.coffee +++ b/src/app/pane.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' PaneRow = require 'pane-row' PaneColumn = require 'pane-column' diff --git a/src/app/project.coffee b/src/app/project.coffee index 45dbdb104..766f25952 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' Range = require 'range' Buffer = require 'buffer' diff --git a/src/app/range.coffee b/src/app/range.coffee index a3870ea66..e5a2bf39a 100644 --- a/src/app/range.coffee +++ b/src/app/range.coffee @@ -1,5 +1,5 @@ Point = require 'point' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Range diff --git a/src/app/repository-status-task.coffee b/src/app/repository-status-task.coffee index 0e5f746a5..020654d0d 100644 --- a/src/app/repository-status-task.coffee +++ b/src/app/repository-status-task.coffee @@ -1,5 +1,5 @@ Task = require 'task' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class RepositoryStatusTask extends Task diff --git a/src/app/root-view.coffee b/src/app/root-view.coffee index 2d3b8fa83..0ab323fae 100644 --- a/src/app/root-view.coffee +++ b/src/app/root-view.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' {$$} = require 'space-pen' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' {View} = require 'space-pen' Buffer = require 'buffer' diff --git a/src/app/screen-line.coffee b/src/app/screen-line.coffee index 739d23eff..5574542c3 100644 --- a/src/app/screen-line.coffee +++ b/src/app/screen-line.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class ScreenLine diff --git a/src/app/selection.coffee b/src/app/selection.coffee index 9377498a2..e5e3a115a 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -1,6 +1,6 @@ Range = require 'range' EventEmitter = require 'event-emitter' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Selection diff --git a/src/app/syntax.coffee b/src/app/syntax.coffee index 9c176fefe..f6ef7ccca 100644 --- a/src/app/syntax.coffee +++ b/src/app/syntax.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' jQuery = require 'jquery' Specificity = require 'specificity' {$$} = require 'space-pen' diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index 9a9a78178..712b3e2ad 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' plist = require 'plist' Token = require 'token' diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index c4901cc02..2c430de99 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -1,7 +1,7 @@ Package = require 'package' fs = require 'fs' plist = require 'plist' -_ = require 'underscore' +_ = nodeRequire 'underscore' TextMateGrammar = require 'text-mate-grammar' module.exports = diff --git a/src/app/text-mate-theme.coffee b/src/app/text-mate-theme.coffee index f2c1d1f92..0d56b6e93 100644 --- a/src/app/text-mate-theme.coffee +++ b/src/app/text-mate-theme.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' plist = require 'plist' Theme = require 'theme' diff --git a/src/app/token.coffee b/src/app/token.coffee index 9c3d50ed8..20d1b5efa 100644 --- a/src/app/token.coffee +++ b/src/app/token.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Token diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 70e982e28..0ef4ea2c0 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' ScreenLine = require 'screen-line' EventEmitter = require 'event-emitter' Token = require 'token' diff --git a/src/app/undo-manager.coffee b/src/app/undo-manager.coffee index fc5b73e00..3f4025740 100644 --- a/src/app/undo-manager.coffee +++ b/src/app/undo-manager.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = diff --git a/src/packages/bracket-matcher/lib/bracket-matcher.coffee b/src/packages/bracket-matcher/lib/bracket-matcher.coffee index 52ad5aa50..44dc1998b 100644 --- a/src/packages/bracket-matcher/lib/bracket-matcher.coffee +++ b/src/packages/bracket-matcher/lib/bracket-matcher.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' {$$} = require 'space-pen' Range = require 'range' diff --git a/src/packages/command-logger/lib/command-logger-view.coffee b/src/packages/command-logger/lib/command-logger-view.coffee index 584c01d5a..510f8f2f9 100644 --- a/src/packages/command-logger/lib/command-logger-view.coffee +++ b/src/packages/command-logger/lib/command-logger-view.coffee @@ -1,6 +1,6 @@ {$$$} = require 'space-pen' ScrollView = require 'scroll-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CommandLoggerView extends ScrollView diff --git a/src/packages/command-palette/lib/command-palette-view.coffee b/src/packages/command-palette/lib/command-palette-view.coffee index 2acb80753..717118041 100644 --- a/src/packages/command-palette/lib/command-palette-view.coffee +++ b/src/packages/command-palette/lib/command-palette-view.coffee @@ -1,7 +1,7 @@ {$$} = require 'space-pen' SelectList = require 'select-list' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CommandPaletteView extends SelectList diff --git a/src/packages/command-palette/spec/command-palette-spec.coffee b/src/packages/command-palette/spec/command-palette-spec.coffee index 414c53996..780ad33b3 100644 --- a/src/packages/command-palette/spec/command-palette-spec.coffee +++ b/src/packages/command-palette/spec/command-palette-spec.coffee @@ -1,7 +1,7 @@ RootView = require 'root-view' CommandPalette = require 'command-palette/lib/command-palette-view' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "CommandPalette", -> [palette] = [] diff --git a/src/packages/command-panel/lib/command-panel-view.coffee b/src/packages/command-panel/lib/command-panel-view.coffee index 2430c7ae0..72c2b95e6 100644 --- a/src/packages/command-panel/lib/command-panel-view.coffee +++ b/src/packages/command-panel/lib/command-panel-view.coffee @@ -5,7 +5,7 @@ CompositeCommand = require './commands/composite-command' PreviewList = require './preview-list' Editor = require 'editor' {SyntaxError} = require('pegjs').parser -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CommandPanelView extends View diff --git a/src/packages/command-panel/lib/commands/composite-command.coffee b/src/packages/command-panel/lib/commands/composite-command.coffee index cc5485b4a..7c6648bce 100644 --- a/src/packages/command-panel/lib/commands/composite-command.coffee +++ b/src/packages/command-panel/lib/commands/composite-command.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' module.exports = diff --git a/src/packages/command-panel/lib/preview-list.coffee b/src/packages/command-panel/lib/preview-list.coffee index 5430d7ae9..6d7629128 100644 --- a/src/packages/command-panel/lib/preview-list.coffee +++ b/src/packages/command-panel/lib/preview-list.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' ScrollView = require 'scroll-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' PathView = require './path-view' OperationView = require './operation-view' diff --git a/src/packages/command-panel/spec/command-interpreter-spec.coffee b/src/packages/command-panel/spec/command-interpreter-spec.coffee index c4602b59f..9d6b0c1c1 100644 --- a/src/packages/command-panel/spec/command-interpreter-spec.coffee +++ b/src/packages/command-panel/spec/command-interpreter-spec.coffee @@ -3,7 +3,7 @@ Project = require 'project' Buffer = require 'buffer' EditSession = require 'edit-session' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "CommandInterpreter", -> [interpreter, editSession, buffer] = [] diff --git a/src/packages/command-panel/spec/command-panel-spec.coffee b/src/packages/command-panel/spec/command-panel-spec.coffee index 213d14191..d5f087c1a 100644 --- a/src/packages/command-panel/spec/command-panel-spec.coffee +++ b/src/packages/command-panel/spec/command-panel-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' CommandPanelView = require 'command-panel/lib/command-panel-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "CommandPanel", -> [editSession, buffer, commandPanel] = [] diff --git a/src/packages/editor-stats/lib/editor-stats-view.coffee b/src/packages/editor-stats/lib/editor-stats-view.coffee index c86ab18d8..850364c36 100644 --- a/src/packages/editor-stats/lib/editor-stats-view.coffee +++ b/src/packages/editor-stats/lib/editor-stats-view.coffee @@ -1,6 +1,6 @@ ScrollView = require 'scroll-view' d3 = require 'd3.v3' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' module.exports = diff --git a/src/packages/editor-stats/spec/editor-stats-spec.coffee b/src/packages/editor-stats/spec/editor-stats-spec.coffee index 5d8708e42..d8f372365 100644 --- a/src/packages/editor-stats/spec/editor-stats-spec.coffee +++ b/src/packages/editor-stats/spec/editor-stats-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' RootView = require 'root-view' EditorStats = require 'editor-stats/lib/editor-stats-view' diff --git a/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee b/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee index d12f6f29a..013d4b344 100644 --- a/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee +++ b/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee @@ -1,6 +1,6 @@ {View, $$} = require 'space-pen' SelectList = require 'select-list' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' fs = require 'fs' LoadPathsTask = require './load-paths-task' diff --git a/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee b/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee index c6fbe92aa..e3fcf839c 100644 --- a/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee +++ b/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = projectPaths: null diff --git a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee index 9ef442c99..783b93d35 100644 --- a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee +++ b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = loadPaths: (rootPath, ignoredNames, excludeGitIgnoredPaths) -> diff --git a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee index ffaae8cb0..0f9b04e64 100644 --- a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee +++ b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee @@ -1,7 +1,7 @@ RootView = require 'root-view' FuzzyFinder = require 'fuzzy-finder/lib/fuzzy-finder-view' LoadPathsTask = require 'fuzzy-finder/lib/load-paths-task' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' {$$} = require 'space-pen' fs = require 'fs' diff --git a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee index 7704768ee..4941e36d6 100644 --- a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee +++ b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' RootView = require 'root-view' MarkdownPreview = require 'markdown-preview/lib/markdown-preview-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "MarkdownPreview", -> beforeEach -> diff --git a/src/packages/package-generator/lib/package-generator-view.coffee b/src/packages/package-generator/lib/package-generator-view.coffee index d1ca900cc..95d17b2e6 100644 --- a/src/packages/package-generator/lib/package-generator-view.coffee +++ b/src/packages/package-generator/lib/package-generator-view.coffee @@ -1,7 +1,7 @@ {View} = require 'space-pen' Editor = require 'editor' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' module.exports = diff --git a/src/packages/snippets/lib/snippet-expansion.coffee b/src/packages/snippets/lib/snippet-expansion.coffee index 7c27222b8..7d0ffdc76 100644 --- a/src/packages/snippets/lib/snippet-expansion.coffee +++ b/src/packages/snippets/lib/snippet-expansion.coffee @@ -1,5 +1,5 @@ Subscriber = require 'subscriber' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class SnippetExpansion diff --git a/src/packages/snippets/lib/snippet.coffee b/src/packages/snippets/lib/snippet.coffee index 6e0069862..6d484fef6 100644 --- a/src/packages/snippets/lib/snippet.coffee +++ b/src/packages/snippets/lib/snippet.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' Range = require 'range' module.exports = diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index cd8e279d9..74e02cae9 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -1,6 +1,6 @@ AtomPackage = require 'atom-package' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' SnippetExpansion = require './snippet-expansion' Snippet = require './snippet' LoadSnippetsTask = require './load-snippets-task' diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index b77b2d80b..b7150791c 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -3,7 +3,7 @@ LoadSnippetsTask = require 'snippets/lib/load-snippets-task' RootView = require 'root-view' Buffer = require 'buffer' Editor = require 'editor' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' Package = require 'package' diff --git a/src/packages/spell-check/lib/spell-check-view.coffee b/src/packages/spell-check/lib/spell-check-view.coffee index 323d0e873..37ad954ec 100644 --- a/src/packages/spell-check/lib/spell-check-view.coffee +++ b/src/packages/spell-check/lib/spell-check-view.coffee @@ -1,5 +1,5 @@ {View} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' SpellCheckTask = require './spell-check-task' MisspellingView = require './misspelling-view' diff --git a/src/packages/status-bar/lib/status-bar-view.coffee b/src/packages/status-bar/lib/status-bar-view.coffee index f58d4dba0..a3d6723c0 100644 --- a/src/packages/status-bar/lib/status-bar-view.coffee +++ b/src/packages/status-bar/lib/status-bar-view.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' {View, $$} = require 'space-pen' $ = require 'jquery' diff --git a/src/packages/status-bar/spec/status-bar-spec.coffee b/src/packages/status-bar/spec/status-bar-spec.coffee index f7a88cf4d..5d45a5097 100644 --- a/src/packages/status-bar/spec/status-bar-spec.coffee +++ b/src/packages/status-bar/spec/status-bar-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' RootView = require 'root-view' StatusBar = require 'status-bar/lib/status-bar-view' fs = require 'fs' diff --git a/src/packages/tabs/lib/tab-bar-view.coffee b/src/packages/tabs/lib/tab-bar-view.coffee index fbbab1330..37e830071 100644 --- a/src/packages/tabs/lib/tab-bar-view.coffee +++ b/src/packages/tabs/lib/tab-bar-view.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' SortableList = require 'sortable-list' TabView = require './tab-view' diff --git a/src/packages/tabs/spec/tabs-spec.coffee b/src/packages/tabs/spec/tabs-spec.coffee index d8d32e390..41c012c2e 100644 --- a/src/packages/tabs/spec/tabs-spec.coffee +++ b/src/packages/tabs/spec/tabs-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' RootView = require 'root-view' Pane = require 'pane' PaneContainer = require 'pane-container' diff --git a/src/packages/tree-view/lib/tree-view.coffee b/src/packages/tree-view/lib/tree-view.coffee index fb3da5783..ae125b04c 100644 --- a/src/packages/tree-view/lib/tree-view.coffee +++ b/src/packages/tree-view/lib/tree-view.coffee @@ -6,7 +6,7 @@ FileView = require './file-view' Dialog = require './dialog' fs = require 'fs' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class TreeView extends ScrollView diff --git a/src/packages/tree-view/spec/tree-view-spec.coffee b/src/packages/tree-view/spec/tree-view-spec.coffee index fc2f9fe81..75b0ab070 100644 --- a/src/packages/tree-view/spec/tree-view-spec.coffee +++ b/src/packages/tree-view/spec/tree-view-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' TreeView = require 'tree-view/lib/tree-view' RootView = require 'root-view' Directory = require 'directory' diff --git a/src/packages/wrap-guide/lib/wrap-guide-view.coffee b/src/packages/wrap-guide/lib/wrap-guide-view.coffee index 491e19705..f3f79e978 100644 --- a/src/packages/wrap-guide/lib/wrap-guide-view.coffee +++ b/src/packages/wrap-guide/lib/wrap-guide-view.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class WrapGuideView extends View diff --git a/src/stdlib/cson.coffee b/src/stdlib/cson.coffee index 382d8600a..30402be5a 100644 --- a/src/stdlib/cson.coffee +++ b/src/stdlib/cson.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = stringifyIndent: (level=0) -> _.multiplyString(' ', Math.max(level, 0)) diff --git a/src/stdlib/event.coffee b/src/stdlib/event.coffee index adf761d97..902eba4e9 100644 --- a/src/stdlib/event.coffee +++ b/src/stdlib/event.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Event diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index e5c361e32..542ab016c 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -1,7 +1,7 @@ # commonjs fs module # http://ringojs.org/api/v0.8/fs/ -_ = require 'underscore' +_ = nodeRequire 'underscore' nodeFs = nodeRequire 'fs' mkdirp = nodeRequire 'mkdirp' diff --git a/src/stdlib/jquery-extensions.coffee b/src/stdlib/jquery-extensions.coffee index 089363577..592d01b03 100644 --- a/src/stdlib/jquery-extensions.coffee +++ b/src/stdlib/jquery-extensions.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' $.fn.scrollBottom = (newValue) -> if newValue? diff --git a/src/stdlib/path.coffee b/src/stdlib/path.coffee index 337b60d6b..2d1d5c41d 100644 --- a/src/stdlib/path.coffee +++ b/src/stdlib/path.coffee @@ -1,7 +1,7 @@ # node.js path module # http://nodejs.org/docs/v0.6.0/api/path.html -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = # Return the last portion of a path. Similar to the Unix basename command. diff --git a/src/stdlib/space-pen-extensions.coffee b/src/stdlib/space-pen-extensions.coffee index 37443ab03..819b4f15e 100644 --- a/src/stdlib/space-pen-extensions.coffee +++ b/src/stdlib/space-pen-extensions.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' {View} = require 'space-pen' jQuery = require 'jquery' ConfigObserver = require 'config-observer' diff --git a/src/stdlib/task.coffee b/src/stdlib/task.coffee index eb3e2f3f5..4e2873a0d 100644 --- a/src/stdlib/task.coffee +++ b/src/stdlib/task.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' module.exports = diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index df5865b24..7aecba5b8 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' _.mixin remove: (array, element) -> diff --git a/vendor/underscore.js b/vendor/underscore.js deleted file mode 100644 index 60cf14611..000000000 --- a/vendor/underscore.js +++ /dev/null @@ -1,964 +0,0 @@ -// Underscore.js 1.2.2 -// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore - -(function() { - - // Baseline setup - // -------------- - - // Establish the root object, `window` in the browser, or `global` on the server. - var root = this; - - // Save the previous value of the `_` variable. - var previousUnderscore = root._; - - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; - - // Create quick reference variables for speed access to core prototypes. - var slice = ArrayProto.slice, - unshift = ArrayProto.unshift, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // All **ECMAScript 5** native function implementations that we hope to use - // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; - - // Create a safe reference to the Underscore object for use below. - var _ = function(obj) { return new wrapper(obj); }; - - // Export the Underscore object for **Node.js** and **"CommonJS"**, with - // backwards-compatibility for the old `require()` API. If we're not in - // CommonJS, add `_` to the global object. - module.exports = _; - - // Current version. - _.VERSION = '1.2.2'; - - // Collection Functions - // -------------------- - - // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - for (var key in obj) { - if (hasOwnProperty.call(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } - } - } - }; - - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); - return results; - }; - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = memo !== void 0; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError("Reduce of empty array with no initial value"); - return memo; - }; - - // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse(); - return _.reduce(reversed, iterator, memo, context); - }; - - // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; - }; - - // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. - // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - each(obj, function(value, index, list) { - if (!iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. - // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return result; - }; - - // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. - // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator = iterator || _.identity; - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if a given value is included in the array or object using `===`. - // Aliased as `contains`. - _.include = _.contains = function(obj, target) { - var found = false; - if (obj == null) return found; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - found = any(obj, function(value) { - return value === target; - }); - return found; - }; - - // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - return _.map(obj, function(value) { - return (method.call ? method || value : value[method]).apply(value, args); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); - }; - - // Return the maximum element or (element-based computation). - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Shuffle an array. - _.shuffle = function(obj) { - var shuffled = [], rand; - each(obj, function(value, index, list) { - if (index == 0) { - shuffled[0] = value; - } else { - rand = Math.floor(Math.random() * (index + 1)); - shuffled[index] = shuffled[rand]; - shuffled[rand] = value; - } - }); - return shuffled; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, iterator, context) { - return _.pluck(_.map(obj, function(value, index, list) { - return { - value : value, - criteria : iterator.call(context, value, index, list) - }; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }), 'value'); - }; - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - _.groupBy = function(obj, val) { - var result = {}; - var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; - each(obj, function(value, index) { - var key = iterator(value, index); - (result[key] || (result[key] = [])).push(value); - }); - return result; - }; - - // Use a comparator function to figure out at what index an object should - // be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator) { - iterator || (iterator = _.identity); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >> 1; - iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; - } - return low; - }; - - // Safely convert anything iterable into a real, live array. - _.toArray = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - if (_.isArray(iterable)) return slice.call(iterable); - if (_.isArguments(iterable)) return slice.call(iterable); - return _.values(iterable); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - return _.toArray(obj).length; - }; - - // Array Functions - // --------------- - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. Aliased as `head`. The **guard** check allows it to work - // with `_.map`. - _.first = _.head = function(array, n, guard) { - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; - }; - - // Returns everything but the last entry of the array. Especcialy useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. - _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); - }; - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. - _.last = function(array, n, guard) { - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } - }; - - // Returns everything but the first entry of the array. Aliased as `tail`. - // Especially useful on the arguments object. Passing an **index** will return - // the rest of the values in the array from that index onward. The **guard** - // check allows it to work with `_.map`. - _.rest = _.tail = function(array, index, guard) { - return slice.call(array, (index == null) || guard ? 1 : index); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, function(value){ return !!value; }); - }; - - // Return a completely flattened version of an array. - _.flatten = function(array, shallow) { - return _.reduce(array, function(memo, value) { - if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value)); - memo[memo.length] = value; - return memo; - }, []); - }; - - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator) { - var initial = iterator ? _.map(array, iterator) : array; - var result = []; - _.reduce(initial, function(memo, el, i) { - if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) { - memo[memo.length] = el; - result[result.length] = array[i]; - } - return memo; - }, []); - return result; - }; - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - _.union = function() { - return _.uniq(_.flatten(arguments, true)); - }; - - // Produce an array that contains every item shared between all the - // passed-in arrays. (Aliased as "intersect" for back-compat.) - _.intersection = _.intersect = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); - }; - - // Take the difference between one array and another. - // Only the elements present in just the first array will remain. - _.difference = function(array, other) { - return _.filter(array, function(value){ return !_.include(other, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); - for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i); - return results; - }; - - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i, l; - if (isSorted) { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item); - for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i; - return -1; - }; - - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item) { - if (array == null) return -1; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item); - var i = array.length; - while (i--) if (array[i] === item) return i; - return -1; - }; - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](http://docs.python.org/library/functions.html#range). - _.range = function(start, stop, step) { - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - step = arguments[2] || 1; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while(idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }; - - // Function (ahem) Functions - // ------------------ - - // Reusable constructor function for prototype setting. - var ctor = function(){}; - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). Binding with arguments is also known as `curry`. - // Delegates to **ECMAScript 5**'s native `Function.bind` if available. - // We check for `func.bind` first, to fail fast when `func` is undefined. - _.bind = function bind(func, context) { - var bound, args; - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; - - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length == 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; - - // Memoize an expensive function by storing its results. - _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); - }; - }; - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(func, args); }, wait); - }; - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, throttling, more; - var whenDone = _.debounce(function(){ more = throttling = false; }, wait); - return function() { - context = this; args = arguments; - var later = function() { - timeout = null; - if (more) func.apply(context, args); - whenDone(); - }; - if (!timeout) timeout = setTimeout(later, wait); - if (throttling) { - more = true; - } else { - func.apply(context, args); - } - whenDone(); - throttling = true; - }; - }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // N milliseconds. - _.debounce = function(func, wait) { - var timeout; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - func.apply(context, args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - }; - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - return memo = func.apply(this, arguments); - }; - }; - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - _.wrap = function(func, wrapper) { - return function() { - var args = [func].concat(slice.call(arguments)); - return wrapper.apply(this, args); - }; - }; - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - _.compose = function() { - var funcs = slice.call(arguments); - return function() { - var args = slice.call(arguments); - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; - }; - }; - - // Returns a function that will only be executed after being called N times. - _.after = function(times, func) { - if (times <= 0) return func(); - return function() { - if (--times < 1) { return func.apply(this, arguments); } - }; - }; - - // Object Functions - // ---------------- - - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); - var keys = []; - for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key; - return keys; - }; - - // Retrieve the values of an object's properties. - _.values = function(obj) { - return _.map(obj, _.identity); - }; - - // Return a sorted list of the function names available on the object. - // Aliased as `methods` - _.functions = _.methods = function(obj) { - var names = []; - for (var key in obj) { - if (_.isFunction(obj[key])) names.push(key); - } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - if (source[prop] !== void 0) obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; - - // Invokes interceptor with the obj, and then returns obj. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - _.tap = function(obj, interceptor) { - interceptor(obj); - return obj; - }; - - // Internal recursive comparison function. - function eq(a, b, stack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; - // Unwrap any wrapped objects. - if (a._chain) a = a._wrapped; - if (b._chain) b = b._wrapped; - // Invoke a custom `isEqual` method if one is provided. - if (_.isFunction(a.isEqual)) return a.isEqual(b); - if (_.isFunction(b.isEqual)) return b.isEqual(a); - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className != toString.call(b)) return false; - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return String(a) == String(b); - case '[object Number]': - a = +a; - b = +b; - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != a ? b != b : (a == 0 ? 1 / a == 1 / b : a == b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') return false; - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = stack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (stack[length] == a) return true; - } - // Add the first object to the stack of traversed objects. - stack.push(a); - var size = 0, result = true; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - // Ensure commutative equality for sparse arrays. - if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break; - } - } - } else { - // Objects with different constructors are not equivalent. - if ("constructor" in a != "constructor" in b || a.constructor != b.constructor) return false; - // Deep compare objects. - for (var key in a) { - if (hasOwnProperty.call(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = hasOwnProperty.call(b, key) && eq(a[key], b[key], stack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (hasOwnProperty.call(b, key) && !(size--)) break; - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - stack.pop(); - return result; - } - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b, []); - }; - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - _.isEmpty = function(obj) { - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (hasOwnProperty.call(obj, key)) return false; - return true; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType == 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - return obj === Object(obj); - }; - - // Is a given variable an arguments object? - if (toString.call(arguments) == '[object Arguments]') { - _.isArguments = function(obj) { - return toString.call(obj) == '[object Arguments]'; - }; - } else { - _.isArguments = function(obj) { - return !!(obj && hasOwnProperty.call(obj, 'callee')); - }; - } - - // Is a given value a function? - _.isFunction = function(obj) { - return toString.call(obj) == '[object Function]'; - }; - - // Is a given value a string? - _.isString = function(obj) { - return toString.call(obj) == '[object String]'; - }; - - // Is a given value a number? - _.isNumber = function(obj) { - return toString.call(obj) == '[object Number]'; - }; - - // Is the given value `NaN`? - _.isNaN = function(obj) { - // `NaN` is the only value for which `===` is not reflexive. - return obj !== obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; - }; - - // Is a given value a date? - _.isDate = function(obj) { - return toString.call(obj) == '[object Date]'; - }; - - // Is the given value a regular expression? - _.isRegExp = function(obj) { - return toString.call(obj) == '[object RegExp]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // Utility Functions - // ----------------- - - // Run Underscore.js in *noConflict* mode, returning the `_` variable to its - // previous owner. Returns a reference to the Underscore object. - _.noConflict = function() { - root._ = previousUnderscore; - return this; - }; - - // Keep the identity function around for default iterators. - _.identity = function(value) { - return value; - }; - - // Run a function **n** times. - _.times = function (n, iterator, context) { - for (var i = 0; i < n; i++) iterator.call(context, i); - }; - - // Escape a string for HTML interpolation. - _.escape = function(string) { - return (''+string).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); - }; - - // Add your own custom functions to the Underscore object, ensuring that - // they're correctly added to the OOP wrapper as well. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - addToWrapper(name, _[name] = obj[name]); - }); - }; - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - _.uniqueId = function(prefix) { - var id = idCounter++; - return prefix ? prefix + id : id; - }; - - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g - }; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - _.template = function(str, data) { - var c = _.templateSettings; - var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + - 'with(obj||{}){__p.push(\'' + - str.replace(/\\/g, '\\\\') - .replace(/'/g, "\\'") - .replace(c.escape, function(match, code) { - return "',_.escape(" + code.replace(/\\'/g, "'") + "),'"; - }) - .replace(c.interpolate, function(match, code) { - return "'," + code.replace(/\\'/g, "'") + ",'"; - }) - .replace(c.evaluate || null, function(match, code) { - return "');" + code.replace(/\\'/g, "'") - .replace(/[\r\n\t]/g, ' ') + ";__p.push('"; - }) - .replace(/\r/g, '\\r') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - + "');}return __p.join('');"; - var func = new Function('obj', '_', tmpl); - return data ? func(data, _) : function(data) { return func(data, _) }; - }; - - // The OOP Wrapper - // --------------- - - // If Underscore is called as a function, it returns a wrapped object that - // can be used OO-style. This wrapper holds altered versions of all the - // underscore functions. Wrapped objects may be chained. - var wrapper = function(obj) { this._wrapped = obj; }; - - // Expose `wrapper.prototype` as `_.prototype` - _.prototype = wrapper.prototype; - - // Helper function to continue chaining intermediate results. - var result = function(obj, chain) { - return chain ? _(obj).chain() : obj; - }; - - // A method to easily add functions to the OOP wrapper. - var addToWrapper = function(name, func) { - wrapper.prototype[name] = function() { - var args = slice.call(arguments); - unshift.call(args, this._wrapped); - return result(func.apply(_, args), this._chain); - }; - }; - - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); - - // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - method.apply(this._wrapped, arguments); - return result(this._wrapped, this._chain); - }; - }); - - // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - return result(method.apply(this._wrapped, arguments), this._chain); - }; - }); - - // Start chaining a wrapped Underscore object. - wrapper.prototype.chain = function() { - this._chain = true; - return this; - }; - - // Extracts the result from a wrapped and chained object. - wrapper.prototype.value = function() { - return this._wrapped; - }; - -}).call(this); From 03b32ec29c49539ee3a416a6af11ac16c7e72512 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 13:37:14 -0700 Subject: [PATCH 042/281] Use coffee-script node module This required upgrading underscore which to fix issues with _.isEqual working across objects created from different documents. The upgrade required adding a custom _.isEqual extension that added back support for object's having an isEqual method that was removed in underscore 1.4.0. --- package.json | 2 +- spec/app/config-spec.coffee | 2 +- spec/stdlib/cson-spec.coffee | 2 +- .../snippets/lib/snippet-expansion.coffee | 2 +- src/stdlib/fs.coffee | 2 +- src/stdlib/require.coffee | 4 +- src/stdlib/settings.coffee | 2 +- src/stdlib/underscore-extensions.coffee | 50 + vendor/coffee-script.js | 4642 ----------------- 9 files changed, 58 insertions(+), 4650 deletions(-) delete mode 100644 vendor/coffee-script.js diff --git a/package.json b/package.json index 8dae9dcb0..4b2f92479 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "oniguruma": "0.5.0", "mkdirp": "0.3.5", "git-utils": "0.3.0", - "underscore": "1.3.3" + "underscore": "1.4.4" }, "scripts": { diff --git a/spec/app/config-spec.coffee b/spec/app/config-spec.coffee index 7062c4042..65c212c24 100644 --- a/spec/app/config-spec.coffee +++ b/spec/app/config-spec.coffee @@ -49,7 +49,7 @@ describe "Config", -> config.save() expect(fs.write.argsForCall[0][0]).toBe(fs.join(config.configDirPath, "config.cson")) - {CoffeeScript} = require 'coffee-script' + CoffeeScript = nodeRequire 'coffee-script' writtenConfig = CoffeeScript.eval(fs.write.argsForCall[0][1], bare: true) expect(writtenConfig).toEqual config.settings diff --git a/spec/stdlib/cson-spec.coffee b/spec/stdlib/cson-spec.coffee index a1207203c..a8ca1746b 100644 --- a/spec/stdlib/cson-spec.coffee +++ b/spec/stdlib/cson-spec.coffee @@ -85,6 +85,6 @@ describe "CSON", -> singleTrailingNewline: true cson = CSON.stringify(object) - {CoffeeScript} = require 'coffee-script' + CoffeeScript = nodeRequire 'coffee-script' evaledObject = CoffeeScript.eval(cson, bare: true) expect(evaledObject).toEqual object diff --git a/src/packages/snippets/lib/snippet-expansion.coffee b/src/packages/snippets/lib/snippet-expansion.coffee index 7d0ffdc76..825cd92f7 100644 --- a/src/packages/snippets/lib/snippet-expansion.coffee +++ b/src/packages/snippets/lib/snippet-expansion.coffee @@ -27,7 +27,7 @@ class SnippetExpansion return if @settingTabStop or bufferChanged oldTabStops = @tabStopsForBufferPosition(oldBufferPosition) newTabStops = @tabStopsForBufferPosition(newBufferPosition) - @destroy() unless _.intersect(oldTabStops, newTabStops).length + @destroy() unless _.intersection(oldTabStops, newTabStops).length placeTabStopMarkers: (startPosition, tabStopRanges) -> @tabStopMarkers = tabStopRanges.map ({start, end}) => diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 542ab016c..479b0608a 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -218,7 +218,7 @@ module.exports = readObject: (path) -> contents = @read(path) if @extension(path) is '.cson' - {CoffeeScript} = require 'coffee-script' + CoffeeScript = nodeRequire 'coffee-script' CoffeeScript.eval(contents, bare: true) else JSON.parse(contents) diff --git a/src/stdlib/require.coffee b/src/stdlib/require.coffee index 7e46b5b60..b4fa85ea1 100644 --- a/src/stdlib/require.coffee +++ b/src/stdlib/require.coffee @@ -61,7 +61,7 @@ exts = compiled = __read(cacheFilePath) writeToCache = false else - {CoffeeScript} = require 'coffee-script' + CoffeeScript = nodeRequire 'coffee-script' compiled = CoffeeScript.compile(__read(file), filename: file) writeToCache = true @@ -76,7 +76,7 @@ getPath = (path) -> cacheFilePath = getCacheFilePath(path) unless __exists(cacheFilePath) - {CoffeeScript} = require 'coffee-script' + CoffeeScript = nodeRequire 'coffee-script' compiled = CoffeeScript.compile(__read(path), filename: path) createCacheDirectory() fs.writeFileSync(cacheFilePath, compiled) diff --git a/src/stdlib/settings.coffee b/src/stdlib/settings.coffee index 21961f5ce..f067b44dc 100644 --- a/src/stdlib/settings.coffee +++ b/src/stdlib/settings.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -{CoffeeScript} = require 'coffee-script' +CoffeeScript = require 'coffee-script' # Settings file looks like: # editor: # name of class diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index 7aecba5b8..cc23b3fe8 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -131,3 +131,53 @@ _.mixin for key, value of object newObject[key] = value if value? newObject + +originalIsEqual = _.isEqual +extendedIsEqual = (a, b, aStack=[], bStack=[]) -> + return originalIsEqual(a, b) if a is b + return originalIsEqual(a, b) if _.isFunction(a) or _.isFunction(b) + return a.isEqual(b) if _.isFunction(a?.isEqual) + return b.isEqual(a) if _.isFunction(b?.isEqual) + + stackIndex = aStack.length + while stackIndex-- + return bStack[stackIndex] is b if aStack[stackIndex] is a + aStack.push(a) + bStack.push(b) + + equal = false + if _.isArray(a) and _.isArray(b) and a.length is b.length + equal = true + for aElement, i in a + unless extendedIsEqual(aElement, b[i], aStack, bStack) + equal = false + break + else if _.isObject(a) and _.isObject(b) + aCtor = a.constructor + bCtor = b.constructor + aCtorValid = _.isFunction(aCtor) and aCtor instanceof aCtor + bCtorValid = _.isFunction(bCtor) and bCtor instanceof bCtor + if aCtor isnt bCtor and not (aCtorValid and bCtorValid) + equal = false + else + aKeyCount = 0 + equal = true + for key, aValue of a + continue unless _.has(a, key) + aKeyCount++ + unless _.has(b, key) and extendedIsEqual(aValue, b[key], aStack, bStack) + equal = false + break + if equal + bKeyCount = 0 + for key, bValue of b + bKeyCount++ if _.has(b, key) + equal = aKeyCount is bKeyCount + else + equal = originalIsEqual(a, b) + + aStack.pop() + bStack.pop() + equal + +_.isEqual = (a, b) -> extendedIsEqual(a, b) diff --git a/vendor/coffee-script.js b/vendor/coffee-script.js deleted file mode 100644 index 18d9e9010..000000000 --- a/vendor/coffee-script.js +++ /dev/null @@ -1,4642 +0,0 @@ -// MODIFIED: -// Generated with `MINIFY=false cake build:browser` from CoffeeScript source -// Removed call to `define` at end of file so our wrapper kicks in - -/** - * CoffeeScript Compiler v1.2.0 - * http://coffeescript.org - * - * Copyright 2011, Jeremy Ashkenas - * Released under the MIT License - */ -(function(root) { - var CoffeeScript = function() { - function require(path){ return require[path]; } - require['./helpers'] = new function() { - var exports = this; - (function() { - var extend, flatten; - - exports.starts = function(string, literal, start) { - return literal === string.substr(start, literal.length); - }; - - exports.ends = function(string, literal, back) { - var len; - len = literal.length; - return literal === string.substr(string.length - len - (back || 0), len); - }; - - exports.compact = function(array) { - var item, _i, _len, _results; - _results = []; - for (_i = 0, _len = array.length; _i < _len; _i++) { - item = array[_i]; - if (item) _results.push(item); - } - return _results; - }; - - exports.count = function(string, substr) { - var num, pos; - num = pos = 0; - if (!substr.length) return 1 / 0; - while (pos = 1 + string.indexOf(substr, pos)) { - num++; - } - return num; - }; - - exports.merge = function(options, overrides) { - return extend(extend({}, options), overrides); - }; - - extend = exports.extend = function(object, properties) { - var key, val; - for (key in properties) { - val = properties[key]; - object[key] = val; - } - return object; - }; - - exports.flatten = flatten = function(array) { - var element, flattened, _i, _len; - flattened = []; - for (_i = 0, _len = array.length; _i < _len; _i++) { - element = array[_i]; - if (element instanceof Array) { - flattened = flattened.concat(flatten(element)); - } else { - flattened.push(element); - } - } - return flattened; - }; - - exports.del = function(obj, key) { - var val; - val = obj[key]; - delete obj[key]; - return val; - }; - - exports.last = function(array, back) { - return array[array.length - (back || 0) - 1]; - }; - -}).call(this); - -};require['./rewriter'] = new function() { - var exports = this; - (function() { - var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref, - __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __slice = Array.prototype.slice; - - exports.Rewriter = (function() { - - function Rewriter() {} - - Rewriter.prototype.rewrite = function(tokens) { - this.tokens = tokens; - this.removeLeadingNewlines(); - this.removeMidExpressionNewlines(); - this.closeOpenCalls(); - this.closeOpenIndexes(); - this.addImplicitIndentation(); - this.tagPostfixConditionals(); - this.addImplicitBraces(); - this.addImplicitParentheses(); - return this.tokens; - }; - - Rewriter.prototype.scanTokens = function(block) { - var i, token, tokens; - tokens = this.tokens; - i = 0; - while (token = tokens[i]) { - i += block.call(this, token, i, tokens); - } - return true; - }; - - Rewriter.prototype.detectEnd = function(i, condition, action) { - var levels, token, tokens, _ref, _ref2; - tokens = this.tokens; - levels = 0; - while (token = tokens[i]) { - if (levels === 0 && condition.call(this, token, i)) { - return action.call(this, token, i); - } - if (!token || levels < 0) return action.call(this, token, i - 1); - if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) { - levels += 1; - } else if (_ref2 = token[0], __indexOf.call(EXPRESSION_END, _ref2) >= 0) { - levels -= 1; - } - i += 1; - } - return i - 1; - }; - - Rewriter.prototype.removeLeadingNewlines = function() { - var i, tag, _len, _ref; - _ref = this.tokens; - for (i = 0, _len = _ref.length; i < _len; i++) { - tag = _ref[i][0]; - if (tag !== 'TERMINATOR') break; - } - if (i) return this.tokens.splice(0, i); - }; - - Rewriter.prototype.removeMidExpressionNewlines = function() { - return this.scanTokens(function(token, i, tokens) { - var _ref; - if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) { - return 1; - } - tokens.splice(i, 1); - return 0; - }); - }; - - Rewriter.prototype.closeOpenCalls = function() { - var action, condition; - condition = function(token, i) { - var _ref; - return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')'; - }; - action = function(token, i) { - return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END'; - }; - return this.scanTokens(function(token, i) { - if (token[0] === 'CALL_START') this.detectEnd(i + 1, condition, action); - return 1; - }); - }; - - Rewriter.prototype.closeOpenIndexes = function() { - var action, condition; - condition = function(token, i) { - var _ref; - return (_ref = token[0]) === ']' || _ref === 'INDEX_END'; - }; - action = function(token, i) { - return token[0] = 'INDEX_END'; - }; - return this.scanTokens(function(token, i) { - if (token[0] === 'INDEX_START') this.detectEnd(i + 1, condition, action); - return 1; - }); - }; - - Rewriter.prototype.addImplicitBraces = function() { - var action, condition, sameLine, stack, start, startIndent, startsLine; - stack = []; - start = null; - startsLine = null; - sameLine = true; - startIndent = 0; - condition = function(token, i) { - var one, tag, three, two, _ref, _ref2; - _ref = this.tokens.slice(i + 1, (i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2]; - if ('HERECOMMENT' === (one != null ? one[0] : void 0)) return false; - tag = token[0]; - if (__indexOf.call(LINEBREAKS, tag) >= 0) sameLine = false; - return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine)) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref2 = one[0]) !== 'IDENTIFIER' && _ref2 !== 'NUMBER' && _ref2 !== 'STRING' && _ref2 !== '@' && _ref2 !== 'TERMINATOR' && _ref2 !== 'OUTDENT')); - }; - action = function(token, i) { - var tok; - tok = ['}', '}', token[2]]; - tok.generated = true; - return this.tokens.splice(i, 0, tok); - }; - return this.scanTokens(function(token, i, tokens) { - var ago, idx, prevTag, tag, tok, value, _ref, _ref2; - if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) { - stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]); - return 1; - } - if (__indexOf.call(EXPRESSION_END, tag) >= 0) { - start = stack.pop(); - return 1; - } - if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref2 = stack[stack.length - 1]) != null ? _ref2[0] : void 0) !== '{'))) { - return 1; - } - sameLine = true; - stack.push(['{']); - idx = ago === '@' ? i - 2 : i - 1; - while (this.tag(idx - 2) === 'HERECOMMENT') { - idx -= 2; - } - prevTag = this.tag(idx - 1); - startsLine = !prevTag || (__indexOf.call(LINEBREAKS, prevTag) >= 0); - value = new String('{'); - value.generated = true; - tok = ['{', value, token[2]]; - tok.generated = true; - tokens.splice(idx, 0, tok); - this.detectEnd(i + 2, condition, action); - return 2; - }); - }; - - Rewriter.prototype.addImplicitParentheses = function() { - var action, condition, noCall, seenControl, seenSingle; - noCall = seenSingle = seenControl = false; - condition = function(token, i) { - var post, tag, _ref, _ref2; - tag = token[0]; - if (!seenSingle && token.fromThen) return true; - if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') { - seenSingle = true; - } - if (tag === 'IF' || tag === 'ELSE' || tag === 'SWITCH' || tag === 'TRY' || tag === '=') { - seenControl = true; - } - if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') { - return true; - } - return !token.generated && this.tag(i - 1) !== ',' && (__indexOf.call(IMPLICIT_END, tag) >= 0 || (tag === 'INDENT' && !seenControl)) && (tag !== 'INDENT' || (((_ref = this.tag(i - 2)) !== 'CLASS' && _ref !== 'EXTENDS') && (_ref2 = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref2) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{'))); - }; - action = function(token, i) { - return this.tokens.splice(i, 0, ['CALL_END', ')', token[2]]); - }; - return this.scanTokens(function(token, i, tokens) { - var callObject, current, next, prev, tag, _ref, _ref2, _ref3; - tag = token[0]; - if (tag === 'CLASS' || tag === 'IF') noCall = true; - _ref = tokens.slice(i - 1, (i + 1) + 1 || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2]; - callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0); - seenSingle = false; - seenControl = false; - if (__indexOf.call(LINEBREAKS, tag) >= 0) noCall = false; - if (prev && !prev.spaced && tag === '?') token.call = true; - if (token.fromThen) return 1; - if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref3 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref3) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) { - return 1; - } - tokens.splice(i, 0, ['CALL_START', '(', token[2]]); - this.detectEnd(i + 1, condition, action); - if (prev[0] === '?') prev[0] = 'FUNC_EXIST'; - return 2; - }); - }; - - Rewriter.prototype.addImplicitIndentation = function() { - var action, condition, indent, outdent, starter; - starter = indent = outdent = null; - condition = function(token, i) { - var _ref; - return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN')); - }; - action = function(token, i) { - return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); - }; - return this.scanTokens(function(token, i, tokens) { - var tag, _ref, _ref2; - tag = token[0]; - if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') { - tokens.splice(i, 1); - return 0; - } - if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { - tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token)))); - return 2; - } - if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) { - tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token)))); - return 4; - } - if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { - starter = tag; - _ref2 = this.indentation(token), indent = _ref2[0], outdent = _ref2[1]; - if (starter === 'THEN') indent.fromThen = true; - indent.generated = outdent.generated = true; - tokens.splice(i + 1, 0, indent); - this.detectEnd(i + 2, condition, action); - if (tag === 'THEN') tokens.splice(i, 1); - return 1; - } - return 1; - }); - }; - - Rewriter.prototype.tagPostfixConditionals = function() { - var action, condition, original; - original = null; - condition = function(token, i) { - var _ref; - return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT'; - }; - action = function(token, i) { - if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) { - return original[0] = 'POST_' + original[0]; - } - }; - return this.scanTokens(function(token, i) { - if (token[0] !== 'IF') return 1; - original = token; - this.detectEnd(i + 1, condition, action); - return 1; - }); - }; - - Rewriter.prototype.indentation = function(token) { - return [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]]; - }; - - Rewriter.prototype.tag = function(i) { - var _ref; - return (_ref = this.tokens[i]) != null ? _ref[0] : void 0; - }; - - return Rewriter; - - })(); - - BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']]; - - exports.INVERSES = INVERSES = {}; - - EXPRESSION_START = []; - - EXPRESSION_END = []; - - for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) { - _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1]; - EXPRESSION_START.push(INVERSES[rite] = left); - EXPRESSION_END.push(INVERSES[left] = rite); - } - - EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END); - - IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']; - - IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++']; - - IMPLICIT_UNSPACED_CALL = ['+', '-']; - - IMPLICIT_BLOCK = ['->', '=>', '{', '[', ',']; - - IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; - - SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; - - SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; - - LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; - -}).call(this); - -};require['./lexer'] = new function() { - var exports = this; - (function() { - var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref, _ref2, - __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - _ref = require('./rewriter'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES; - - _ref2 = require('./helpers'), count = _ref2.count, starts = _ref2.starts, compact = _ref2.compact, last = _ref2.last; - - exports.Lexer = Lexer = (function() { - - function Lexer() {} - - Lexer.prototype.tokenize = function(code, opts) { - var i, tag; - if (opts == null) opts = {}; - if (WHITESPACE.test(code)) code = "\n" + code; - code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); - this.code = code; - this.line = opts.line || 0; - this.indent = 0; - this.indebt = 0; - this.outdebt = 0; - this.indents = []; - this.ends = []; - this.tokens = []; - i = 0; - while (this.chunk = code.slice(i)) { - i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); - } - this.closeIndentation(); - if (tag = this.ends.pop()) this.error("missing " + tag); - if (opts.rewrite === false) return this.tokens; - return (new Rewriter).rewrite(this.tokens); - }; - - Lexer.prototype.identifierToken = function() { - var colon, forcedIdentifier, id, input, match, prev, tag, _ref3, _ref4; - if (!(match = IDENTIFIER.exec(this.chunk))) return 0; - input = match[0], id = match[1], colon = match[2]; - if (id === 'own' && this.tag() === 'FOR') { - this.token('OWN', id); - return id.length; - } - forcedIdentifier = colon || (prev = last(this.tokens)) && (((_ref3 = prev[0]) === '.' || _ref3 === '?.' || _ref3 === '::') || !prev.spaced && prev[0] === '@'); - tag = 'IDENTIFIER'; - if (!forcedIdentifier && (__indexOf.call(JS_KEYWORDS, id) >= 0 || __indexOf.call(COFFEE_KEYWORDS, id) >= 0)) { - tag = id.toUpperCase(); - if (tag === 'WHEN' && (_ref4 = this.tag(), __indexOf.call(LINE_BREAK, _ref4) >= 0)) { - tag = 'LEADING_WHEN'; - } else if (tag === 'FOR') { - this.seenFor = true; - } else if (tag === 'UNLESS') { - tag = 'IF'; - } else if (__indexOf.call(UNARY, tag) >= 0) { - tag = 'UNARY'; - } else if (__indexOf.call(RELATION, tag) >= 0) { - if (tag !== 'INSTANCEOF' && this.seenFor) { - tag = 'FOR' + tag; - this.seenFor = false; - } else { - tag = 'RELATION'; - if (this.value() === '!') { - this.tokens.pop(); - id = '!' + id; - } - } - } - } - if (__indexOf.call(['eval', 'arguments'].concat(JS_FORBIDDEN), id) >= 0) { - if (forcedIdentifier) { - tag = 'IDENTIFIER'; - id = new String(id); - id.reserved = true; - } else if (__indexOf.call(RESERVED, id) >= 0) { - this.error("reserved word \"" + id + "\""); - } - } - if (!forcedIdentifier) { - if (__indexOf.call(COFFEE_ALIASES, id) >= 0) id = COFFEE_ALIAS_MAP[id]; - tag = (function() { - switch (id) { - case '!': - return 'UNARY'; - case '==': - case '!=': - return 'COMPARE'; - case '&&': - case '||': - return 'LOGIC'; - case 'true': - case 'false': - case 'null': - case 'undefined': - return 'BOOL'; - case 'break': - case 'continue': - return 'STATEMENT'; - default: - return tag; - } - })(); - } - this.token(tag, id); - if (colon) this.token(':', ':'); - return input.length; - }; - - Lexer.prototype.numberToken = function() { - var binaryLiteral, lexedLength, match, number; - if (!(match = NUMBER.exec(this.chunk))) return 0; - number = match[0]; - lexedLength = number.length; - if (binaryLiteral = /0b([01]+)/.exec(number)) { - number = (parseInt(binaryLiteral[1], 2)).toString(); - } - this.token('NUMBER', number); - return lexedLength; - }; - - Lexer.prototype.stringToken = function() { - var match, string; - switch (this.chunk.charAt(0)) { - case "'": - if (!(match = SIMPLESTR.exec(this.chunk))) return 0; - this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n')); - break; - case '"': - if (!(string = this.balancedString(this.chunk, '"'))) return 0; - if (0 < string.indexOf('#{', 1)) { - this.interpolateString(string.slice(1, -1)); - } else { - this.token('STRING', this.escapeLines(string)); - } - break; - default: - return 0; - } - this.line += count(string, '\n'); - return string.length; - }; - - Lexer.prototype.heredocToken = function() { - var doc, heredoc, match, quote; - if (!(match = HEREDOC.exec(this.chunk))) return 0; - heredoc = match[0]; - quote = heredoc.charAt(0); - doc = this.sanitizeHeredoc(match[2], { - quote: quote, - indent: null - }); - if (quote === '"' && 0 <= doc.indexOf('#{')) { - this.interpolateString(doc, { - heredoc: true - }); - } else { - this.token('STRING', this.makeString(doc, quote, true)); - } - this.line += count(heredoc, '\n'); - return heredoc.length; - }; - - Lexer.prototype.commentToken = function() { - var comment, here, match; - if (!(match = this.chunk.match(COMMENT))) return 0; - comment = match[0], here = match[1]; - if (here) { - this.token('HERECOMMENT', this.sanitizeHeredoc(here, { - herecomment: true, - indent: Array(this.indent + 1).join(' ') - })); - this.token('TERMINATOR', '\n'); - } - this.line += count(comment, '\n'); - return comment.length; - }; - - Lexer.prototype.jsToken = function() { - var match, script; - if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) { - return 0; - } - this.token('JS', (script = match[0]).slice(1, -1)); - return script.length; - }; - - Lexer.prototype.regexToken = function() { - var flags, length, match, prev, regex, _ref3, _ref4; - if (this.chunk.charAt(0) !== '/') return 0; - if (match = HEREGEX.exec(this.chunk)) { - length = this.heregexToken(match); - this.line += count(match[0], '\n'); - return length; - } - prev = last(this.tokens); - if (prev && (_ref3 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref3) >= 0)) { - return 0; - } - if (!(match = REGEX.exec(this.chunk))) return 0; - _ref4 = match, match = _ref4[0], regex = _ref4[1], flags = _ref4[2]; - if (regex.slice(0, 2) === '/*') { - this.error('regular expressions cannot begin with `*`'); - } - if (regex === '//') regex = '/(?:)/'; - this.token('REGEX', "" + regex + flags); - return match.length; - }; - - Lexer.prototype.heregexToken = function(match) { - var body, flags, heregex, re, tag, tokens, value, _i, _len, _ref3, _ref4, _ref5, _ref6; - heregex = match[0], body = match[1], flags = match[2]; - if (0 > body.indexOf('#{')) { - re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/'); - if (re.match(/^\*/)) { - this.error('regular expressions cannot begin with `*`'); - } - this.token('REGEX', "/" + (re || '(?:)') + "/" + flags); - return heregex.length; - } - this.token('IDENTIFIER', 'RegExp'); - this.tokens.push(['CALL_START', '(']); - tokens = []; - _ref3 = this.interpolateString(body, { - regex: true - }); - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - _ref4 = _ref3[_i], tag = _ref4[0], value = _ref4[1]; - if (tag === 'TOKENS') { - tokens.push.apply(tokens, value); - } else { - if (!(value = value.replace(HEREGEX_OMIT, ''))) continue; - value = value.replace(/\\/g, '\\\\'); - tokens.push(['STRING', this.makeString(value, '"', true)]); - } - tokens.push(['+', '+']); - } - tokens.pop(); - if (((_ref5 = tokens[0]) != null ? _ref5[0] : void 0) !== 'STRING') { - this.tokens.push(['STRING', '""'], ['+', '+']); - } - (_ref6 = this.tokens).push.apply(_ref6, tokens); - if (flags) this.tokens.push([',', ','], ['STRING', '"' + flags + '"']); - this.token(')', ')'); - return heregex.length; - }; - - Lexer.prototype.lineToken = function() { - var diff, indent, match, noNewlines, prev, size; - if (!(match = MULTI_DENT.exec(this.chunk))) return 0; - indent = match[0]; - this.line += count(indent, '\n'); - this.seenFor = false; - prev = last(this.tokens, 1); - size = indent.length - 1 - indent.lastIndexOf('\n'); - noNewlines = this.unfinished(); - if (size - this.indebt === this.indent) { - if (noNewlines) { - this.suppressNewlines(); - } else { - this.newlineToken(); - } - return indent.length; - } - if (size > this.indent) { - if (noNewlines) { - this.indebt = size - this.indent; - this.suppressNewlines(); - return indent.length; - } - diff = size - this.indent + this.outdebt; - this.token('INDENT', diff); - this.indents.push(diff); - this.ends.push('OUTDENT'); - this.outdebt = this.indebt = 0; - } else { - this.indebt = 0; - this.outdentToken(this.indent - size, noNewlines); - } - this.indent = size; - return indent.length; - }; - - Lexer.prototype.outdentToken = function(moveOut, noNewlines) { - var dent, len; - while (moveOut > 0) { - len = this.indents.length - 1; - if (this.indents[len] === void 0) { - moveOut = 0; - } else if (this.indents[len] === this.outdebt) { - moveOut -= this.outdebt; - this.outdebt = 0; - } else if (this.indents[len] < this.outdebt) { - this.outdebt -= this.indents[len]; - moveOut -= this.indents[len]; - } else { - dent = this.indents.pop() - this.outdebt; - moveOut -= dent; - this.outdebt = 0; - this.pair('OUTDENT'); - this.token('OUTDENT', dent); - } - } - if (dent) this.outdebt -= moveOut; - while (this.value() === ';') { - this.tokens.pop(); - } - if (!(this.tag() === 'TERMINATOR' || noNewlines)) { - this.token('TERMINATOR', '\n'); - } - return this; - }; - - Lexer.prototype.whitespaceToken = function() { - var match, nline, prev; - if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { - return 0; - } - prev = last(this.tokens); - if (prev) prev[match ? 'spaced' : 'newLine'] = true; - if (match) { - return match[0].length; - } else { - return 0; - } - }; - - Lexer.prototype.newlineToken = function() { - while (this.value() === ';') { - this.tokens.pop(); - } - if (this.tag() !== 'TERMINATOR') this.token('TERMINATOR', '\n'); - return this; - }; - - Lexer.prototype.suppressNewlines = function() { - if (this.value() === '\\') this.tokens.pop(); - return this; - }; - - Lexer.prototype.literalToken = function() { - var match, prev, tag, value, _ref3, _ref4, _ref5, _ref6; - if (match = OPERATOR.exec(this.chunk)) { - value = match[0]; - if (CODE.test(value)) this.tagParameters(); - } else { - value = this.chunk.charAt(0); - } - tag = value; - prev = last(this.tokens); - if (value === '=' && prev) { - if (!prev[1].reserved && (_ref3 = prev[1], __indexOf.call(JS_FORBIDDEN, _ref3) >= 0)) { - this.error("reserved word \"" + (this.value()) + "\" can't be assigned"); - } - if ((_ref4 = prev[1]) === '||' || _ref4 === '&&') { - prev[0] = 'COMPOUND_ASSIGN'; - prev[1] += '='; - return value.length; - } - } - if (value === ';') { - this.seenFor = false; - tag = 'TERMINATOR'; - } else if (__indexOf.call(MATH, value) >= 0) { - tag = 'MATH'; - } else if (__indexOf.call(COMPARE, value) >= 0) { - tag = 'COMPARE'; - } else if (__indexOf.call(COMPOUND_ASSIGN, value) >= 0) { - tag = 'COMPOUND_ASSIGN'; - } else if (__indexOf.call(UNARY, value) >= 0) { - tag = 'UNARY'; - } else if (__indexOf.call(SHIFT, value) >= 0) { - tag = 'SHIFT'; - } else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) { - tag = 'LOGIC'; - } else if (prev && !prev.spaced) { - if (value === '(' && (_ref5 = prev[0], __indexOf.call(CALLABLE, _ref5) >= 0)) { - if (prev[0] === '?') prev[0] = 'FUNC_EXIST'; - tag = 'CALL_START'; - } else if (value === '[' && (_ref6 = prev[0], __indexOf.call(INDEXABLE, _ref6) >= 0)) { - tag = 'INDEX_START'; - switch (prev[0]) { - case '?': - prev[0] = 'INDEX_SOAK'; - } - } - } - switch (value) { - case '(': - case '{': - case '[': - this.ends.push(INVERSES[value]); - break; - case ')': - case '}': - case ']': - this.pair(value); - } - this.token(tag, value); - return value.length; - }; - - Lexer.prototype.sanitizeHeredoc = function(doc, options) { - var attempt, herecomment, indent, match, _ref3; - indent = options.indent, herecomment = options.herecomment; - if (herecomment) { - if (HEREDOC_ILLEGAL.test(doc)) { - this.error("block comment cannot contain \"*/\", starting"); - } - if (doc.indexOf('\n') <= 0) return doc; - } else { - while (match = HEREDOC_INDENT.exec(doc)) { - attempt = match[1]; - if (indent === null || (0 < (_ref3 = attempt.length) && _ref3 < indent.length)) { - indent = attempt; - } - } - } - if (indent) doc = doc.replace(RegExp("\\n" + indent, "g"), '\n'); - if (!herecomment) doc = doc.replace(/^\n/, ''); - return doc; - }; - - Lexer.prototype.tagParameters = function() { - var i, stack, tok, tokens; - if (this.tag() !== ')') return this; - stack = []; - tokens = this.tokens; - i = tokens.length; - tokens[--i][0] = 'PARAM_END'; - while (tok = tokens[--i]) { - switch (tok[0]) { - case ')': - stack.push(tok); - break; - case '(': - case 'CALL_START': - if (stack.length) { - stack.pop(); - } else if (tok[0] === '(') { - tok[0] = 'PARAM_START'; - return this; - } else { - return this; - } - } - } - return this; - }; - - Lexer.prototype.closeIndentation = function() { - return this.outdentToken(this.indent); - }; - - Lexer.prototype.balancedString = function(str, end) { - var i, letter, match, prev, stack, _ref3; - stack = [end]; - for (i = 1, _ref3 = str.length; 1 <= _ref3 ? i < _ref3 : i > _ref3; 1 <= _ref3 ? i++ : i--) { - switch (letter = str.charAt(i)) { - case '\\': - i++; - continue; - case end: - stack.pop(); - if (!stack.length) return str.slice(0, i + 1); - end = stack[stack.length - 1]; - continue; - } - if (end === '}' && (letter === '"' || letter === "'")) { - stack.push(end = letter); - } else if (end === '}' && letter === '/' && (match = HEREGEX.exec(str.slice(i)) || REGEX.exec(str.slice(i)))) { - i += match[0].length - 1; - } else if (end === '}' && letter === '{') { - stack.push(end = '}'); - } else if (end === '"' && prev === '#' && letter === '{') { - stack.push(end = '}'); - } - prev = letter; - } - return this.error("missing " + (stack.pop()) + ", starting"); - }; - - Lexer.prototype.interpolateString = function(str, options) { - var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _len, _ref3, _ref4, _ref5; - if (options == null) options = {}; - heredoc = options.heredoc, regex = options.regex; - tokens = []; - pi = 0; - i = -1; - while (letter = str.charAt(i += 1)) { - if (letter === '\\') { - i += 1; - continue; - } - if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) { - continue; - } - if (pi < i) tokens.push(['NEOSTRING', str.slice(pi, i)]); - inner = expr.slice(1, -1); - if (inner.length) { - nested = new Lexer().tokenize(inner, { - line: this.line, - rewrite: false - }); - nested.pop(); - if (((_ref3 = nested[0]) != null ? _ref3[0] : void 0) === 'TERMINATOR') { - nested.shift(); - } - if (len = nested.length) { - if (len > 1) { - nested.unshift(['(', '(', this.line]); - nested.push([')', ')', this.line]); - } - tokens.push(['TOKENS', nested]); - } - } - i += expr.length; - pi = i + 1; - } - if ((i > pi && pi < str.length)) tokens.push(['NEOSTRING', str.slice(pi)]); - if (regex) return tokens; - if (!tokens.length) return this.token('STRING', '""'); - if (tokens[0][0] !== 'NEOSTRING') tokens.unshift(['', '']); - if (interpolated = tokens.length > 1) this.token('(', '('); - for (i = 0, _len = tokens.length; i < _len; i++) { - _ref4 = tokens[i], tag = _ref4[0], value = _ref4[1]; - if (i) this.token('+', '+'); - if (tag === 'TOKENS') { - (_ref5 = this.tokens).push.apply(_ref5, value); - } else { - this.token('STRING', this.makeString(value, '"', heredoc)); - } - } - if (interpolated) this.token(')', ')'); - return tokens; - }; - - Lexer.prototype.pair = function(tag) { - var size, wanted; - if (tag !== (wanted = last(this.ends))) { - if ('OUTDENT' !== wanted) this.error("unmatched " + tag); - this.indent -= size = last(this.indents); - this.outdentToken(size, true); - return this.pair(tag); - } - return this.ends.pop(); - }; - - Lexer.prototype.token = function(tag, value) { - return this.tokens.push([tag, value, this.line]); - }; - - Lexer.prototype.tag = function(index, tag) { - var tok; - return (tok = last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]); - }; - - Lexer.prototype.value = function(index, val) { - var tok; - return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]); - }; - - Lexer.prototype.unfinished = function() { - var _ref3; - return LINE_CONTINUER.test(this.chunk) || ((_ref3 = this.tag()) === '\\' || _ref3 === '.' || _ref3 === '?.' || _ref3 === 'UNARY' || _ref3 === 'MATH' || _ref3 === '+' || _ref3 === '-' || _ref3 === 'SHIFT' || _ref3 === 'RELATION' || _ref3 === 'COMPARE' || _ref3 === 'LOGIC' || _ref3 === 'COMPOUND_ASSIGN' || _ref3 === 'THROW' || _ref3 === 'EXTENDS'); - }; - - Lexer.prototype.escapeLines = function(str, heredoc) { - return str.replace(MULTILINER, heredoc ? '\\n' : ''); - }; - - Lexer.prototype.makeString = function(body, quote, heredoc) { - if (!body) return quote + quote; - body = body.replace(/\\([\s\S])/g, function(match, contents) { - if (contents === '\n' || contents === quote) { - return contents; - } else { - return match; - } - }); - body = body.replace(RegExp("" + quote, "g"), '\\$&'); - return quote + this.escapeLines(body, heredoc) + quote; - }; - - Lexer.prototype.error = function(message) { - throw SyntaxError("" + message + " on line " + (this.line + 1)); - }; - - return Lexer; - - })(); - - JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super']; - - COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; - - COFFEE_ALIAS_MAP = { - and: '&&', - or: '||', - is: '==', - isnt: '!=', - not: '!', - yes: 'true', - no: 'false', - on: 'true', - off: 'false' - }; - - COFFEE_ALIASES = (function() { - var _results; - _results = []; - for (key in COFFEE_ALIAS_MAP) { - _results.push(key); - } - return _results; - })(); - - COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); - - RESERVED = ['case', 'default', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice', '__bind', '__indexOf']; - - JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED); - - exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS); - - IDENTIFIER = /^([$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)([^\n\S]*:(?!:))?/; - - NUMBER = /^0x[\da-f]+|^0b[01]+|^\d*\.?\d+(?:e[+-]?\d+)?/i; - - HEREDOC = /^("""|''')([\s\S]*?)(?:\n[^\n\S]*)?\1/; - - OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/; - - WHITESPACE = /^[^\n\S]+/; - - COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/; - - CODE = /^[-=]>/; - - MULTI_DENT = /^(?:\n[^\n\S]*)+/; - - SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/; - - JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/; - - REGEX = /^(\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)([imgy]{0,4})(?!\w)/; - - HEREGEX = /^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/; - - HEREGEX_OMIT = /\s+(?:#.*)?/g; - - MULTILINER = /\n/g; - - HEREDOC_INDENT = /\n+([^\n\S]*)/g; - - HEREDOC_ILLEGAL = /\*\//; - - LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; - - TRAILING_SPACES = /\s+$/; - - COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']; - - UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']; - - LOGIC = ['&&', '||', '&', '|', '^']; - - SHIFT = ['<<', '>>', '>>>']; - - COMPARE = ['==', '!=', '<', '>', '<=', '>=']; - - MATH = ['*', '/', '%']; - - RELATION = ['IN', 'OF', 'INSTANCEOF']; - - BOOL = ['TRUE', 'FALSE', 'NULL', 'UNDEFINED']; - - NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']']; - - NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING'); - - CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']; - - INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL'); - - LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; - -}).call(this); - -};require['./parser'] = new function() { - var exports = this; - /* Jison generated parser */ -var parser = (function(){ -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"Root":3,"Body":4,"Block":5,"TERMINATOR":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Comment":11,"STATEMENT":12,"Value":13,"Invocation":14,"Code":15,"Operation":16,"Assign":17,"If":18,"Try":19,"While":20,"For":21,"Switch":22,"Class":23,"Throw":24,"INDENT":25,"OUTDENT":26,"Identifier":27,"IDENTIFIER":28,"AlphaNumeric":29,"NUMBER":30,"STRING":31,"Literal":32,"JS":33,"REGEX":34,"DEBUGGER":35,"BOOL":36,"Assignable":37,"=":38,"AssignObj":39,"ObjAssignable":40,":":41,"ThisProperty":42,"RETURN":43,"HERECOMMENT":44,"PARAM_START":45,"ParamList":46,"PARAM_END":47,"FuncGlyph":48,"->":49,"=>":50,"OptComma":51,",":52,"Param":53,"ParamVar":54,"...":55,"Array":56,"Object":57,"Splat":58,"SimpleAssignable":59,"Accessor":60,"Parenthetical":61,"Range":62,"This":63,".":64,"?.":65,"::":66,"Index":67,"INDEX_START":68,"IndexValue":69,"INDEX_END":70,"INDEX_SOAK":71,"Slice":72,"{":73,"AssignList":74,"}":75,"CLASS":76,"EXTENDS":77,"OptFuncExist":78,"Arguments":79,"SUPER":80,"FUNC_EXIST":81,"CALL_START":82,"CALL_END":83,"ArgList":84,"THIS":85,"@":86,"[":87,"]":88,"RangeDots":89,"..":90,"Arg":91,"SimpleArgs":92,"TRY":93,"Catch":94,"FINALLY":95,"CATCH":96,"THROW":97,"(":98,")":99,"WhileSource":100,"WHILE":101,"WHEN":102,"UNTIL":103,"Loop":104,"LOOP":105,"ForBody":106,"FOR":107,"ForStart":108,"ForSource":109,"ForVariables":110,"OWN":111,"ForValue":112,"FORIN":113,"FOROF":114,"BY":115,"SWITCH":116,"Whens":117,"ELSE":118,"When":119,"LEADING_WHEN":120,"IfBlock":121,"IF":122,"POST_IF":123,"UNARY":124,"-":125,"+":126,"--":127,"++":128,"?":129,"MATH":130,"SHIFT":131,"COMPARE":132,"LOGIC":133,"RELATION":134,"COMPOUND_ASSIGN":135,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"BOOL",38:"=",41:":",43:"RETURN",44:"HERECOMMENT",45:"PARAM_START",47:"PARAM_END",49:"->",50:"=>",52:",",55:"...",64:".",65:"?.",66:"::",68:"INDEX_START",70:"INDEX_END",71:"INDEX_SOAK",73:"{",75:"}",76:"CLASS",77:"EXTENDS",80:"SUPER",81:"FUNC_EXIST",82:"CALL_START",83:"CALL_END",85:"THIS",86:"@",87:"[",88:"]",90:"..",93:"TRY",95:"FINALLY",96:"CATCH",97:"THROW",98:"(",99:")",101:"WHILE",102:"WHEN",103:"UNTIL",105:"LOOP",107:"FOR",111:"OWN",113:"FORIN",114:"FOROF",115:"BY",116:"SWITCH",118:"ELSE",120:"LEADING_WHEN",122:"IF",123:"POST_IF",124:"UNARY",125:"-",126:"+",127:"--",128:"++",129:"?",130:"MATH",131:"SHIFT",132:"COMPARE",133:"LOGIC",134:"RELATION",135:"COMPOUND_ASSIGN"}, -productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[39,1],[39,3],[39,5],[39,1],[40,1],[40,1],[40,1],[10,2],[10,1],[11,1],[15,5],[15,2],[48,1],[48,1],[51,0],[51,1],[46,0],[46,1],[46,3],[53,1],[53,2],[53,3],[54,1],[54,1],[54,1],[54,1],[58,2],[59,1],[59,2],[59,2],[59,1],[37,1],[37,1],[37,1],[13,1],[13,1],[13,1],[13,1],[13,1],[60,2],[60,2],[60,2],[60,1],[60,1],[67,3],[67,2],[69,1],[69,1],[57,4],[74,0],[74,1],[74,3],[74,4],[74,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[78,0],[78,1],[79,2],[79,4],[63,1],[63,1],[42,2],[56,2],[56,4],[89,1],[89,1],[62,5],[72,3],[72,2],[72,2],[84,1],[84,3],[84,4],[84,4],[84,6],[91,1],[91,1],[92,1],[92,3],[19,2],[19,3],[19,4],[19,5],[94,3],[24,2],[61,3],[61,5],[100,2],[100,4],[100,2],[100,4],[20,2],[20,2],[20,2],[20,1],[104,2],[104,2],[21,2],[21,2],[21,2],[106,2],[106,2],[108,2],[108,3],[112,1],[112,1],[112,1],[110,1],[110,3],[109,2],[109,2],[109,4],[109,4],[109,4],[109,6],[109,6],[22,5],[22,7],[22,4],[22,6],[117,1],[117,2],[119,3],[119,4],[121,3],[121,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,3]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1:return this.$ = new yy.Block; -break; -case 2:return this.$ = $$[$0]; -break; -case 3:return this.$ = $$[$0-1]; -break; -case 4:this.$ = yy.Block.wrap([$$[$0]]); -break; -case 5:this.$ = $$[$0-2].push($$[$0]); -break; -case 6:this.$ = $$[$0-1]; -break; -case 7:this.$ = $$[$0]; -break; -case 8:this.$ = $$[$0]; -break; -case 9:this.$ = $$[$0]; -break; -case 10:this.$ = $$[$0]; -break; -case 11:this.$ = new yy.Literal($$[$0]); -break; -case 12:this.$ = $$[$0]; -break; -case 13:this.$ = $$[$0]; -break; -case 14:this.$ = $$[$0]; -break; -case 15:this.$ = $$[$0]; -break; -case 16:this.$ = $$[$0]; -break; -case 17:this.$ = $$[$0]; -break; -case 18:this.$ = $$[$0]; -break; -case 19:this.$ = $$[$0]; -break; -case 20:this.$ = $$[$0]; -break; -case 21:this.$ = $$[$0]; -break; -case 22:this.$ = $$[$0]; -break; -case 23:this.$ = $$[$0]; -break; -case 24:this.$ = new yy.Block; -break; -case 25:this.$ = $$[$0-1]; -break; -case 26:this.$ = new yy.Literal($$[$0]); -break; -case 27:this.$ = new yy.Literal($$[$0]); -break; -case 28:this.$ = new yy.Literal($$[$0]); -break; -case 29:this.$ = $$[$0]; -break; -case 30:this.$ = new yy.Literal($$[$0]); -break; -case 31:this.$ = new yy.Literal($$[$0]); -break; -case 32:this.$ = new yy.Literal($$[$0]); -break; -case 33:this.$ = (function () { - var val; - val = new yy.Literal($$[$0]); - if ($$[$0] === 'undefined') val.isUndefined = true; - return val; - }()); -break; -case 34:this.$ = new yy.Assign($$[$0-2], $$[$0]); -break; -case 35:this.$ = new yy.Assign($$[$0-3], $$[$0]); -break; -case 36:this.$ = new yy.Assign($$[$0-4], $$[$0-1]); -break; -case 37:this.$ = new yy.Value($$[$0]); -break; -case 38:this.$ = new yy.Assign(new yy.Value($$[$0-2]), $$[$0], 'object'); -break; -case 39:this.$ = new yy.Assign(new yy.Value($$[$0-4]), $$[$0-1], 'object'); -break; -case 40:this.$ = $$[$0]; -break; -case 41:this.$ = $$[$0]; -break; -case 42:this.$ = $$[$0]; -break; -case 43:this.$ = $$[$0]; -break; -case 44:this.$ = new yy.Return($$[$0]); -break; -case 45:this.$ = new yy.Return; -break; -case 46:this.$ = new yy.Comment($$[$0]); -break; -case 47:this.$ = new yy.Code($$[$0-3], $$[$0], $$[$0-1]); -break; -case 48:this.$ = new yy.Code([], $$[$0], $$[$0-1]); -break; -case 49:this.$ = 'func'; -break; -case 50:this.$ = 'boundfunc'; -break; -case 51:this.$ = $$[$0]; -break; -case 52:this.$ = $$[$0]; -break; -case 53:this.$ = []; -break; -case 54:this.$ = [$$[$0]]; -break; -case 55:this.$ = $$[$0-2].concat($$[$0]); -break; -case 56:this.$ = new yy.Param($$[$0]); -break; -case 57:this.$ = new yy.Param($$[$0-1], null, true); -break; -case 58:this.$ = new yy.Param($$[$0-2], $$[$0]); -break; -case 59:this.$ = $$[$0]; -break; -case 60:this.$ = $$[$0]; -break; -case 61:this.$ = $$[$0]; -break; -case 62:this.$ = $$[$0]; -break; -case 63:this.$ = new yy.Splat($$[$0-1]); -break; -case 64:this.$ = new yy.Value($$[$0]); -break; -case 65:this.$ = $$[$0-1].add($$[$0]); -break; -case 66:this.$ = new yy.Value($$[$0-1], [].concat($$[$0])); -break; -case 67:this.$ = $$[$0]; -break; -case 68:this.$ = $$[$0]; -break; -case 69:this.$ = new yy.Value($$[$0]); -break; -case 70:this.$ = new yy.Value($$[$0]); -break; -case 71:this.$ = $$[$0]; -break; -case 72:this.$ = new yy.Value($$[$0]); -break; -case 73:this.$ = new yy.Value($$[$0]); -break; -case 74:this.$ = new yy.Value($$[$0]); -break; -case 75:this.$ = $$[$0]; -break; -case 76:this.$ = new yy.Access($$[$0]); -break; -case 77:this.$ = new yy.Access($$[$0], 'soak'); -break; -case 78:this.$ = [new yy.Access(new yy.Literal('prototype')), new yy.Access($$[$0])]; -break; -case 79:this.$ = new yy.Access(new yy.Literal('prototype')); -break; -case 80:this.$ = $$[$0]; -break; -case 81:this.$ = $$[$0-1]; -break; -case 82:this.$ = yy.extend($$[$0], { - soak: true - }); -break; -case 83:this.$ = new yy.Index($$[$0]); -break; -case 84:this.$ = new yy.Slice($$[$0]); -break; -case 85:this.$ = new yy.Obj($$[$0-2], $$[$0-3].generated); -break; -case 86:this.$ = []; -break; -case 87:this.$ = [$$[$0]]; -break; -case 88:this.$ = $$[$0-2].concat($$[$0]); -break; -case 89:this.$ = $$[$0-3].concat($$[$0]); -break; -case 90:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 91:this.$ = new yy.Class; -break; -case 92:this.$ = new yy.Class(null, null, $$[$0]); -break; -case 93:this.$ = new yy.Class(null, $$[$0]); -break; -case 94:this.$ = new yy.Class(null, $$[$0-1], $$[$0]); -break; -case 95:this.$ = new yy.Class($$[$0]); -break; -case 96:this.$ = new yy.Class($$[$0-1], null, $$[$0]); -break; -case 97:this.$ = new yy.Class($$[$0-2], $$[$0]); -break; -case 98:this.$ = new yy.Class($$[$0-3], $$[$0-1], $$[$0]); -break; -case 99:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); -break; -case 100:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); -break; -case 101:this.$ = new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]); -break; -case 102:this.$ = new yy.Call('super', $$[$0]); -break; -case 103:this.$ = false; -break; -case 104:this.$ = true; -break; -case 105:this.$ = []; -break; -case 106:this.$ = $$[$0-2]; -break; -case 107:this.$ = new yy.Value(new yy.Literal('this')); -break; -case 108:this.$ = new yy.Value(new yy.Literal('this')); -break; -case 109:this.$ = new yy.Value(new yy.Literal('this'), [new yy.Access($$[$0])], 'this'); -break; -case 110:this.$ = new yy.Arr([]); -break; -case 111:this.$ = new yy.Arr($$[$0-2]); -break; -case 112:this.$ = 'inclusive'; -break; -case 113:this.$ = 'exclusive'; -break; -case 114:this.$ = new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]); -break; -case 115:this.$ = new yy.Range($$[$0-2], $$[$0], $$[$0-1]); -break; -case 116:this.$ = new yy.Range($$[$0-1], null, $$[$0]); -break; -case 117:this.$ = new yy.Range(null, $$[$0], $$[$0-1]); -break; -case 118:this.$ = [$$[$0]]; -break; -case 119:this.$ = $$[$0-2].concat($$[$0]); -break; -case 120:this.$ = $$[$0-3].concat($$[$0]); -break; -case 121:this.$ = $$[$0-2]; -break; -case 122:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 123:this.$ = $$[$0]; -break; -case 124:this.$ = $$[$0]; -break; -case 125:this.$ = $$[$0]; -break; -case 126:this.$ = [].concat($$[$0-2], $$[$0]); -break; -case 127:this.$ = new yy.Try($$[$0]); -break; -case 128:this.$ = new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]); -break; -case 129:this.$ = new yy.Try($$[$0-2], null, null, $$[$0]); -break; -case 130:this.$ = new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]); -break; -case 131:this.$ = [$$[$0-1], $$[$0]]; -break; -case 132:this.$ = new yy.Throw($$[$0]); -break; -case 133:this.$ = new yy.Parens($$[$0-1]); -break; -case 134:this.$ = new yy.Parens($$[$0-2]); -break; -case 135:this.$ = new yy.While($$[$0]); -break; -case 136:this.$ = new yy.While($$[$0-2], { - guard: $$[$0] - }); -break; -case 137:this.$ = new yy.While($$[$0], { - invert: true - }); -break; -case 138:this.$ = new yy.While($$[$0-2], { - invert: true, - guard: $$[$0] - }); -break; -case 139:this.$ = $$[$0-1].addBody($$[$0]); -break; -case 140:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); -break; -case 141:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); -break; -case 142:this.$ = $$[$0]; -break; -case 143:this.$ = new yy.While(new yy.Literal('true')).addBody($$[$0]); -break; -case 144:this.$ = new yy.While(new yy.Literal('true')).addBody(yy.Block.wrap([$$[$0]])); -break; -case 145:this.$ = new yy.For($$[$0-1], $$[$0]); -break; -case 146:this.$ = new yy.For($$[$0-1], $$[$0]); -break; -case 147:this.$ = new yy.For($$[$0], $$[$0-1]); -break; -case 148:this.$ = { - source: new yy.Value($$[$0]) - }; -break; -case 149:this.$ = (function () { - $$[$0].own = $$[$0-1].own; - $$[$0].name = $$[$0-1][0]; - $$[$0].index = $$[$0-1][1]; - return $$[$0]; - }()); -break; -case 150:this.$ = $$[$0]; -break; -case 151:this.$ = (function () { - $$[$0].own = true; - return $$[$0]; - }()); -break; -case 152:this.$ = $$[$0]; -break; -case 153:this.$ = new yy.Value($$[$0]); -break; -case 154:this.$ = new yy.Value($$[$0]); -break; -case 155:this.$ = [$$[$0]]; -break; -case 156:this.$ = [$$[$0-2], $$[$0]]; -break; -case 157:this.$ = { - source: $$[$0] - }; -break; -case 158:this.$ = { - source: $$[$0], - object: true - }; -break; -case 159:this.$ = { - source: $$[$0-2], - guard: $$[$0] - }; -break; -case 160:this.$ = { - source: $$[$0-2], - guard: $$[$0], - object: true - }; -break; -case 161:this.$ = { - source: $$[$0-2], - step: $$[$0] - }; -break; -case 162:this.$ = { - source: $$[$0-4], - guard: $$[$0-2], - step: $$[$0] - }; -break; -case 163:this.$ = { - source: $$[$0-4], - step: $$[$0-2], - guard: $$[$0] - }; -break; -case 164:this.$ = new yy.Switch($$[$0-3], $$[$0-1]); -break; -case 165:this.$ = new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]); -break; -case 166:this.$ = new yy.Switch(null, $$[$0-1]); -break; -case 167:this.$ = new yy.Switch(null, $$[$0-3], $$[$0-1]); -break; -case 168:this.$ = $$[$0]; -break; -case 169:this.$ = $$[$0-1].concat($$[$0]); -break; -case 170:this.$ = [[$$[$0-1], $$[$0]]]; -break; -case 171:this.$ = [[$$[$0-2], $$[$0-1]]]; -break; -case 172:this.$ = new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - }); -break; -case 173:this.$ = $$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - })); -break; -case 174:this.$ = $$[$0]; -break; -case 175:this.$ = $$[$0-2].addElse($$[$0]); -break; -case 176:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { - type: $$[$0-1], - statement: true - }); -break; -case 177:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { - type: $$[$0-1], - statement: true - }); -break; -case 178:this.$ = new yy.Op($$[$0-1], $$[$0]); -break; -case 179:this.$ = new yy.Op('-', $$[$0]); -break; -case 180:this.$ = new yy.Op('+', $$[$0]); -break; -case 181:this.$ = new yy.Op('--', $$[$0]); -break; -case 182:this.$ = new yy.Op('++', $$[$0]); -break; -case 183:this.$ = new yy.Op('--', $$[$0-1], null, true); -break; -case 184:this.$ = new yy.Op('++', $$[$0-1], null, true); -break; -case 185:this.$ = new yy.Existence($$[$0-1]); -break; -case 186:this.$ = new yy.Op('+', $$[$0-2], $$[$0]); -break; -case 187:this.$ = new yy.Op('-', $$[$0-2], $$[$0]); -break; -case 188:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 189:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 190:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 191:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 192:this.$ = (function () { - if ($$[$0-1].charAt(0) === '!') { - return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); - } else { - return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); - } - }()); -break; -case 193:this.$ = new yy.Assign($$[$0-2], $$[$0], $$[$0-1]); -break; -case 194:this.$ = new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]); -break; -case 195:this.$ = new yy.Extends($$[$0-2], $$[$0]); -break; -} -}, -table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[3]},{1:[2,2],6:[1,72]},{6:[1,73]},{1:[2,4],6:[2,4],26:[2,4],99:[2,4]},{4:75,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,74],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,7],6:[2,7],26:[2,7],99:[2,7],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,8],6:[2,8],26:[2,8],99:[2,8],100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],47:[2,12],52:[2,12],55:[2,12],60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,12],71:[1,98],75:[2,12],78:90,81:[1,92],82:[2,103],83:[2,12],88:[2,12],90:[2,12],99:[2,12],101:[2,12],102:[2,12],103:[2,12],107:[2,12],115:[2,12],123:[2,12],125:[2,12],126:[2,12],129:[2,12],130:[2,12],131:[2,12],132:[2,12],133:[2,12],134:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],47:[2,13],52:[2,13],55:[2,13],60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,13],71:[1,98],75:[2,13],78:99,81:[1,92],82:[2,103],83:[2,13],88:[2,13],90:[2,13],99:[2,13],101:[2,13],102:[2,13],103:[2,13],107:[2,13],115:[2,13],123:[2,13],125:[2,13],126:[2,13],129:[2,13],130:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],47:[2,14],52:[2,14],55:[2,14],70:[2,14],75:[2,14],83:[2,14],88:[2,14],90:[2,14],99:[2,14],101:[2,14],102:[2,14],103:[2,14],107:[2,14],115:[2,14],123:[2,14],125:[2,14],126:[2,14],129:[2,14],130:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],47:[2,15],52:[2,15],55:[2,15],70:[2,15],75:[2,15],83:[2,15],88:[2,15],90:[2,15],99:[2,15],101:[2,15],102:[2,15],103:[2,15],107:[2,15],115:[2,15],123:[2,15],125:[2,15],126:[2,15],129:[2,15],130:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],47:[2,16],52:[2,16],55:[2,16],70:[2,16],75:[2,16],83:[2,16],88:[2,16],90:[2,16],99:[2,16],101:[2,16],102:[2,16],103:[2,16],107:[2,16],115:[2,16],123:[2,16],125:[2,16],126:[2,16],129:[2,16],130:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],47:[2,17],52:[2,17],55:[2,17],70:[2,17],75:[2,17],83:[2,17],88:[2,17],90:[2,17],99:[2,17],101:[2,17],102:[2,17],103:[2,17],107:[2,17],115:[2,17],123:[2,17],125:[2,17],126:[2,17],129:[2,17],130:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],47:[2,18],52:[2,18],55:[2,18],70:[2,18],75:[2,18],83:[2,18],88:[2,18],90:[2,18],99:[2,18],101:[2,18],102:[2,18],103:[2,18],107:[2,18],115:[2,18],123:[2,18],125:[2,18],126:[2,18],129:[2,18],130:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],47:[2,19],52:[2,19],55:[2,19],70:[2,19],75:[2,19],83:[2,19],88:[2,19],90:[2,19],99:[2,19],101:[2,19],102:[2,19],103:[2,19],107:[2,19],115:[2,19],123:[2,19],125:[2,19],126:[2,19],129:[2,19],130:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],47:[2,20],52:[2,20],55:[2,20],70:[2,20],75:[2,20],83:[2,20],88:[2,20],90:[2,20],99:[2,20],101:[2,20],102:[2,20],103:[2,20],107:[2,20],115:[2,20],123:[2,20],125:[2,20],126:[2,20],129:[2,20],130:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],47:[2,21],52:[2,21],55:[2,21],70:[2,21],75:[2,21],83:[2,21],88:[2,21],90:[2,21],99:[2,21],101:[2,21],102:[2,21],103:[2,21],107:[2,21],115:[2,21],123:[2,21],125:[2,21],126:[2,21],129:[2,21],130:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],47:[2,22],52:[2,22],55:[2,22],70:[2,22],75:[2,22],83:[2,22],88:[2,22],90:[2,22],99:[2,22],101:[2,22],102:[2,22],103:[2,22],107:[2,22],115:[2,22],123:[2,22],125:[2,22],126:[2,22],129:[2,22],130:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],47:[2,23],52:[2,23],55:[2,23],70:[2,23],75:[2,23],83:[2,23],88:[2,23],90:[2,23],99:[2,23],101:[2,23],102:[2,23],103:[2,23],107:[2,23],115:[2,23],123:[2,23],125:[2,23],126:[2,23],129:[2,23],130:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23]},{1:[2,9],6:[2,9],26:[2,9],99:[2,9],101:[2,9],103:[2,9],107:[2,9],123:[2,9]},{1:[2,10],6:[2,10],26:[2,10],99:[2,10],101:[2,10],103:[2,10],107:[2,10],123:[2,10]},{1:[2,11],6:[2,11],26:[2,11],99:[2,11],101:[2,11],103:[2,11],107:[2,11],123:[2,11]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],38:[1,101],47:[2,71],52:[2,71],55:[2,71],64:[2,71],65:[2,71],66:[2,71],68:[2,71],70:[2,71],71:[2,71],75:[2,71],81:[2,71],82:[2,71],83:[2,71],88:[2,71],90:[2,71],99:[2,71],101:[2,71],102:[2,71],103:[2,71],107:[2,71],115:[2,71],123:[2,71],125:[2,71],126:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],47:[2,72],52:[2,72],55:[2,72],64:[2,72],65:[2,72],66:[2,72],68:[2,72],70:[2,72],71:[2,72],75:[2,72],81:[2,72],82:[2,72],83:[2,72],88:[2,72],90:[2,72],99:[2,72],101:[2,72],102:[2,72],103:[2,72],107:[2,72],115:[2,72],123:[2,72],125:[2,72],126:[2,72],129:[2,72],130:[2,72],131:[2,72],132:[2,72],133:[2,72],134:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],47:[2,73],52:[2,73],55:[2,73],64:[2,73],65:[2,73],66:[2,73],68:[2,73],70:[2,73],71:[2,73],75:[2,73],81:[2,73],82:[2,73],83:[2,73],88:[2,73],90:[2,73],99:[2,73],101:[2,73],102:[2,73],103:[2,73],107:[2,73],115:[2,73],123:[2,73],125:[2,73],126:[2,73],129:[2,73],130:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],47:[2,74],52:[2,74],55:[2,74],64:[2,74],65:[2,74],66:[2,74],68:[2,74],70:[2,74],71:[2,74],75:[2,74],81:[2,74],82:[2,74],83:[2,74],88:[2,74],90:[2,74],99:[2,74],101:[2,74],102:[2,74],103:[2,74],107:[2,74],115:[2,74],123:[2,74],125:[2,74],126:[2,74],129:[2,74],130:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],47:[2,75],52:[2,75],55:[2,75],64:[2,75],65:[2,75],66:[2,75],68:[2,75],70:[2,75],71:[2,75],75:[2,75],81:[2,75],82:[2,75],83:[2,75],88:[2,75],90:[2,75],99:[2,75],101:[2,75],102:[2,75],103:[2,75],107:[2,75],115:[2,75],123:[2,75],125:[2,75],126:[2,75],129:[2,75],130:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],47:[2,101],52:[2,101],55:[2,101],64:[2,101],65:[2,101],66:[2,101],68:[2,101],70:[2,101],71:[2,101],75:[2,101],79:102,81:[2,101],82:[1,103],83:[2,101],88:[2,101],90:[2,101],99:[2,101],101:[2,101],102:[2,101],103:[2,101],107:[2,101],115:[2,101],123:[2,101],125:[2,101],126:[2,101],129:[2,101],130:[2,101],131:[2,101],132:[2,101],133:[2,101],134:[2,101]},{27:107,28:[1,71],42:108,46:104,47:[2,53],52:[2,53],53:105,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{5:113,25:[1,5]},{8:114,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:116,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:117,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:118,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:122,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],38:[2,68],47:[2,68],52:[2,68],55:[2,68],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,68],71:[2,68],75:[2,68],77:[1,126],81:[2,68],82:[2,68],83:[2,68],88:[2,68],90:[2,68],99:[2,68],101:[2,68],102:[2,68],103:[2,68],107:[2,68],115:[2,68],123:[2,68],125:[2,68],126:[2,68],127:[1,123],128:[1,124],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[1,125]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],47:[2,174],52:[2,174],55:[2,174],70:[2,174],75:[2,174],83:[2,174],88:[2,174],90:[2,174],99:[2,174],101:[2,174],102:[2,174],103:[2,174],107:[2,174],115:[2,174],118:[1,127],123:[2,174],125:[2,174],126:[2,174],129:[2,174],130:[2,174],131:[2,174],132:[2,174],133:[2,174],134:[2,174]},{5:128,25:[1,5]},{5:129,25:[1,5]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],47:[2,142],52:[2,142],55:[2,142],70:[2,142],75:[2,142],83:[2,142],88:[2,142],90:[2,142],99:[2,142],101:[2,142],102:[2,142],103:[2,142],107:[2,142],115:[2,142],123:[2,142],125:[2,142],126:[2,142],129:[2,142],130:[2,142],131:[2,142],132:[2,142],133:[2,142],134:[2,142]},{5:130,25:[1,5]},{8:131,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,132],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,91],5:133,6:[2,91],13:119,14:120,25:[1,5],26:[2,91],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,47:[2,91],52:[2,91],55:[2,91],56:47,57:48,59:135,61:25,62:26,63:27,70:[2,91],73:[1,68],75:[2,91],77:[1,134],80:[1,28],83:[2,91],85:[1,56],86:[1,57],87:[1,55],88:[2,91],90:[2,91],98:[1,54],99:[2,91],101:[2,91],102:[2,91],103:[2,91],107:[2,91],115:[2,91],123:[2,91],125:[2,91],126:[2,91],129:[2,91],130:[2,91],131:[2,91],132:[2,91],133:[2,91],134:[2,91]},{8:136,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,45],6:[2,45],8:137,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,45],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,45],100:39,101:[2,45],103:[2,45],104:40,105:[1,65],106:41,107:[2,45],108:67,116:[1,42],121:37,122:[1,62],123:[2,45],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,46],6:[2,46],25:[2,46],26:[2,46],52:[2,46],75:[2,46],99:[2,46],101:[2,46],103:[2,46],107:[2,46],123:[2,46]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],38:[2,69],47:[2,69],52:[2,69],55:[2,69],64:[2,69],65:[2,69],66:[2,69],68:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],38:[2,70],47:[2,70],52:[2,70],55:[2,70],64:[2,70],65:[2,70],66:[2,70],68:[2,70],70:[2,70],71:[2,70],75:[2,70],81:[2,70],82:[2,70],83:[2,70],88:[2,70],90:[2,70],99:[2,70],101:[2,70],102:[2,70],103:[2,70],107:[2,70],115:[2,70],123:[2,70],125:[2,70],126:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],47:[2,29],52:[2,29],55:[2,29],64:[2,29],65:[2,29],66:[2,29],68:[2,29],70:[2,29],71:[2,29],75:[2,29],81:[2,29],82:[2,29],83:[2,29],88:[2,29],90:[2,29],99:[2,29],101:[2,29],102:[2,29],103:[2,29],107:[2,29],115:[2,29],123:[2,29],125:[2,29],126:[2,29],129:[2,29],130:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],47:[2,30],52:[2,30],55:[2,30],64:[2,30],65:[2,30],66:[2,30],68:[2,30],70:[2,30],71:[2,30],75:[2,30],81:[2,30],82:[2,30],83:[2,30],88:[2,30],90:[2,30],99:[2,30],101:[2,30],102:[2,30],103:[2,30],107:[2,30],115:[2,30],123:[2,30],125:[2,30],126:[2,30],129:[2,30],130:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],47:[2,31],52:[2,31],55:[2,31],64:[2,31],65:[2,31],66:[2,31],68:[2,31],70:[2,31],71:[2,31],75:[2,31],81:[2,31],82:[2,31],83:[2,31],88:[2,31],90:[2,31],99:[2,31],101:[2,31],102:[2,31],103:[2,31],107:[2,31],115:[2,31],123:[2,31],125:[2,31],126:[2,31],129:[2,31],130:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],47:[2,32],52:[2,32],55:[2,32],64:[2,32],65:[2,32],66:[2,32],68:[2,32],70:[2,32],71:[2,32],75:[2,32],81:[2,32],82:[2,32],83:[2,32],88:[2,32],90:[2,32],99:[2,32],101:[2,32],102:[2,32],103:[2,32],107:[2,32],115:[2,32],123:[2,32],125:[2,32],126:[2,32],129:[2,32],130:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],47:[2,33],52:[2,33],55:[2,33],64:[2,33],65:[2,33],66:[2,33],68:[2,33],70:[2,33],71:[2,33],75:[2,33],81:[2,33],82:[2,33],83:[2,33],88:[2,33],90:[2,33],99:[2,33],101:[2,33],102:[2,33],103:[2,33],107:[2,33],115:[2,33],123:[2,33],125:[2,33],126:[2,33],129:[2,33],130:[2,33],131:[2,33],132:[2,33],133:[2,33],134:[2,33]},{4:138,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,139],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:140,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],47:[2,107],52:[2,107],55:[2,107],64:[2,107],65:[2,107],66:[2,107],68:[2,107],70:[2,107],71:[2,107],75:[2,107],81:[2,107],82:[2,107],83:[2,107],88:[2,107],90:[2,107],99:[2,107],101:[2,107],102:[2,107],103:[2,107],107:[2,107],115:[2,107],123:[2,107],125:[2,107],126:[2,107],129:[2,107],130:[2,107],131:[2,107],132:[2,107],133:[2,107],134:[2,107]},{1:[2,108],6:[2,108],25:[2,108],26:[2,108],27:146,28:[1,71],47:[2,108],52:[2,108],55:[2,108],64:[2,108],65:[2,108],66:[2,108],68:[2,108],70:[2,108],71:[2,108],75:[2,108],81:[2,108],82:[2,108],83:[2,108],88:[2,108],90:[2,108],99:[2,108],101:[2,108],102:[2,108],103:[2,108],107:[2,108],115:[2,108],123:[2,108],125:[2,108],126:[2,108],129:[2,108],130:[2,108],131:[2,108],132:[2,108],133:[2,108],134:[2,108]},{25:[2,49]},{25:[2,50]},{1:[2,64],6:[2,64],25:[2,64],26:[2,64],38:[2,64],47:[2,64],52:[2,64],55:[2,64],64:[2,64],65:[2,64],66:[2,64],68:[2,64],70:[2,64],71:[2,64],75:[2,64],77:[2,64],81:[2,64],82:[2,64],83:[2,64],88:[2,64],90:[2,64],99:[2,64],101:[2,64],102:[2,64],103:[2,64],107:[2,64],115:[2,64],123:[2,64],125:[2,64],126:[2,64],127:[2,64],128:[2,64],129:[2,64],130:[2,64],131:[2,64],132:[2,64],133:[2,64],134:[2,64],135:[2,64]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],38:[2,67],47:[2,67],52:[2,67],55:[2,67],64:[2,67],65:[2,67],66:[2,67],68:[2,67],70:[2,67],71:[2,67],75:[2,67],77:[2,67],81:[2,67],82:[2,67],83:[2,67],88:[2,67],90:[2,67],99:[2,67],101:[2,67],102:[2,67],103:[2,67],107:[2,67],115:[2,67],123:[2,67],125:[2,67],126:[2,67],127:[2,67],128:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67],135:[2,67]},{8:147,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:148,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:149,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:150,8:151,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{27:156,28:[1,71],56:157,57:158,62:152,73:[1,68],87:[1,55],110:153,111:[1,154],112:155},{109:159,113:[1,160],114:[1,161]},{6:[2,86],11:165,25:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:162,75:[2,86],86:[1,111]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],41:[2,27],47:[2,27],52:[2,27],55:[2,27],64:[2,27],65:[2,27],66:[2,27],68:[2,27],70:[2,27],71:[2,27],75:[2,27],81:[2,27],82:[2,27],83:[2,27],88:[2,27],90:[2,27],99:[2,27],101:[2,27],102:[2,27],103:[2,27],107:[2,27],115:[2,27],123:[2,27],125:[2,27],126:[2,27],129:[2,27],130:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],41:[2,28],47:[2,28],52:[2,28],55:[2,28],64:[2,28],65:[2,28],66:[2,28],68:[2,28],70:[2,28],71:[2,28],75:[2,28],81:[2,28],82:[2,28],83:[2,28],88:[2,28],90:[2,28],99:[2,28],101:[2,28],102:[2,28],103:[2,28],107:[2,28],115:[2,28],123:[2,28],125:[2,28],126:[2,28],129:[2,28],130:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],38:[2,26],41:[2,26],47:[2,26],52:[2,26],55:[2,26],64:[2,26],65:[2,26],66:[2,26],68:[2,26],70:[2,26],71:[2,26],75:[2,26],77:[2,26],81:[2,26],82:[2,26],83:[2,26],88:[2,26],90:[2,26],99:[2,26],101:[2,26],102:[2,26],103:[2,26],107:[2,26],113:[2,26],114:[2,26],115:[2,26],123:[2,26],125:[2,26],126:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26]},{1:[2,6],6:[2,6],7:169,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,6],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],47:[2,24],52:[2,24],55:[2,24],70:[2,24],75:[2,24],83:[2,24],88:[2,24],90:[2,24],95:[2,24],96:[2,24],99:[2,24],101:[2,24],102:[2,24],103:[2,24],107:[2,24],115:[2,24],118:[2,24],120:[2,24],123:[2,24],125:[2,24],126:[2,24],129:[2,24],130:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24]},{6:[1,72],26:[1,170]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],47:[2,185],52:[2,185],55:[2,185],70:[2,185],75:[2,185],83:[2,185],88:[2,185],90:[2,185],99:[2,185],101:[2,185],102:[2,185],103:[2,185],107:[2,185],115:[2,185],123:[2,185],125:[2,185],126:[2,185],129:[2,185],130:[2,185],131:[2,185],132:[2,185],133:[2,185],134:[2,185]},{8:171,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:172,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:173,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:174,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:175,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:176,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:177,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:178,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],47:[2,141],52:[2,141],55:[2,141],70:[2,141],75:[2,141],83:[2,141],88:[2,141],90:[2,141],99:[2,141],101:[2,141],102:[2,141],103:[2,141],107:[2,141],115:[2,141],123:[2,141],125:[2,141],126:[2,141],129:[2,141],130:[2,141],131:[2,141],132:[2,141],133:[2,141],134:[2,141]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],47:[2,146],52:[2,146],55:[2,146],70:[2,146],75:[2,146],83:[2,146],88:[2,146],90:[2,146],99:[2,146],101:[2,146],102:[2,146],103:[2,146],107:[2,146],115:[2,146],123:[2,146],125:[2,146],126:[2,146],129:[2,146],130:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146]},{8:179,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],47:[2,140],52:[2,140],55:[2,140],70:[2,140],75:[2,140],83:[2,140],88:[2,140],90:[2,140],99:[2,140],101:[2,140],102:[2,140],103:[2,140],107:[2,140],115:[2,140],123:[2,140],125:[2,140],126:[2,140],129:[2,140],130:[2,140],131:[2,140],132:[2,140],133:[2,140],134:[2,140]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],47:[2,145],52:[2,145],55:[2,145],70:[2,145],75:[2,145],83:[2,145],88:[2,145],90:[2,145],99:[2,145],101:[2,145],102:[2,145],103:[2,145],107:[2,145],115:[2,145],123:[2,145],125:[2,145],126:[2,145],129:[2,145],130:[2,145],131:[2,145],132:[2,145],133:[2,145],134:[2,145]},{79:180,82:[1,103]},{1:[2,65],6:[2,65],25:[2,65],26:[2,65],38:[2,65],47:[2,65],52:[2,65],55:[2,65],64:[2,65],65:[2,65],66:[2,65],68:[2,65],70:[2,65],71:[2,65],75:[2,65],77:[2,65],81:[2,65],82:[2,65],83:[2,65],88:[2,65],90:[2,65],99:[2,65],101:[2,65],102:[2,65],103:[2,65],107:[2,65],115:[2,65],123:[2,65],125:[2,65],126:[2,65],127:[2,65],128:[2,65],129:[2,65],130:[2,65],131:[2,65],132:[2,65],133:[2,65],134:[2,65],135:[2,65]},{82:[2,104]},{27:181,28:[1,71]},{27:182,28:[1,71]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],27:183,28:[1,71],38:[2,79],47:[2,79],52:[2,79],55:[2,79],64:[2,79],65:[2,79],66:[2,79],68:[2,79],70:[2,79],71:[2,79],75:[2,79],77:[2,79],81:[2,79],82:[2,79],83:[2,79],88:[2,79],90:[2,79],99:[2,79],101:[2,79],102:[2,79],103:[2,79],107:[2,79],115:[2,79],123:[2,79],125:[2,79],126:[2,79],127:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],38:[2,80],47:[2,80],52:[2,80],55:[2,80],64:[2,80],65:[2,80],66:[2,80],68:[2,80],70:[2,80],71:[2,80],75:[2,80],77:[2,80],81:[2,80],82:[2,80],83:[2,80],88:[2,80],90:[2,80],99:[2,80],101:[2,80],102:[2,80],103:[2,80],107:[2,80],115:[2,80],123:[2,80],125:[2,80],126:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80]},{8:185,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],55:[1,189],56:47,57:48,59:36,61:25,62:26,63:27,69:184,72:186,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],89:187,90:[1,188],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{67:190,68:[1,97],71:[1,98]},{79:191,82:[1,103]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],38:[2,66],47:[2,66],52:[2,66],55:[2,66],64:[2,66],65:[2,66],66:[2,66],68:[2,66],70:[2,66],71:[2,66],75:[2,66],77:[2,66],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],127:[2,66],128:[2,66],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66],135:[2,66]},{6:[1,193],8:192,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,194],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],47:[2,102],52:[2,102],55:[2,102],64:[2,102],65:[2,102],66:[2,102],68:[2,102],70:[2,102],71:[2,102],75:[2,102],81:[2,102],82:[2,102],83:[2,102],88:[2,102],90:[2,102],99:[2,102],101:[2,102],102:[2,102],103:[2,102],107:[2,102],115:[2,102],123:[2,102],125:[2,102],126:[2,102],129:[2,102],130:[2,102],131:[2,102],132:[2,102],133:[2,102],134:[2,102]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[1,195],84:196,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{47:[1,198],52:[1,199]},{47:[2,54],52:[2,54]},{38:[1,201],47:[2,56],52:[2,56],55:[1,200]},{38:[2,59],47:[2,59],52:[2,59],55:[2,59]},{38:[2,60],47:[2,60],52:[2,60],55:[2,60]},{38:[2,61],47:[2,61],52:[2,61],55:[2,61]},{38:[2,62],47:[2,62],52:[2,62],55:[2,62]},{27:146,28:[1,71]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],47:[2,48],52:[2,48],55:[2,48],70:[2,48],75:[2,48],83:[2,48],88:[2,48],90:[2,48],99:[2,48],101:[2,48],102:[2,48],103:[2,48],107:[2,48],115:[2,48],123:[2,48],125:[2,48],126:[2,48],129:[2,48],130:[2,48],131:[2,48],132:[2,48],133:[2,48],134:[2,48]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],47:[2,178],52:[2,178],55:[2,178],70:[2,178],75:[2,178],83:[2,178],88:[2,178],90:[2,178],99:[2,178],100:85,101:[2,178],102:[2,178],103:[2,178],106:86,107:[2,178],108:67,115:[2,178],123:[2,178],125:[2,178],126:[2,178],129:[1,76],130:[2,178],131:[2,178],132:[2,178],133:[2,178],134:[2,178]},{100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],47:[2,179],52:[2,179],55:[2,179],70:[2,179],75:[2,179],83:[2,179],88:[2,179],90:[2,179],99:[2,179],100:85,101:[2,179],102:[2,179],103:[2,179],106:86,107:[2,179],108:67,115:[2,179],123:[2,179],125:[2,179],126:[2,179],129:[1,76],130:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],47:[2,180],52:[2,180],55:[2,180],70:[2,180],75:[2,180],83:[2,180],88:[2,180],90:[2,180],99:[2,180],100:85,101:[2,180],102:[2,180],103:[2,180],106:86,107:[2,180],108:67,115:[2,180],123:[2,180],125:[2,180],126:[2,180],129:[1,76],130:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],47:[2,181],52:[2,181],55:[2,181],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,181],71:[2,68],75:[2,181],81:[2,68],82:[2,68],83:[2,181],88:[2,181],90:[2,181],99:[2,181],101:[2,181],102:[2,181],103:[2,181],107:[2,181],115:[2,181],123:[2,181],125:[2,181],126:[2,181],129:[2,181],130:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181]},{60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:90,81:[1,92],82:[2,103]},{60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:99,81:[1,92],82:[2,103]},{64:[2,71],65:[2,71],66:[2,71],68:[2,71],71:[2,71],81:[2,71],82:[2,71]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],47:[2,182],52:[2,182],55:[2,182],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,182],71:[2,68],75:[2,182],81:[2,68],82:[2,68],83:[2,182],88:[2,182],90:[2,182],99:[2,182],101:[2,182],102:[2,182],103:[2,182],107:[2,182],115:[2,182],123:[2,182],125:[2,182],126:[2,182],129:[2,182],130:[2,182],131:[2,182],132:[2,182],133:[2,182],134:[2,182]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],47:[2,183],52:[2,183],55:[2,183],70:[2,183],75:[2,183],83:[2,183],88:[2,183],90:[2,183],99:[2,183],101:[2,183],102:[2,183],103:[2,183],107:[2,183],115:[2,183],123:[2,183],125:[2,183],126:[2,183],129:[2,183],130:[2,183],131:[2,183],132:[2,183],133:[2,183],134:[2,183]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],47:[2,184],52:[2,184],55:[2,184],70:[2,184],75:[2,184],83:[2,184],88:[2,184],90:[2,184],99:[2,184],101:[2,184],102:[2,184],103:[2,184],107:[2,184],115:[2,184],123:[2,184],125:[2,184],126:[2,184],129:[2,184],130:[2,184],131:[2,184],132:[2,184],133:[2,184],134:[2,184]},{8:202,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,203],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:204,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:205,25:[1,5],122:[1,206]},{1:[2,127],6:[2,127],25:[2,127],26:[2,127],47:[2,127],52:[2,127],55:[2,127],70:[2,127],75:[2,127],83:[2,127],88:[2,127],90:[2,127],94:207,95:[1,208],96:[1,209],99:[2,127],101:[2,127],102:[2,127],103:[2,127],107:[2,127],115:[2,127],123:[2,127],125:[2,127],126:[2,127],129:[2,127],130:[2,127],131:[2,127],132:[2,127],133:[2,127],134:[2,127]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],47:[2,139],52:[2,139],55:[2,139],70:[2,139],75:[2,139],83:[2,139],88:[2,139],90:[2,139],99:[2,139],101:[2,139],102:[2,139],103:[2,139],107:[2,139],115:[2,139],123:[2,139],125:[2,139],126:[2,139],129:[2,139],130:[2,139],131:[2,139],132:[2,139],133:[2,139],134:[2,139]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],47:[2,147],52:[2,147],55:[2,147],70:[2,147],75:[2,147],83:[2,147],88:[2,147],90:[2,147],99:[2,147],101:[2,147],102:[2,147],103:[2,147],107:[2,147],115:[2,147],123:[2,147],125:[2,147],126:[2,147],129:[2,147],130:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147]},{25:[1,210],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{117:211,119:212,120:[1,213]},{1:[2,92],6:[2,92],25:[2,92],26:[2,92],47:[2,92],52:[2,92],55:[2,92],70:[2,92],75:[2,92],83:[2,92],88:[2,92],90:[2,92],99:[2,92],101:[2,92],102:[2,92],103:[2,92],107:[2,92],115:[2,92],123:[2,92],125:[2,92],126:[2,92],129:[2,92],130:[2,92],131:[2,92],132:[2,92],133:[2,92],134:[2,92]},{8:214,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,95],5:215,6:[2,95],25:[1,5],26:[2,95],47:[2,95],52:[2,95],55:[2,95],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,95],71:[2,68],75:[2,95],77:[1,216],81:[2,68],82:[2,68],83:[2,95],88:[2,95],90:[2,95],99:[2,95],101:[2,95],102:[2,95],103:[2,95],107:[2,95],115:[2,95],123:[2,95],125:[2,95],126:[2,95],129:[2,95],130:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],47:[2,132],52:[2,132],55:[2,132],70:[2,132],75:[2,132],83:[2,132],88:[2,132],90:[2,132],99:[2,132],100:85,101:[2,132],102:[2,132],103:[2,132],106:86,107:[2,132],108:67,115:[2,132],123:[2,132],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,44],6:[2,44],26:[2,44],99:[2,44],100:85,101:[2,44],103:[2,44],106:86,107:[2,44],108:67,123:[2,44],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,72],99:[1,217]},{4:218,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,123],25:[2,123],52:[2,123],55:[1,220],88:[2,123],89:219,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],38:[2,110],47:[2,110],52:[2,110],55:[2,110],64:[2,110],65:[2,110],66:[2,110],68:[2,110],70:[2,110],71:[2,110],75:[2,110],81:[2,110],82:[2,110],83:[2,110],88:[2,110],90:[2,110],99:[2,110],101:[2,110],102:[2,110],103:[2,110],107:[2,110],113:[2,110],114:[2,110],115:[2,110],123:[2,110],125:[2,110],126:[2,110],129:[2,110],130:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110]},{6:[2,51],25:[2,51],51:221,52:[1,222],88:[2,51]},{6:[2,118],25:[2,118],26:[2,118],52:[2,118],83:[2,118],88:[2,118]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:223,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,124],25:[2,124],26:[2,124],52:[2,124],83:[2,124],88:[2,124]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],38:[2,109],41:[2,109],47:[2,109],52:[2,109],55:[2,109],64:[2,109],65:[2,109],66:[2,109],68:[2,109],70:[2,109],71:[2,109],75:[2,109],77:[2,109],81:[2,109],82:[2,109],83:[2,109],88:[2,109],90:[2,109],99:[2,109],101:[2,109],102:[2,109],103:[2,109],107:[2,109],115:[2,109],123:[2,109],125:[2,109],126:[2,109],127:[2,109],128:[2,109],129:[2,109],130:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109]},{5:224,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],47:[2,135],52:[2,135],55:[2,135],70:[2,135],75:[2,135],83:[2,135],88:[2,135],90:[2,135],99:[2,135],100:85,101:[1,63],102:[1,225],103:[1,64],106:86,107:[1,66],108:67,115:[2,135],123:[2,135],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],47:[2,137],52:[2,137],55:[2,137],70:[2,137],75:[2,137],83:[2,137],88:[2,137],90:[2,137],99:[2,137],100:85,101:[1,63],102:[1,226],103:[1,64],106:86,107:[1,66],108:67,115:[2,137],123:[2,137],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],47:[2,143],52:[2,143],55:[2,143],70:[2,143],75:[2,143],83:[2,143],88:[2,143],90:[2,143],99:[2,143],101:[2,143],102:[2,143],103:[2,143],107:[2,143],115:[2,143],123:[2,143],125:[2,143],126:[2,143],129:[2,143],130:[2,143],131:[2,143],132:[2,143],133:[2,143],134:[2,143]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],47:[2,144],52:[2,144],55:[2,144],70:[2,144],75:[2,144],83:[2,144],88:[2,144],90:[2,144],99:[2,144],100:85,101:[1,63],102:[2,144],103:[1,64],106:86,107:[1,66],108:67,115:[2,144],123:[2,144],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],47:[2,148],52:[2,148],55:[2,148],70:[2,148],75:[2,148],83:[2,148],88:[2,148],90:[2,148],99:[2,148],101:[2,148],102:[2,148],103:[2,148],107:[2,148],115:[2,148],123:[2,148],125:[2,148],126:[2,148],129:[2,148],130:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148]},{113:[2,150],114:[2,150]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],110:227,112:155},{52:[1,228],113:[2,155],114:[2,155]},{52:[2,152],113:[2,152],114:[2,152]},{52:[2,153],113:[2,153],114:[2,153]},{52:[2,154],113:[2,154],114:[2,154]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],47:[2,149],52:[2,149],55:[2,149],70:[2,149],75:[2,149],83:[2,149],88:[2,149],90:[2,149],99:[2,149],101:[2,149],102:[2,149],103:[2,149],107:[2,149],115:[2,149],123:[2,149],125:[2,149],126:[2,149],129:[2,149],130:[2,149],131:[2,149],132:[2,149],133:[2,149],134:[2,149]},{8:229,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:230,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],51:231,52:[1,232],75:[2,51]},{6:[2,87],25:[2,87],26:[2,87],52:[2,87],75:[2,87]},{6:[2,37],25:[2,37],26:[2,37],41:[1,233],52:[2,37],75:[2,37]},{6:[2,40],25:[2,40],26:[2,40],52:[2,40],75:[2,40]},{6:[2,41],25:[2,41],26:[2,41],41:[2,41],52:[2,41],75:[2,41]},{6:[2,42],25:[2,42],26:[2,42],41:[2,42],52:[2,42],75:[2,42]},{6:[2,43],25:[2,43],26:[2,43],41:[2,43],52:[2,43],75:[2,43]},{1:[2,5],6:[2,5],26:[2,5],99:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],47:[2,25],52:[2,25],55:[2,25],70:[2,25],75:[2,25],83:[2,25],88:[2,25],90:[2,25],95:[2,25],96:[2,25],99:[2,25],101:[2,25],102:[2,25],103:[2,25],107:[2,25],115:[2,25],118:[2,25],120:[2,25],123:[2,25],125:[2,25],126:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],47:[2,186],52:[2,186],55:[2,186],70:[2,186],75:[2,186],83:[2,186],88:[2,186],90:[2,186],99:[2,186],100:85,101:[2,186],102:[2,186],103:[2,186],106:86,107:[2,186],108:67,115:[2,186],123:[2,186],125:[2,186],126:[2,186],129:[1,76],130:[1,79],131:[2,186],132:[2,186],133:[2,186],134:[2,186]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],47:[2,187],52:[2,187],55:[2,187],70:[2,187],75:[2,187],83:[2,187],88:[2,187],90:[2,187],99:[2,187],100:85,101:[2,187],102:[2,187],103:[2,187],106:86,107:[2,187],108:67,115:[2,187],123:[2,187],125:[2,187],126:[2,187],129:[1,76],130:[1,79],131:[2,187],132:[2,187],133:[2,187],134:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],47:[2,188],52:[2,188],55:[2,188],70:[2,188],75:[2,188],83:[2,188],88:[2,188],90:[2,188],99:[2,188],100:85,101:[2,188],102:[2,188],103:[2,188],106:86,107:[2,188],108:67,115:[2,188],123:[2,188],125:[2,188],126:[2,188],129:[1,76],130:[2,188],131:[2,188],132:[2,188],133:[2,188],134:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],47:[2,189],52:[2,189],55:[2,189],70:[2,189],75:[2,189],83:[2,189],88:[2,189],90:[2,189],99:[2,189],100:85,101:[2,189],102:[2,189],103:[2,189],106:86,107:[2,189],108:67,115:[2,189],123:[2,189],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[2,189],132:[2,189],133:[2,189],134:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],47:[2,190],52:[2,190],55:[2,190],70:[2,190],75:[2,190],83:[2,190],88:[2,190],90:[2,190],99:[2,190],100:85,101:[2,190],102:[2,190],103:[2,190],106:86,107:[2,190],108:67,115:[2,190],123:[2,190],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,190],133:[2,190],134:[1,83]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],47:[2,191],52:[2,191],55:[2,191],70:[2,191],75:[2,191],83:[2,191],88:[2,191],90:[2,191],99:[2,191],100:85,101:[2,191],102:[2,191],103:[2,191],106:86,107:[2,191],108:67,115:[2,191],123:[2,191],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[2,191],134:[1,83]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],47:[2,192],52:[2,192],55:[2,192],70:[2,192],75:[2,192],83:[2,192],88:[2,192],90:[2,192],99:[2,192],100:85,101:[2,192],102:[2,192],103:[2,192],106:86,107:[2,192],108:67,115:[2,192],123:[2,192],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,192],133:[2,192],134:[2,192]},{1:[2,177],6:[2,177],25:[2,177],26:[2,177],47:[2,177],52:[2,177],55:[2,177],70:[2,177],75:[2,177],83:[2,177],88:[2,177],90:[2,177],99:[2,177],100:85,101:[1,63],102:[2,177],103:[1,64],106:86,107:[1,66],108:67,115:[2,177],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],47:[2,176],52:[2,176],55:[2,176],70:[2,176],75:[2,176],83:[2,176],88:[2,176],90:[2,176],99:[2,176],100:85,101:[1,63],102:[2,176],103:[1,64],106:86,107:[1,66],108:67,115:[2,176],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],47:[2,99],52:[2,99],55:[2,99],64:[2,99],65:[2,99],66:[2,99],68:[2,99],70:[2,99],71:[2,99],75:[2,99],81:[2,99],82:[2,99],83:[2,99],88:[2,99],90:[2,99],99:[2,99],101:[2,99],102:[2,99],103:[2,99],107:[2,99],115:[2,99],123:[2,99],125:[2,99],126:[2,99],129:[2,99],130:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],38:[2,76],47:[2,76],52:[2,76],55:[2,76],64:[2,76],65:[2,76],66:[2,76],68:[2,76],70:[2,76],71:[2,76],75:[2,76],77:[2,76],81:[2,76],82:[2,76],83:[2,76],88:[2,76],90:[2,76],99:[2,76],101:[2,76],102:[2,76],103:[2,76],107:[2,76],115:[2,76],123:[2,76],125:[2,76],126:[2,76],127:[2,76],128:[2,76],129:[2,76],130:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],38:[2,77],47:[2,77],52:[2,77],55:[2,77],64:[2,77],65:[2,77],66:[2,77],68:[2,77],70:[2,77],71:[2,77],75:[2,77],77:[2,77],81:[2,77],82:[2,77],83:[2,77],88:[2,77],90:[2,77],99:[2,77],101:[2,77],102:[2,77],103:[2,77],107:[2,77],115:[2,77],123:[2,77],125:[2,77],126:[2,77],127:[2,77],128:[2,77],129:[2,77],130:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],38:[2,78],47:[2,78],52:[2,78],55:[2,78],64:[2,78],65:[2,78],66:[2,78],68:[2,78],70:[2,78],71:[2,78],75:[2,78],77:[2,78],81:[2,78],82:[2,78],83:[2,78],88:[2,78],90:[2,78],99:[2,78],101:[2,78],102:[2,78],103:[2,78],107:[2,78],115:[2,78],123:[2,78],125:[2,78],126:[2,78],127:[2,78],128:[2,78],129:[2,78],130:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78]},{70:[1,234]},{55:[1,189],70:[2,83],89:235,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{70:[2,84]},{8:236,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{12:[2,112],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],36:[2,112],43:[2,112],44:[2,112],45:[2,112],49:[2,112],50:[2,112],70:[2,112],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{12:[2,113],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],70:[2,113],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],38:[2,82],47:[2,82],52:[2,82],55:[2,82],64:[2,82],65:[2,82],66:[2,82],68:[2,82],70:[2,82],71:[2,82],75:[2,82],77:[2,82],81:[2,82],82:[2,82],83:[2,82],88:[2,82],90:[2,82],99:[2,82],101:[2,82],102:[2,82],103:[2,82],107:[2,82],115:[2,82],123:[2,82],125:[2,82],126:[2,82],127:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],47:[2,100],52:[2,100],55:[2,100],64:[2,100],65:[2,100],66:[2,100],68:[2,100],70:[2,100],71:[2,100],75:[2,100],81:[2,100],82:[2,100],83:[2,100],88:[2,100],90:[2,100],99:[2,100],101:[2,100],102:[2,100],103:[2,100],107:[2,100],115:[2,100],123:[2,100],125:[2,100],126:[2,100],129:[2,100],130:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],47:[2,34],52:[2,34],55:[2,34],70:[2,34],75:[2,34],83:[2,34],88:[2,34],90:[2,34],99:[2,34],100:85,101:[2,34],102:[2,34],103:[2,34],106:86,107:[2,34],108:67,115:[2,34],123:[2,34],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:237,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:238,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],47:[2,105],52:[2,105],55:[2,105],64:[2,105],65:[2,105],66:[2,105],68:[2,105],70:[2,105],71:[2,105],75:[2,105],81:[2,105],82:[2,105],83:[2,105],88:[2,105],90:[2,105],99:[2,105],101:[2,105],102:[2,105],103:[2,105],107:[2,105],115:[2,105],123:[2,105],125:[2,105],126:[2,105],129:[2,105],130:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105]},{6:[2,51],25:[2,51],51:239,52:[1,222],83:[2,51]},{6:[2,123],25:[2,123],26:[2,123],52:[2,123],55:[1,240],83:[2,123],88:[2,123],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{48:241,49:[1,58],50:[1,59]},{27:107,28:[1,71],42:108,53:242,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{47:[2,57],52:[2,57]},{8:243,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],47:[2,193],52:[2,193],55:[2,193],70:[2,193],75:[2,193],83:[2,193],88:[2,193],90:[2,193],99:[2,193],100:85,101:[2,193],102:[2,193],103:[2,193],106:86,107:[2,193],108:67,115:[2,193],123:[2,193],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:244,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],47:[2,195],52:[2,195],55:[2,195],70:[2,195],75:[2,195],83:[2,195],88:[2,195],90:[2,195],99:[2,195],100:85,101:[2,195],102:[2,195],103:[2,195],106:86,107:[2,195],108:67,115:[2,195],123:[2,195],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],47:[2,175],52:[2,175],55:[2,175],70:[2,175],75:[2,175],83:[2,175],88:[2,175],90:[2,175],99:[2,175],101:[2,175],102:[2,175],103:[2,175],107:[2,175],115:[2,175],123:[2,175],125:[2,175],126:[2,175],129:[2,175],130:[2,175],131:[2,175],132:[2,175],133:[2,175],134:[2,175]},{8:245,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,128],6:[2,128],25:[2,128],26:[2,128],47:[2,128],52:[2,128],55:[2,128],70:[2,128],75:[2,128],83:[2,128],88:[2,128],90:[2,128],95:[1,246],99:[2,128],101:[2,128],102:[2,128],103:[2,128],107:[2,128],115:[2,128],123:[2,128],125:[2,128],126:[2,128],129:[2,128],130:[2,128],131:[2,128],132:[2,128],133:[2,128],134:[2,128]},{5:247,25:[1,5]},{27:248,28:[1,71]},{117:249,119:212,120:[1,213]},{26:[1,250],118:[1,251],119:252,120:[1,213]},{26:[2,168],118:[2,168],120:[2,168]},{8:254,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],92:253,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,93],5:255,6:[2,93],25:[1,5],26:[2,93],47:[2,93],52:[2,93],55:[2,93],70:[2,93],75:[2,93],83:[2,93],88:[2,93],90:[2,93],99:[2,93],100:85,101:[1,63],102:[2,93],103:[1,64],106:86,107:[1,66],108:67,115:[2,93],123:[2,93],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],47:[2,96],52:[2,96],55:[2,96],70:[2,96],75:[2,96],83:[2,96],88:[2,96],90:[2,96],99:[2,96],101:[2,96],102:[2,96],103:[2,96],107:[2,96],115:[2,96],123:[2,96],125:[2,96],126:[2,96],129:[2,96],130:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96]},{8:256,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],47:[2,133],52:[2,133],55:[2,133],64:[2,133],65:[2,133],66:[2,133],68:[2,133],70:[2,133],71:[2,133],75:[2,133],81:[2,133],82:[2,133],83:[2,133],88:[2,133],90:[2,133],99:[2,133],101:[2,133],102:[2,133],103:[2,133],107:[2,133],115:[2,133],123:[2,133],125:[2,133],126:[2,133],129:[2,133],130:[2,133],131:[2,133],132:[2,133],133:[2,133],134:[2,133]},{6:[1,72],26:[1,257]},{8:258,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,63],12:[2,113],25:[2,63],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],52:[2,63],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],88:[2,63],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{6:[1,260],25:[1,261],88:[1,259]},{6:[2,52],8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,52],26:[2,52],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[2,52],85:[1,56],86:[1,57],87:[1,55],88:[2,52],91:262,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],26:[2,51],51:263,52:[1,222]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],47:[2,172],52:[2,172],55:[2,172],70:[2,172],75:[2,172],83:[2,172],88:[2,172],90:[2,172],99:[2,172],101:[2,172],102:[2,172],103:[2,172],107:[2,172],115:[2,172],118:[2,172],123:[2,172],125:[2,172],126:[2,172],129:[2,172],130:[2,172],131:[2,172],132:[2,172],133:[2,172],134:[2,172]},{8:264,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:265,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{113:[2,151],114:[2,151]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],112:266},{1:[2,157],6:[2,157],25:[2,157],26:[2,157],47:[2,157],52:[2,157],55:[2,157],70:[2,157],75:[2,157],83:[2,157],88:[2,157],90:[2,157],99:[2,157],100:85,101:[2,157],102:[1,267],103:[2,157],106:86,107:[2,157],108:67,115:[1,268],123:[2,157],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,158],6:[2,158],25:[2,158],26:[2,158],47:[2,158],52:[2,158],55:[2,158],70:[2,158],75:[2,158],83:[2,158],88:[2,158],90:[2,158],99:[2,158],100:85,101:[2,158],102:[1,269],103:[2,158],106:86,107:[2,158],108:67,115:[2,158],123:[2,158],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,271],25:[1,272],75:[1,270]},{6:[2,52],11:165,25:[2,52],26:[2,52],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:273,40:164,42:168,44:[1,46],75:[2,52],86:[1,111]},{8:274,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,275],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],38:[2,81],47:[2,81],52:[2,81],55:[2,81],64:[2,81],65:[2,81],66:[2,81],68:[2,81],70:[2,81],71:[2,81],75:[2,81],77:[2,81],81:[2,81],82:[2,81],83:[2,81],88:[2,81],90:[2,81],99:[2,81],101:[2,81],102:[2,81],103:[2,81],107:[2,81],115:[2,81],123:[2,81],125:[2,81],126:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81]},{8:276,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,70:[2,116],73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,117],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],47:[2,35],52:[2,35],55:[2,35],70:[2,35],75:[2,35],83:[2,35],88:[2,35],90:[2,35],99:[2,35],100:85,101:[2,35],102:[2,35],103:[2,35],106:86,107:[2,35],108:67,115:[2,35],123:[2,35],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,277],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],83:[1,278]},{6:[2,63],25:[2,63],26:[2,63],52:[2,63],83:[2,63],88:[2,63]},{5:279,25:[1,5]},{47:[2,55],52:[2,55]},{47:[2,58],52:[2,58],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,280],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:281,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:282,25:[1,5]},{1:[2,129],6:[2,129],25:[2,129],26:[2,129],47:[2,129],52:[2,129],55:[2,129],70:[2,129],75:[2,129],83:[2,129],88:[2,129],90:[2,129],99:[2,129],101:[2,129],102:[2,129],103:[2,129],107:[2,129],115:[2,129],123:[2,129],125:[2,129],126:[2,129],129:[2,129],130:[2,129],131:[2,129],132:[2,129],133:[2,129],134:[2,129]},{5:283,25:[1,5]},{26:[1,284],118:[1,285],119:252,120:[1,213]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],47:[2,166],52:[2,166],55:[2,166],70:[2,166],75:[2,166],83:[2,166],88:[2,166],90:[2,166],99:[2,166],101:[2,166],102:[2,166],103:[2,166],107:[2,166],115:[2,166],123:[2,166],125:[2,166],126:[2,166],129:[2,166],130:[2,166],131:[2,166],132:[2,166],133:[2,166],134:[2,166]},{5:286,25:[1,5]},{26:[2,169],118:[2,169],120:[2,169]},{5:287,25:[1,5],52:[1,288]},{25:[2,125],52:[2,125],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,94],6:[2,94],25:[2,94],26:[2,94],47:[2,94],52:[2,94],55:[2,94],70:[2,94],75:[2,94],83:[2,94],88:[2,94],90:[2,94],99:[2,94],101:[2,94],102:[2,94],103:[2,94],107:[2,94],115:[2,94],123:[2,94],125:[2,94],126:[2,94],129:[2,94],130:[2,94],131:[2,94],132:[2,94],133:[2,94],134:[2,94]},{1:[2,97],5:289,6:[2,97],25:[1,5],26:[2,97],47:[2,97],52:[2,97],55:[2,97],70:[2,97],75:[2,97],83:[2,97],88:[2,97],90:[2,97],99:[2,97],100:85,101:[1,63],102:[2,97],103:[1,64],106:86,107:[1,66],108:67,115:[2,97],123:[2,97],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{99:[1,290]},{88:[1,291],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],38:[2,111],47:[2,111],52:[2,111],55:[2,111],64:[2,111],65:[2,111],66:[2,111],68:[2,111],70:[2,111],71:[2,111],75:[2,111],81:[2,111],82:[2,111],83:[2,111],88:[2,111],90:[2,111],99:[2,111],101:[2,111],102:[2,111],103:[2,111],107:[2,111],113:[2,111],114:[2,111],115:[2,111],123:[2,111],125:[2,111],126:[2,111],129:[2,111],130:[2,111],131:[2,111],132:[2,111],133:[2,111],134:[2,111]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],91:292,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:293,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,119],25:[2,119],26:[2,119],52:[2,119],83:[2,119],88:[2,119]},{6:[1,260],25:[1,261],26:[1,294]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],47:[2,136],52:[2,136],55:[2,136],70:[2,136],75:[2,136],83:[2,136],88:[2,136],90:[2,136],99:[2,136],100:85,101:[1,63],102:[2,136],103:[1,64],106:86,107:[1,66],108:67,115:[2,136],123:[2,136],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],47:[2,138],52:[2,138],55:[2,138],70:[2,138],75:[2,138],83:[2,138],88:[2,138],90:[2,138],99:[2,138],100:85,101:[1,63],102:[2,138],103:[1,64],106:86,107:[1,66],108:67,115:[2,138],123:[2,138],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{113:[2,156],114:[2,156]},{8:295,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:296,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:297,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],38:[2,85],47:[2,85],52:[2,85],55:[2,85],64:[2,85],65:[2,85],66:[2,85],68:[2,85],70:[2,85],71:[2,85],75:[2,85],81:[2,85],82:[2,85],83:[2,85],88:[2,85],90:[2,85],99:[2,85],101:[2,85],102:[2,85],103:[2,85],107:[2,85],113:[2,85],114:[2,85],115:[2,85],123:[2,85],125:[2,85],126:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85]},{11:165,27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:298,40:164,42:168,44:[1,46],86:[1,111]},{6:[2,86],11:165,25:[2,86],26:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:299,86:[1,111]},{6:[2,88],25:[2,88],26:[2,88],52:[2,88],75:[2,88]},{6:[2,38],25:[2,38],26:[2,38],52:[2,38],75:[2,38],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:300,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,115],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],47:[2,36],52:[2,36],55:[2,36],70:[2,36],75:[2,36],83:[2,36],88:[2,36],90:[2,36],99:[2,36],101:[2,36],102:[2,36],103:[2,36],107:[2,36],115:[2,36],123:[2,36],125:[2,36],126:[2,36],129:[2,36],130:[2,36],131:[2,36],132:[2,36],133:[2,36],134:[2,36]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],47:[2,106],52:[2,106],55:[2,106],64:[2,106],65:[2,106],66:[2,106],68:[2,106],70:[2,106],71:[2,106],75:[2,106],81:[2,106],82:[2,106],83:[2,106],88:[2,106],90:[2,106],99:[2,106],101:[2,106],102:[2,106],103:[2,106],107:[2,106],115:[2,106],123:[2,106],125:[2,106],126:[2,106],129:[2,106],130:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106]},{1:[2,47],6:[2,47],25:[2,47],26:[2,47],47:[2,47],52:[2,47],55:[2,47],70:[2,47],75:[2,47],83:[2,47],88:[2,47],90:[2,47],99:[2,47],101:[2,47],102:[2,47],103:[2,47],107:[2,47],115:[2,47],123:[2,47],125:[2,47],126:[2,47],129:[2,47],130:[2,47],131:[2,47],132:[2,47],133:[2,47],134:[2,47]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],47:[2,194],52:[2,194],55:[2,194],70:[2,194],75:[2,194],83:[2,194],88:[2,194],90:[2,194],99:[2,194],101:[2,194],102:[2,194],103:[2,194],107:[2,194],115:[2,194],123:[2,194],125:[2,194],126:[2,194],129:[2,194],130:[2,194],131:[2,194],132:[2,194],133:[2,194],134:[2,194]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],47:[2,173],52:[2,173],55:[2,173],70:[2,173],75:[2,173],83:[2,173],88:[2,173],90:[2,173],99:[2,173],101:[2,173],102:[2,173],103:[2,173],107:[2,173],115:[2,173],118:[2,173],123:[2,173],125:[2,173],126:[2,173],129:[2,173],130:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173]},{1:[2,130],6:[2,130],25:[2,130],26:[2,130],47:[2,130],52:[2,130],55:[2,130],70:[2,130],75:[2,130],83:[2,130],88:[2,130],90:[2,130],99:[2,130],101:[2,130],102:[2,130],103:[2,130],107:[2,130],115:[2,130],123:[2,130],125:[2,130],126:[2,130],129:[2,130],130:[2,130],131:[2,130],132:[2,130],133:[2,130],134:[2,130]},{1:[2,131],6:[2,131],25:[2,131],26:[2,131],47:[2,131],52:[2,131],55:[2,131],70:[2,131],75:[2,131],83:[2,131],88:[2,131],90:[2,131],95:[2,131],99:[2,131],101:[2,131],102:[2,131],103:[2,131],107:[2,131],115:[2,131],123:[2,131],125:[2,131],126:[2,131],129:[2,131],130:[2,131],131:[2,131],132:[2,131],133:[2,131],134:[2,131]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],47:[2,164],52:[2,164],55:[2,164],70:[2,164],75:[2,164],83:[2,164],88:[2,164],90:[2,164],99:[2,164],101:[2,164],102:[2,164],103:[2,164],107:[2,164],115:[2,164],123:[2,164],125:[2,164],126:[2,164],129:[2,164],130:[2,164],131:[2,164],132:[2,164],133:[2,164],134:[2,164]},{5:301,25:[1,5]},{26:[1,302]},{6:[1,303],26:[2,170],118:[2,170],120:[2,170]},{8:304,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],47:[2,98],52:[2,98],55:[2,98],70:[2,98],75:[2,98],83:[2,98],88:[2,98],90:[2,98],99:[2,98],101:[2,98],102:[2,98],103:[2,98],107:[2,98],115:[2,98],123:[2,98],125:[2,98],126:[2,98],129:[2,98],130:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],47:[2,134],52:[2,134],55:[2,134],64:[2,134],65:[2,134],66:[2,134],68:[2,134],70:[2,134],71:[2,134],75:[2,134],81:[2,134],82:[2,134],83:[2,134],88:[2,134],90:[2,134],99:[2,134],101:[2,134],102:[2,134],103:[2,134],107:[2,134],115:[2,134],123:[2,134],125:[2,134],126:[2,134],129:[2,134],130:[2,134],131:[2,134],132:[2,134],133:[2,134],134:[2,134]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],47:[2,114],52:[2,114],55:[2,114],64:[2,114],65:[2,114],66:[2,114],68:[2,114],70:[2,114],71:[2,114],75:[2,114],81:[2,114],82:[2,114],83:[2,114],88:[2,114],90:[2,114],99:[2,114],101:[2,114],102:[2,114],103:[2,114],107:[2,114],115:[2,114],123:[2,114],125:[2,114],126:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114]},{6:[2,120],25:[2,120],26:[2,120],52:[2,120],83:[2,120],88:[2,120]},{6:[2,51],25:[2,51],26:[2,51],51:305,52:[1,222]},{6:[2,121],25:[2,121],26:[2,121],52:[2,121],83:[2,121],88:[2,121]},{1:[2,159],6:[2,159],25:[2,159],26:[2,159],47:[2,159],52:[2,159],55:[2,159],70:[2,159],75:[2,159],83:[2,159],88:[2,159],90:[2,159],99:[2,159],100:85,101:[2,159],102:[2,159],103:[2,159],106:86,107:[2,159],108:67,115:[1,306],123:[2,159],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,161],6:[2,161],25:[2,161],26:[2,161],47:[2,161],52:[2,161],55:[2,161],70:[2,161],75:[2,161],83:[2,161],88:[2,161],90:[2,161],99:[2,161],100:85,101:[2,161],102:[1,307],103:[2,161],106:86,107:[2,161],108:67,115:[2,161],123:[2,161],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,160],6:[2,160],25:[2,160],26:[2,160],47:[2,160],52:[2,160],55:[2,160],70:[2,160],75:[2,160],83:[2,160],88:[2,160],90:[2,160],99:[2,160],100:85,101:[2,160],102:[2,160],103:[2,160],106:86,107:[2,160],108:67,115:[2,160],123:[2,160],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,89],25:[2,89],26:[2,89],52:[2,89],75:[2,89]},{6:[2,51],25:[2,51],26:[2,51],51:308,52:[1,232]},{26:[1,309],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,310]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],47:[2,167],52:[2,167],55:[2,167],70:[2,167],75:[2,167],83:[2,167],88:[2,167],90:[2,167],99:[2,167],101:[2,167],102:[2,167],103:[2,167],107:[2,167],115:[2,167],123:[2,167],125:[2,167],126:[2,167],129:[2,167],130:[2,167],131:[2,167],132:[2,167],133:[2,167],134:[2,167]},{26:[2,171],118:[2,171],120:[2,171]},{25:[2,126],52:[2,126],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],26:[1,311]},{8:312,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:313,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[1,271],25:[1,272],26:[1,314]},{6:[2,39],25:[2,39],26:[2,39],52:[2,39],75:[2,39]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],47:[2,165],52:[2,165],55:[2,165],70:[2,165],75:[2,165],83:[2,165],88:[2,165],90:[2,165],99:[2,165],101:[2,165],102:[2,165],103:[2,165],107:[2,165],115:[2,165],123:[2,165],125:[2,165],126:[2,165],129:[2,165],130:[2,165],131:[2,165],132:[2,165],133:[2,165],134:[2,165]},{6:[2,122],25:[2,122],26:[2,122],52:[2,122],83:[2,122],88:[2,122]},{1:[2,162],6:[2,162],25:[2,162],26:[2,162],47:[2,162],52:[2,162],55:[2,162],70:[2,162],75:[2,162],83:[2,162],88:[2,162],90:[2,162],99:[2,162],100:85,101:[2,162],102:[2,162],103:[2,162],106:86,107:[2,162],108:67,115:[2,162],123:[2,162],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],47:[2,163],52:[2,163],55:[2,163],70:[2,163],75:[2,163],83:[2,163],88:[2,163],90:[2,163],99:[2,163],100:85,101:[2,163],102:[2,163],103:[2,163],106:86,107:[2,163],108:67,115:[2,163],123:[2,163],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,90],25:[2,90],26:[2,90],52:[2,90],75:[2,90]}], -defaultActions: {58:[2,49],59:[2,50],73:[2,3],92:[2,104],186:[2,84]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], // semantic value stack - lstack = [], // location stack - table = this.table, - yytext = '', - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - - //this.reductionCount = this.shiftCount = 0; - - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == 'undefined') - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - - if (typeof this.yy.parseError === 'function') - this.parseError = this.yy.parseError; - - function popStack (n) { - stack.length = stack.length - 2*n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - - function lex() { - var token; - token = self.lexer.lex() || 1; // $end = 1 - // if token isn't its numeric value, convert - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - - var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; - while (true) { - // retreive state number from top of stack - state = stack[stack.length-1]; - - // use default actions if available - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol == null) - symbol = lex(); - // read action for current state and first input - action = table[state] && table[state][symbol]; - } - - // handle parse error - if (typeof action === 'undefined' || !action.length || !action[0]) { - - if (!recovering) { - // Report error - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'"+this.terminals_[p]+"'"); - } - var errStr = ''; - if (this.lexer.showPosition) { - errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+'\nExpecting '+expected.join(', '); - } else { - errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + - (symbol == 1 /*EOF*/ ? "end of input" : - ("'"+(this.terminals_[symbol] || symbol)+"'")); - } - this.parseError(errStr, - {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - - // just recovered from another error - if (recovering == 3) { - if (symbol == EOF) { - throw new Error(errStr || 'Parsing halted.'); - } - - // discard current lookahead and grab another - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - symbol = lex(); - } - - // try to recover from error - while (1) { - // check for error recovery rule in this state - if ((TERROR.toString()) in table[state]) { - break; - } - if (state == 0) { - throw new Error(errStr || 'Parsing halted.'); - } - popStack(1); - state = stack[stack.length-1]; - } - - preErrorSymbol = symbol; // save the lookahead token - symbol = TERROR; // insert generic error symbol as new lookahead - state = stack[stack.length-1]; - action = table[state] && table[state][TERROR]; - recovering = 3; // allow 3 real symbols to be shifted before reporting a new error - } - - // this shouldn't happen, unless resolve defaults are off - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); - } - - switch (action[0]) { - - case 1: // shift - //this.shiftCount++; - - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); // push state - symbol = null; - if (!preErrorSymbol) { // normal execution/no error - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { // error just occurred, resume old lookahead f/ before error - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - - case 2: // reduce - //this.reductionCount++; - - len = this.productions_[action[1]][1]; - - // perform semantic action - yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 - // default location, uses first token for firsts, last for lasts - yyval._$ = { - first_line: lstack[lstack.length-(len||1)].first_line, - last_line: lstack[lstack.length-1].last_line, - first_column: lstack[lstack.length-(len||1)].first_column, - last_column: lstack[lstack.length-1].last_column - }; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - - if (typeof r !== 'undefined') { - return r; - } - - // pop off stack - if (len) { - stack = stack.slice(0,-1*len*2); - vstack = vstack.slice(0, -1*len); - lstack = lstack.slice(0, -1*len); - } - - stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) - vstack.push(yyval.$); - lstack.push(yyval._$); - // goto new state = table[STATE][NONTERMINAL] - newState = table[stack[stack.length-2]][stack[stack.length-1]]; - stack.push(newState); - break; - - case 3: // accept - return true; - } - - } - - return true; -}}; -return parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = parser; -exports.parse = function () { return parser.parse.apply(parser, arguments); } -exports.main = function commonjsMain(args) { - if (!args[1]) - throw new Error('Usage: '+args[0]+' FILE'); - if (typeof process !== 'undefined') { - var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8"); - } else { - var cwd = require("file").path(require("file").cwd()); - var source = cwd.join(args[1]).read({charset: "utf-8"}); - } - return exports.parser.parse(source); -} -if (typeof module !== 'undefined' && require.main === module) { - exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); -} -} -};require['./scope'] = new function() { - var exports = this; - (function() { - var Scope, extend, last, _ref; - - _ref = require('./helpers'), extend = _ref.extend, last = _ref.last; - - exports.Scope = Scope = (function() { - - Scope.root = null; - - function Scope(parent, expressions, method) { - this.parent = parent; - this.expressions = expressions; - this.method = method; - this.variables = [ - { - name: 'arguments', - type: 'arguments' - } - ]; - this.positions = {}; - if (!this.parent) Scope.root = this; - } - - Scope.prototype.add = function(name, type, immediate) { - if (this.shared && !immediate) return this.parent.add(name, type, immediate); - if (Object.prototype.hasOwnProperty.call(this.positions, name)) { - return this.variables[this.positions[name]].type = type; - } else { - return this.positions[name] = this.variables.push({ - name: name, - type: type - }) - 1; - } - }; - - Scope.prototype.find = function(name, options) { - if (this.check(name, options)) return true; - this.add(name, 'var'); - return false; - }; - - Scope.prototype.parameter = function(name) { - if (this.shared && this.parent.check(name, true)) return; - return this.add(name, 'param'); - }; - - Scope.prototype.check = function(name, immediate) { - var found, _ref2; - found = !!this.type(name); - if (found || immediate) return found; - return !!((_ref2 = this.parent) != null ? _ref2.check(name) : void 0); - }; - - Scope.prototype.temporary = function(name, index) { - if (name.length > 1) { - return '_' + name + (index > 1 ? index : ''); - } else { - return '_' + (index + parseInt(name, 36)).toString(36).replace(/\d/g, 'a'); - } - }; - - Scope.prototype.type = function(name) { - var v, _i, _len, _ref2; - _ref2 = this.variables; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - v = _ref2[_i]; - if (v.name === name) return v.type; - } - return null; - }; - - Scope.prototype.freeVariable = function(name, reserve) { - var index, temp; - if (reserve == null) reserve = true; - index = 0; - while (this.check((temp = this.temporary(name, index)))) { - index++; - } - if (reserve) this.add(temp, 'var', true); - return temp; - }; - - Scope.prototype.assign = function(name, value) { - this.add(name, { - value: value, - assigned: true - }, true); - return this.hasAssignments = true; - }; - - Scope.prototype.hasDeclarations = function() { - return !!this.declaredVariables().length; - }; - - Scope.prototype.declaredVariables = function() { - var realVars, tempVars, v, _i, _len, _ref2; - realVars = []; - tempVars = []; - _ref2 = this.variables; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - v = _ref2[_i]; - if (v.type === 'var') { - (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name); - } - } - return realVars.sort().concat(tempVars.sort()); - }; - - Scope.prototype.assignedVariables = function() { - var v, _i, _len, _ref2, _results; - _ref2 = this.variables; - _results = []; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - v = _ref2[_i]; - if (v.type.assigned) _results.push("" + v.name + " = " + v.type.value); - } - return _results; - }; - - return Scope; - - })(); - -}).call(this); - -};require['./nodes'] = new function() { - var exports = this; - (function() { - var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, compact, del, ends, extend, flatten, last, merge, multident, starts, unfoldSoak, utility, _ref, - __hasProp = Object.prototype.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }, - __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Scope = require('./scope').Scope; - - RESERVED = require('./lexer').RESERVED; - - _ref = require('./helpers'), compact = _ref.compact, flatten = _ref.flatten, extend = _ref.extend, merge = _ref.merge, del = _ref.del, starts = _ref.starts, ends = _ref.ends, last = _ref.last; - - exports.extend = extend; - - YES = function() { - return true; - }; - - NO = function() { - return false; - }; - - THIS = function() { - return this; - }; - - NEGATE = function() { - this.negated = !this.negated; - return this; - }; - - exports.Base = Base = (function() { - - function Base() {} - - Base.prototype.compile = function(o, lvl) { - var node; - o = extend({}, o); - if (lvl) o.level = lvl; - node = this.unfoldSoak(o) || this; - node.tab = o.indent; - if (o.level === LEVEL_TOP || !node.isStatement(o)) { - return node.compileNode(o); - } else { - return node.compileClosure(o); - } - }; - - Base.prototype.compileClosure = function(o) { - if (this.jumps()) { - throw SyntaxError('cannot use a pure statement in an expression.'); - } - o.sharedScope = true; - return Closure.wrap(this).compileNode(o); - }; - - Base.prototype.cache = function(o, level, reused) { - var ref, sub; - if (!this.isComplex()) { - ref = level ? this.compile(o, level) : this; - return [ref, ref]; - } else { - ref = new Literal(reused || o.scope.freeVariable('ref')); - sub = new Assign(ref, this); - if (level) { - return [sub.compile(o, level), ref.value]; - } else { - return [sub, ref]; - } - } - }; - - Base.prototype.compileLoopReference = function(o, name) { - var src, tmp; - src = tmp = this.compile(o, LEVEL_LIST); - if (!((-Infinity < +src && +src < Infinity) || IDENTIFIER.test(src) && o.scope.check(src, true))) { - src = "" + (tmp = o.scope.freeVariable(name)) + " = " + src; - } - return [src, tmp]; - }; - - Base.prototype.makeReturn = function(res) { - var me; - me = this.unwrapAll(); - if (res) { - return new Call(new Literal("" + res + ".push"), [me]); - } else { - return new Return(me); - } - }; - - Base.prototype.contains = function(pred) { - var contains; - contains = false; - this.traverseChildren(false, function(node) { - if (pred(node)) { - contains = true; - return false; - } - }); - return contains; - }; - - Base.prototype.containsType = function(type) { - return this instanceof type || this.contains(function(node) { - return node instanceof type; - }); - }; - - Base.prototype.lastNonComment = function(list) { - var i; - i = list.length; - while (i--) { - if (!(list[i] instanceof Comment)) return list[i]; - } - return null; - }; - - Base.prototype.toString = function(idt, name) { - var tree; - if (idt == null) idt = ''; - if (name == null) name = this.constructor.name; - tree = '\n' + idt + name; - if (this.soak) tree += '?'; - this.eachChild(function(node) { - return tree += node.toString(idt + TAB); - }); - return tree; - }; - - Base.prototype.eachChild = function(func) { - var attr, child, _i, _j, _len, _len2, _ref2, _ref3; - if (!this.children) return this; - _ref2 = this.children; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - attr = _ref2[_i]; - if (this[attr]) { - _ref3 = flatten([this[attr]]); - for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) { - child = _ref3[_j]; - if (func(child) === false) return this; - } - } - } - return this; - }; - - Base.prototype.traverseChildren = function(crossScope, func) { - return this.eachChild(function(child) { - if (func(child) === false) return false; - return child.traverseChildren(crossScope, func); - }); - }; - - Base.prototype.invert = function() { - return new Op('!', this); - }; - - Base.prototype.unwrapAll = function() { - var node; - node = this; - while (node !== (node = node.unwrap())) { - continue; - } - return node; - }; - - Base.prototype.children = []; - - Base.prototype.isStatement = NO; - - Base.prototype.jumps = NO; - - Base.prototype.isComplex = YES; - - Base.prototype.isChainable = NO; - - Base.prototype.isAssignable = NO; - - Base.prototype.unwrap = THIS; - - Base.prototype.unfoldSoak = NO; - - Base.prototype.assigns = NO; - - return Base; - - })(); - - exports.Block = Block = (function(_super) { - - __extends(Block, _super); - - function Block(nodes) { - this.expressions = compact(flatten(nodes || [])); - } - - Block.prototype.children = ['expressions']; - - Block.prototype.push = function(node) { - this.expressions.push(node); - return this; - }; - - Block.prototype.pop = function() { - return this.expressions.pop(); - }; - - Block.prototype.unshift = function(node) { - this.expressions.unshift(node); - return this; - }; - - Block.prototype.unwrap = function() { - if (this.expressions.length === 1) { - return this.expressions[0]; - } else { - return this; - } - }; - - Block.prototype.isEmpty = function() { - return !this.expressions.length; - }; - - Block.prototype.isStatement = function(o) { - var exp, _i, _len, _ref2; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - exp = _ref2[_i]; - if (exp.isStatement(o)) return true; - } - return false; - }; - - Block.prototype.jumps = function(o) { - var exp, _i, _len, _ref2; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - exp = _ref2[_i]; - if (exp.jumps(o)) return exp; - } - }; - - Block.prototype.makeReturn = function(res) { - var expr, len; - len = this.expressions.length; - while (len--) { - expr = this.expressions[len]; - if (!(expr instanceof Comment)) { - this.expressions[len] = expr.makeReturn(res); - if (expr instanceof Return && !expr.expression) { - this.expressions.splice(len, 1); - } - break; - } - } - return this; - }; - - Block.prototype.compile = function(o, level) { - if (o == null) o = {}; - if (o.scope) { - return Block.__super__.compile.call(this, o, level); - } else { - return this.compileRoot(o); - } - }; - - Block.prototype.compileNode = function(o) { - var code, codes, node, top, _i, _len, _ref2; - this.tab = o.indent; - top = o.level === LEVEL_TOP; - codes = []; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - node = _ref2[_i]; - node = node.unwrapAll(); - node = node.unfoldSoak(o) || node; - if (node instanceof Block) { - codes.push(node.compileNode(o)); - } else if (top) { - node.front = true; - code = node.compile(o); - codes.push(node.isStatement(o) ? code : "" + this.tab + code + ";"); - } else { - codes.push(node.compile(o, LEVEL_LIST)); - } - } - if (top) { - if (this.spaced) { - return "\n" + (codes.join('\n\n')) + "\n"; - } else { - return codes.join('\n'); - } - } - code = codes.join(', ') || 'void 0'; - if (codes.length > 1 && o.level >= LEVEL_LIST) { - return "(" + code + ")"; - } else { - return code; - } - }; - - Block.prototype.compileRoot = function(o) { - var code, exp, i, prelude, preludeExps, rest; - o.indent = o.bare ? '' : TAB; - o.scope = new Scope(null, this, null); - o.level = LEVEL_TOP; - this.spaced = true; - prelude = ""; - if (!o.bare) { - preludeExps = (function() { - var _len, _ref2, _results; - _ref2 = this.expressions; - _results = []; - for (i = 0, _len = _ref2.length; i < _len; i++) { - exp = _ref2[i]; - if (!(exp.unwrap() instanceof Comment)) break; - _results.push(exp); - } - return _results; - }).call(this); - rest = this.expressions.slice(preludeExps.length); - this.expressions = preludeExps; - if (preludeExps.length) { - prelude = "" + (this.compileNode(merge(o, { - indent: '' - }))) + "\n"; - } - this.expressions = rest; - } - code = this.compileWithDeclarations(o); - if (o.bare) return code; - return "" + prelude + "(function() {\n" + code + "\n}).call(this);\n"; - }; - - Block.prototype.compileWithDeclarations = function(o) { - var assigns, code, declars, exp, i, post, rest, scope, spaced, _len, _ref2, _ref3, _ref4; - code = post = ''; - _ref2 = this.expressions; - for (i = 0, _len = _ref2.length; i < _len; i++) { - exp = _ref2[i]; - exp = exp.unwrap(); - if (!(exp instanceof Comment || exp instanceof Literal)) break; - } - o = merge(o, { - level: LEVEL_TOP - }); - if (i) { - rest = this.expressions.splice(i, 9e9); - _ref3 = [this.spaced, false], spaced = _ref3[0], this.spaced = _ref3[1]; - _ref4 = [this.compileNode(o), spaced], code = _ref4[0], this.spaced = _ref4[1]; - this.expressions = rest; - } - post = this.compileNode(o); - scope = o.scope; - if (scope.expressions === this) { - declars = o.scope.hasDeclarations(); - assigns = scope.hasAssignments; - if (declars || assigns) { - if (i) code += '\n'; - code += "" + this.tab + "var "; - if (declars) code += scope.declaredVariables().join(', '); - if (assigns) { - if (declars) code += ",\n" + (this.tab + TAB); - code += scope.assignedVariables().join(",\n" + (this.tab + TAB)); - } - code += ';\n'; - } - } - return code + post; - }; - - Block.wrap = function(nodes) { - if (nodes.length === 1 && nodes[0] instanceof Block) return nodes[0]; - return new Block(nodes); - }; - - return Block; - - })(Base); - - exports.Literal = Literal = (function(_super) { - - __extends(Literal, _super); - - function Literal(value) { - this.value = value; - } - - Literal.prototype.makeReturn = function() { - if (this.isStatement()) { - return this; - } else { - return Literal.__super__.makeReturn.apply(this, arguments); - } - }; - - Literal.prototype.isAssignable = function() { - return IDENTIFIER.test(this.value); - }; - - Literal.prototype.isStatement = function() { - var _ref2; - return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger'; - }; - - Literal.prototype.isComplex = NO; - - Literal.prototype.assigns = function(name) { - return name === this.value; - }; - - Literal.prototype.jumps = function(o) { - if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) { - return this; - } - if (this.value === 'continue' && !(o != null ? o.loop : void 0)) return this; - }; - - Literal.prototype.compileNode = function(o) { - var code, _ref2, _ref3; - code = this.isUndefined ? o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0' : this.value === 'this' ? ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0) ? o.scope.method.context : this.value : this.value.reserved && ((_ref3 = "" + this.value) !== 'eval' && _ref3 !== 'arguments') ? "\"" + this.value + "\"" : this.value; - if (this.isStatement()) { - return "" + this.tab + code + ";"; - } else { - return code; - } - }; - - Literal.prototype.toString = function() { - return ' "' + this.value + '"'; - }; - - return Literal; - - })(Base); - - exports.Return = Return = (function(_super) { - - __extends(Return, _super); - - function Return(expr) { - if (expr && !expr.unwrap().isUndefined) this.expression = expr; - } - - Return.prototype.children = ['expression']; - - Return.prototype.isStatement = YES; - - Return.prototype.makeReturn = THIS; - - Return.prototype.jumps = THIS; - - Return.prototype.compile = function(o, level) { - var expr, _ref2; - expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0; - if (expr && !(expr instanceof Return)) { - return expr.compile(o, level); - } else { - return Return.__super__.compile.call(this, o, level); - } - }; - - Return.prototype.compileNode = function(o) { - return this.tab + ("return" + [this.expression ? " " + (this.expression.compile(o, LEVEL_PAREN)) : void 0] + ";"); - }; - - return Return; - - })(Base); - - exports.Value = Value = (function(_super) { - - __extends(Value, _super); - - function Value(base, props, tag) { - if (!props && base instanceof Value) return base; - this.base = base; - this.properties = props || []; - if (tag) this[tag] = true; - return this; - } - - Value.prototype.children = ['base', 'properties']; - - Value.prototype.add = function(props) { - this.properties = this.properties.concat(props); - return this; - }; - - Value.prototype.hasProperties = function() { - return !!this.properties.length; - }; - - Value.prototype.isArray = function() { - return !this.properties.length && this.base instanceof Arr; - }; - - Value.prototype.isComplex = function() { - return this.hasProperties() || this.base.isComplex(); - }; - - Value.prototype.isAssignable = function() { - return this.hasProperties() || this.base.isAssignable(); - }; - - Value.prototype.isSimpleNumber = function() { - return this.base instanceof Literal && SIMPLENUM.test(this.base.value); - }; - - Value.prototype.isAtomic = function() { - var node, _i, _len, _ref2; - _ref2 = this.properties.concat(this.base); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - node = _ref2[_i]; - if (node.soak || node instanceof Call) return false; - } - return true; - }; - - Value.prototype.isStatement = function(o) { - return !this.properties.length && this.base.isStatement(o); - }; - - Value.prototype.assigns = function(name) { - return !this.properties.length && this.base.assigns(name); - }; - - Value.prototype.jumps = function(o) { - return !this.properties.length && this.base.jumps(o); - }; - - Value.prototype.isObject = function(onlyGenerated) { - if (this.properties.length) return false; - return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); - }; - - Value.prototype.isSplice = function() { - return last(this.properties) instanceof Slice; - }; - - Value.prototype.unwrap = function() { - if (this.properties.length) { - return this; - } else { - return this.base; - } - }; - - Value.prototype.cacheReference = function(o) { - var base, bref, name, nref; - name = last(this.properties); - if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { - return [this, this]; - } - base = new Value(this.base, this.properties.slice(0, -1)); - if (base.isComplex()) { - bref = new Literal(o.scope.freeVariable('base')); - base = new Value(new Parens(new Assign(bref, base))); - } - if (!name) return [base, bref]; - if (name.isComplex()) { - nref = new Literal(o.scope.freeVariable('name')); - name = new Index(new Assign(nref, name.index)); - nref = new Index(nref); - } - return [base.add(name), new Value(bref || base.base, [nref || name])]; - }; - - Value.prototype.compileNode = function(o) { - var code, prop, props, _i, _len; - this.base.front = this.front; - props = this.properties; - code = this.base.compile(o, props.length ? LEVEL_ACCESS : null); - if ((this.base instanceof Parens || props.length) && SIMPLENUM.test(code)) { - code = "" + code + "."; - } - for (_i = 0, _len = props.length; _i < _len; _i++) { - prop = props[_i]; - code += prop.compile(o); - } - return code; - }; - - Value.prototype.unfoldSoak = function(o) { - var result, - _this = this; - if (this.unfoldedSoak != null) return this.unfoldedSoak; - result = (function() { - var fst, i, ifn, prop, ref, snd, _len, _ref2; - if (ifn = _this.base.unfoldSoak(o)) { - Array.prototype.push.apply(ifn.body.properties, _this.properties); - return ifn; - } - _ref2 = _this.properties; - for (i = 0, _len = _ref2.length; i < _len; i++) { - prop = _ref2[i]; - if (!prop.soak) continue; - prop.soak = false; - fst = new Value(_this.base, _this.properties.slice(0, i)); - snd = new Value(_this.base, _this.properties.slice(i)); - if (fst.isComplex()) { - ref = new Literal(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, fst)); - snd.base = ref; - } - return new If(new Existence(fst), snd, { - soak: true - }); - } - return null; - })(); - return this.unfoldedSoak = result || false; - }; - - return Value; - - })(Base); - - exports.Comment = Comment = (function(_super) { - - __extends(Comment, _super); - - function Comment(comment) { - this.comment = comment; - } - - Comment.prototype.isStatement = YES; - - Comment.prototype.makeReturn = THIS; - - Comment.prototype.compileNode = function(o, level) { - var code; - code = '/*' + multident(this.comment, this.tab) + ("\n" + this.tab + "*/"); - if ((level || o.level) === LEVEL_TOP) code = o.indent + code; - return code; - }; - - return Comment; - - })(Base); - - exports.Call = Call = (function(_super) { - - __extends(Call, _super); - - function Call(variable, args, soak) { - this.args = args != null ? args : []; - this.soak = soak; - this.isNew = false; - this.isSuper = variable === 'super'; - this.variable = this.isSuper ? null : variable; - } - - Call.prototype.children = ['variable', 'args']; - - Call.prototype.newInstance = function() { - var base, _ref2; - base = ((_ref2 = this.variable) != null ? _ref2.base : void 0) || this.variable; - if (base instanceof Call && !base.isNew) { - base.newInstance(); - } else { - this.isNew = true; - } - return this; - }; - - Call.prototype.superReference = function(o) { - var accesses, method, name; - method = o.scope.method; - if (!method) throw SyntaxError('cannot call super outside of a function.'); - name = method.name; - if (name == null) { - throw SyntaxError('cannot call super on an anonymous function.'); - } - if (method.klass) { - accesses = [new Access(new Literal('__super__'))]; - if (method.static) accesses.push(new Access(new Literal('constructor'))); - accesses.push(new Access(new Literal(name))); - return (new Value(new Literal(method.klass), accesses)).compile(o); - } else { - return "" + name + ".__super__.constructor"; - } - }; - - Call.prototype.unfoldSoak = function(o) { - var call, ifn, left, list, rite, _i, _len, _ref2, _ref3; - if (this.soak) { - if (this.variable) { - if (ifn = unfoldSoak(o, this, 'variable')) return ifn; - _ref2 = new Value(this.variable).cacheReference(o), left = _ref2[0], rite = _ref2[1]; - } else { - left = new Literal(this.superReference(o)); - rite = new Value(left); - } - rite = new Call(rite, this.args); - rite.isNew = this.isNew; - left = new Literal("typeof " + (left.compile(o)) + " === \"function\""); - return new If(left, new Value(rite), { - soak: true - }); - } - call = this; - list = []; - while (true) { - if (call.variable instanceof Call) { - list.push(call); - call = call.variable; - continue; - } - if (!(call.variable instanceof Value)) break; - list.push(call); - if (!((call = call.variable.base) instanceof Call)) break; - } - _ref3 = list.reverse(); - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - call = _ref3[_i]; - if (ifn) { - if (call.variable instanceof Call) { - call.variable = ifn; - } else { - call.variable.base = ifn; - } - } - ifn = unfoldSoak(o, call, 'variable'); - } - return ifn; - }; - - Call.prototype.filterImplicitObjects = function(list) { - var node, nodes, obj, prop, properties, _i, _j, _len, _len2, _ref2; - nodes = []; - for (_i = 0, _len = list.length; _i < _len; _i++) { - node = list[_i]; - if (!((typeof node.isObject === "function" ? node.isObject() : void 0) && node.base.generated)) { - nodes.push(node); - continue; - } - obj = null; - _ref2 = node.base.properties; - for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { - prop = _ref2[_j]; - if (prop instanceof Assign || prop instanceof Comment) { - if (!obj) nodes.push(obj = new Obj(properties = [], true)); - properties.push(prop); - } else { - nodes.push(prop); - obj = null; - } - } - } - return nodes; - }; - - Call.prototype.compileNode = function(o) { - var arg, args, code, _ref2; - if ((_ref2 = this.variable) != null) _ref2.front = this.front; - if (code = Splat.compileSplattedArray(o, this.args, true)) { - return this.compileSplat(o, code); - } - args = this.filterImplicitObjects(this.args); - args = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - _results.push(arg.compile(o, LEVEL_LIST)); - } - return _results; - })()).join(', '); - if (this.isSuper) { - return this.superReference(o) + (".call(this" + (args && ', ' + args) + ")"); - } else { - return (this.isNew ? 'new ' : '') + this.variable.compile(o, LEVEL_ACCESS) + ("(" + args + ")"); - } - }; - - Call.prototype.compileSuper = function(args, o) { - return "" + (this.superReference(o)) + ".call(this" + (args.length ? ', ' : '') + args + ")"; - }; - - Call.prototype.compileSplat = function(o, splatArgs) { - var base, fun, idt, name, ref; - if (this.isSuper) { - return "" + (this.superReference(o)) + ".apply(this, " + splatArgs + ")"; - } - if (this.isNew) { - idt = this.tab + TAB; - return "(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return typeof result === \"object\" ? result : child;\n" + this.tab + "})(" + (this.variable.compile(o, LEVEL_LIST)) + ", " + splatArgs + ", function() {})"; - } - base = new Value(this.variable); - if ((name = base.properties.pop()) && base.isComplex()) { - ref = o.scope.freeVariable('ref'); - fun = "(" + ref + " = " + (base.compile(o, LEVEL_LIST)) + ")" + (name.compile(o)); - } else { - fun = base.compile(o, LEVEL_ACCESS); - if (SIMPLENUM.test(fun)) fun = "(" + fun + ")"; - if (name) { - ref = fun; - fun += name.compile(o); - } else { - ref = 'null'; - } - } - return "" + fun + ".apply(" + ref + ", " + splatArgs + ")"; - }; - - return Call; - - })(Base); - - exports.Extends = Extends = (function(_super) { - - __extends(Extends, _super); - - function Extends(child, parent) { - this.child = child; - this.parent = parent; - } - - Extends.prototype.children = ['child', 'parent']; - - Extends.prototype.compile = function(o) { - return new Call(new Value(new Literal(utility('extends'))), [this.child, this.parent]).compile(o); - }; - - return Extends; - - })(Base); - - exports.Access = Access = (function(_super) { - - __extends(Access, _super); - - function Access(name, tag) { - this.name = name; - this.name.asKey = true; - this.soak = tag === 'soak'; - } - - Access.prototype.children = ['name']; - - Access.prototype.compile = function(o) { - var name; - name = this.name.compile(o); - if (IDENTIFIER.test(name)) { - return "." + name; - } else { - return "[" + name + "]"; - } - }; - - Access.prototype.isComplex = NO; - - return Access; - - })(Base); - - exports.Index = Index = (function(_super) { - - __extends(Index, _super); - - function Index(index) { - this.index = index; - } - - Index.prototype.children = ['index']; - - Index.prototype.compile = function(o) { - return "[" + (this.index.compile(o, LEVEL_PAREN)) + "]"; - }; - - Index.prototype.isComplex = function() { - return this.index.isComplex(); - }; - - return Index; - - })(Base); - - exports.Range = Range = (function(_super) { - - __extends(Range, _super); - - Range.prototype.children = ['from', 'to']; - - function Range(from, to, tag) { - this.from = from; - this.to = to; - this.exclusive = tag === 'exclusive'; - this.equals = this.exclusive ? '' : '='; - } - - Range.prototype.compileVariables = function(o) { - var step, _ref2, _ref3, _ref4, _ref5; - o = merge(o, { - top: true - }); - _ref2 = this.from.cache(o, LEVEL_LIST), this.fromC = _ref2[0], this.fromVar = _ref2[1]; - _ref3 = this.to.cache(o, LEVEL_LIST), this.toC = _ref3[0], this.toVar = _ref3[1]; - if (step = del(o, 'step')) { - _ref4 = step.cache(o, LEVEL_LIST), this.step = _ref4[0], this.stepVar = _ref4[1]; - } - _ref5 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref5[0], this.toNum = _ref5[1]; - if (this.stepVar) return this.stepNum = this.stepVar.match(SIMPLENUM); - }; - - Range.prototype.compileNode = function(o) { - var cond, condPart, from, gt, idx, known, lt, stepPart, to, varPart, _ref2, _ref3; - if (!this.fromVar) this.compileVariables(o); - if (!o.index) return this.compileArray(o); - known = this.fromNum && this.toNum; - idx = del(o, 'index'); - varPart = "" + idx + " = " + this.fromC; - if (this.toC !== this.toVar) varPart += ", " + this.toC; - if (this.step !== this.stepVar) varPart += ", " + this.step; - _ref2 = ["" + idx + " <" + this.equals, "" + idx + " >" + this.equals], lt = _ref2[0], gt = _ref2[1]; - condPart = this.stepNum ? +this.stepNum > 0 ? "" + lt + " " + this.toVar : "" + gt + " " + this.toVar : known ? ((_ref3 = [+this.fromNum, +this.toNum], from = _ref3[0], to = _ref3[1], _ref3), from <= to ? "" + lt + " " + to : "" + gt + " " + to) : (cond = "" + this.fromVar + " <= " + this.toVar, "" + cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); - stepPart = this.stepVar ? "" + idx + " += " + this.stepVar : known ? from <= to ? "" + idx + "++" : "" + idx + "--" : "" + cond + " ? " + idx + "++ : " + idx + "--"; - return "" + varPart + "; " + condPart + "; " + stepPart; - }; - - Range.prototype.compileArray = function(o) { - var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results; - if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) { - range = (function() { - _results = []; - for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); } - return _results; - }).apply(this); - if (this.exclusive) range.pop(); - return "[" + (range.join(', ')) + "]"; - } - idt = this.tab + TAB; - i = o.scope.freeVariable('i'); - result = o.scope.freeVariable('results'); - pre = "\n" + idt + result + " = [];"; - if (this.fromNum && this.toNum) { - o.index = i; - body = this.compileNode(o); - } else { - vars = ("" + i + " = " + this.fromC) + (this.toC !== this.toVar ? ", " + this.toC : ''); - cond = "" + this.fromVar + " <= " + this.toVar; - body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; - } - post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; - hasArgs = function(node) { - return node != null ? node.contains(function(n) { - return n instanceof Literal && n.value === 'arguments' && !n.asKey; - }) : void 0; - }; - if (hasArgs(this.from) || hasArgs(this.to)) args = ', arguments'; - return "(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this" + (args != null ? args : '') + ")"; - }; - - return Range; - - })(Base); - - exports.Slice = Slice = (function(_super) { - - __extends(Slice, _super); - - Slice.prototype.children = ['range']; - - function Slice(range) { - this.range = range; - Slice.__super__.constructor.call(this); - } - - Slice.prototype.compileNode = function(o) { - var compiled, from, fromStr, to, toStr, _ref2; - _ref2 = this.range, to = _ref2.to, from = _ref2.from; - fromStr = from && from.compile(o, LEVEL_PAREN) || '0'; - compiled = to && to.compile(o, LEVEL_ACCESS); - if (to && !(!this.range.exclusive && +compiled === -1)) { - toStr = ', ' + (this.range.exclusive ? compiled : SIMPLENUM.test(compiled) ? (+compiled + 1).toString() : "" + compiled + " + 1 || 9e9"); - } - return ".slice(" + fromStr + (toStr || '') + ")"; - }; - - return Slice; - - })(Base); - - exports.Obj = Obj = (function(_super) { - - __extends(Obj, _super); - - function Obj(props, generated) { - this.generated = generated != null ? generated : false; - this.objects = this.properties = props || []; - } - - Obj.prototype.children = ['properties']; - - Obj.prototype.compileNode = function(o) { - var i, idt, indent, join, lastNoncom, node, obj, prop, props, _i, _len; - props = this.properties; - if (!props.length) return (this.front ? '({})' : '{}'); - if (this.generated) { - for (_i = 0, _len = props.length; _i < _len; _i++) { - node = props[_i]; - if (node instanceof Value) { - throw new Error('cannot have an implicit value in an implicit object'); - } - } - } - idt = o.indent += TAB; - lastNoncom = this.lastNonComment(this.properties); - props = (function() { - var _len2, _results; - _results = []; - for (i = 0, _len2 = props.length; i < _len2; i++) { - prop = props[i]; - join = i === props.length - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; - indent = prop instanceof Comment ? '' : idt; - if (prop instanceof Value && prop["this"]) { - prop = new Assign(prop.properties[0].name, prop, 'object'); - } - if (!(prop instanceof Comment)) { - if (!(prop instanceof Assign)) prop = new Assign(prop, prop, 'object'); - (prop.variable.base || prop.variable).asKey = true; - } - _results.push(indent + prop.compile(o, LEVEL_TOP) + join); - } - return _results; - })(); - props = props.join(''); - obj = "{" + (props && '\n' + props + '\n' + this.tab) + "}"; - if (this.front) { - return "(" + obj + ")"; - } else { - return obj; - } - }; - - Obj.prototype.assigns = function(name) { - var prop, _i, _len, _ref2; - _ref2 = this.properties; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - prop = _ref2[_i]; - if (prop.assigns(name)) return true; - } - return false; - }; - - return Obj; - - })(Base); - - exports.Arr = Arr = (function(_super) { - - __extends(Arr, _super); - - function Arr(objs) { - this.objects = objs || []; - } - - Arr.prototype.children = ['objects']; - - Arr.prototype.filterImplicitObjects = Call.prototype.filterImplicitObjects; - - Arr.prototype.compileNode = function(o) { - var code, obj, objs; - if (!this.objects.length) return '[]'; - o.indent += TAB; - objs = this.filterImplicitObjects(this.objects); - if (code = Splat.compileSplattedArray(o, objs)) return code; - code = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = objs.length; _i < _len; _i++) { - obj = objs[_i]; - _results.push(obj.compile(o, LEVEL_LIST)); - } - return _results; - })()).join(', '); - if (code.indexOf('\n') >= 0) { - return "[\n" + o.indent + code + "\n" + this.tab + "]"; - } else { - return "[" + code + "]"; - } - }; - - Arr.prototype.assigns = function(name) { - var obj, _i, _len, _ref2; - _ref2 = this.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (obj.assigns(name)) return true; - } - return false; - }; - - return Arr; - - })(Base); - - exports.Class = Class = (function(_super) { - - __extends(Class, _super); - - function Class(variable, parent, body) { - this.variable = variable; - this.parent = parent; - this.body = body != null ? body : new Block; - this.boundFuncs = []; - this.body.classBody = true; - } - - Class.prototype.children = ['variable', 'parent', 'body']; - - Class.prototype.determineName = function() { - var decl, tail; - if (!this.variable) return null; - decl = (tail = last(this.variable.properties)) ? tail instanceof Access && tail.name.value : this.variable.base.value; - return decl && (decl = IDENTIFIER.test(decl) && decl); - }; - - Class.prototype.setContext = function(name) { - return this.body.traverseChildren(false, function(node) { - if (node.classBody) return false; - if (node instanceof Literal && node.value === 'this') { - return node.value = name; - } else if (node instanceof Code) { - node.klass = name; - if (node.bound) return node.context = name; - } - }); - }; - - Class.prototype.addBoundFunctions = function(o) { - var bvar, lhs, _i, _len, _ref2, _results; - if (this.boundFuncs.length) { - _ref2 = this.boundFuncs; - _results = []; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - bvar = _ref2[_i]; - lhs = (new Value(new Literal("this"), [new Access(bvar)])).compile(o); - _results.push(this.ctor.body.unshift(new Literal("" + lhs + " = " + (utility('bind')) + "(" + lhs + ", this)"))); - } - return _results; - } - }; - - Class.prototype.addProperties = function(node, name, o) { - var assign, base, exprs, func, props; - props = node.base.properties.slice(0); - exprs = (function() { - var _results; - _results = []; - while (assign = props.shift()) { - if (assign instanceof Assign) { - base = assign.variable.base; - delete assign.context; - func = assign.value; - if (base.value === 'constructor') { - if (this.ctor) { - throw new Error('cannot define more than one constructor in a class'); - } - if (func.bound) { - throw new Error('cannot define a constructor as a bound function'); - } - if (func instanceof Code) { - assign = this.ctor = func; - } else { - this.externalCtor = o.scope.freeVariable('class'); - assign = new Assign(new Literal(this.externalCtor), func); - } - } else { - if (assign.variable["this"]) { - func.static = true; - if (func.bound) func.context = name; - } else { - assign.variable = new Value(new Literal(name), [new Access(new Literal('prototype')), new Access(base)]); - if (func instanceof Code && func.bound) { - this.boundFuncs.push(base); - func.bound = false; - } - } - } - } - _results.push(assign); - } - return _results; - }).call(this); - return compact(exprs); - }; - - Class.prototype.walkBody = function(name, o) { - var _this = this; - return this.traverseChildren(false, function(child) { - var exps, i, node, _len, _ref2; - if (child instanceof Class) return false; - if (child instanceof Block) { - _ref2 = exps = child.expressions; - for (i = 0, _len = _ref2.length; i < _len; i++) { - node = _ref2[i]; - if (node instanceof Value && node.isObject(true)) { - exps[i] = _this.addProperties(node, name, o); - } - } - return child.expressions = exps = flatten(exps); - } - }); - }; - - Class.prototype.ensureConstructor = function(name) { - if (!this.ctor) { - this.ctor = new Code; - if (this.parent) { - this.ctor.body.push(new Literal("" + name + ".__super__.constructor.apply(this, arguments)")); - } - if (this.externalCtor) { - this.ctor.body.push(new Literal("" + this.externalCtor + ".apply(this, arguments)")); - } - this.body.expressions.unshift(this.ctor); - } - this.ctor.ctor = this.ctor.name = name; - this.ctor.klass = null; - return this.ctor.noReturn = true; - }; - - Class.prototype.compileNode = function(o) { - var call, decl, klass, lname, name; - decl = this.determineName(); - name = decl || this.name || '_Class'; - if (name.reserved) name = "_" + name; - lname = new Literal(name); - this.setContext(name); - this.walkBody(name, o); - this.ensureConstructor(name); - this.body.spaced = true; - if (!(this.ctor instanceof Code)) this.body.expressions.unshift(this.ctor); - this.body.expressions.push(lname); - this.addBoundFunctions(o); - call = Closure.wrap(this.body); - if (this.parent) { - this.superClass = new Literal(o.scope.freeVariable('super', false)); - this.body.expressions.unshift(new Extends(lname, this.superClass)); - call.args.push(this.parent); - call.variable.params.push(new Param(this.superClass)); - } - klass = new Parens(call, true); - if (this.variable) klass = new Assign(this.variable, klass); - return klass.compile(o); - }; - - return Class; - - })(Base); - - exports.Assign = Assign = (function(_super) { - - __extends(Assign, _super); - - function Assign(variable, value, context, options) { - this.variable = variable; - this.value = value; - this.context = context; - this.param = options && options.param; - this.subpattern = options && options.subpattern; - } - - Assign.prototype.children = ['variable', 'value']; - - Assign.prototype.isStatement = function(o) { - return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && __indexOf.call(this.context, "?") >= 0; - }; - - Assign.prototype.assigns = function(name) { - return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); - }; - - Assign.prototype.unfoldSoak = function(o) { - return unfoldSoak(o, this, 'variable'); - }; - - Assign.prototype.compileNode = function(o) { - var isValue, match, name, val, varBase, _ref2, _ref3, _ref4, _ref5; - if (isValue = this.variable instanceof Value) { - if (this.variable.isArray() || this.variable.isObject()) { - return this.compilePatternMatch(o); - } - if (this.variable.isSplice()) return this.compileSplice(o); - if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') { - return this.compileConditional(o); - } - } - name = this.variable.compile(o, LEVEL_LIST); - if (!this.context) { - if (!(varBase = this.variable.unwrapAll()).isAssignable()) { - throw SyntaxError("\"" + (this.variable.compile(o)) + "\" cannot be assigned."); - } - if (!(typeof varBase.hasProperties === "function" ? varBase.hasProperties() : void 0)) { - if (this.param) { - o.scope.add(name, 'var'); - } else { - o.scope.find(name); - } - } - } - if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) { - if (match[1]) this.value.klass = match[1]; - this.value.name = (_ref3 = (_ref4 = (_ref5 = match[2]) != null ? _ref5 : match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5]; - } - val = this.value.compile(o, LEVEL_LIST); - if (this.context === 'object') return "" + name + ": " + val; - val = name + (" " + (this.context || '=') + " ") + val; - if (o.level <= LEVEL_LIST) { - return val; - } else { - return "(" + val + ")"; - } - }; - - Assign.prototype.compilePatternMatch = function(o) { - var acc, assigns, code, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8; - top = o.level === LEVEL_TOP; - value = this.value; - objects = this.variable.base.objects; - if (!(olen = objects.length)) { - code = value.compile(o); - if (o.level >= LEVEL_OP) { - return "(" + code + ")"; - } else { - return code; - } - } - isObject = this.variable.isObject(); - if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) { - if (obj instanceof Assign) { - _ref2 = obj, (_ref3 = _ref2.variable, idx = _ref3.base), obj = _ref2.value; - } else { - if (obj.base instanceof Parens) { - _ref4 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref4[0], idx = _ref4[1]; - } else { - idx = isObject ? obj["this"] ? obj.properties[0].name : obj : new Literal(0); - } - } - acc = IDENTIFIER.test(idx.unwrap().value || 0); - value = new Value(value); - value.properties.push(new (acc ? Access : Index)(idx)); - if (_ref5 = obj.unwrap().value, __indexOf.call(['arguments', 'eval'].concat(RESERVED), _ref5) >= 0) { - throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (value.compile(o))); - } - return new Assign(obj, value, null, { - param: this.param - }).compile(o, LEVEL_TOP); - } - vvar = value.compile(o, LEVEL_LIST); - assigns = []; - splat = false; - if (!IDENTIFIER.test(vvar) || this.variable.assigns(vvar)) { - assigns.push("" + (ref = o.scope.freeVariable('ref')) + " = " + vvar); - vvar = ref; - } - for (i = 0, _len = objects.length; i < _len; i++) { - obj = objects[i]; - idx = i; - if (isObject) { - if (obj instanceof Assign) { - _ref6 = obj, (_ref7 = _ref6.variable, idx = _ref7.base), obj = _ref6.value; - } else { - if (obj.base instanceof Parens) { - _ref8 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref8[0], idx = _ref8[1]; - } else { - idx = obj["this"] ? obj.properties[0].name : obj; - } - } - } - if (!splat && obj instanceof Splat) { - name = obj.name.unwrap().value; - obj = obj.unwrap(); - val = "" + olen + " <= " + vvar + ".length ? " + (utility('slice')) + ".call(" + vvar + ", " + i; - if (rest = olen - i - 1) { - ivar = o.scope.freeVariable('i'); - val += ", " + ivar + " = " + vvar + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; - } else { - val += ") : []"; - } - val = new Literal(val); - splat = "" + ivar + "++"; - } else { - name = obj.unwrap().value; - if (obj instanceof Splat) { - obj = obj.name.compile(o); - throw new SyntaxError("multiple splats are disallowed in an assignment: " + obj + "..."); - } - if (typeof idx === 'number') { - idx = new Literal(splat || idx); - acc = false; - } else { - acc = isObject && IDENTIFIER.test(idx.unwrap().value || 0); - } - val = new Value(new Literal(vvar), [new (acc ? Access : Index)(idx)]); - } - if ((name != null) && __indexOf.call(['arguments', 'eval'].concat(RESERVED), name) >= 0) { - throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (val.compile(o))); - } - assigns.push(new Assign(obj, val, null, { - param: this.param, - subpattern: true - }).compile(o, LEVEL_LIST)); - } - if (!(top || this.subpattern)) assigns.push(vvar); - code = assigns.join(', '); - if (o.level < LEVEL_LIST) { - return code; - } else { - return "(" + code + ")"; - } - }; - - Assign.prototype.compileConditional = function(o) { - var left, rite, _ref2; - _ref2 = this.variable.cacheReference(o), left = _ref2[0], rite = _ref2[1]; - if (__indexOf.call(this.context, "?") >= 0) o.isExistentialEquals = true; - return new Op(this.context.slice(0, -1), left, new Assign(rite, this.value, '=')).compile(o); - }; - - Assign.prototype.compileSplice = function(o) { - var code, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4; - _ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive; - name = this.variable.compile(o); - _ref3 = (from != null ? from.cache(o, LEVEL_OP) : void 0) || ['0', '0'], fromDecl = _ref3[0], fromRef = _ref3[1]; - if (to) { - if ((from != null ? from.isSimpleNumber() : void 0) && to.isSimpleNumber()) { - to = +to.compile(o) - +fromRef; - if (!exclusive) to += 1; - } else { - to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef; - if (!exclusive) to += ' + 1'; - } - } else { - to = "9e9"; - } - _ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1]; - code = "[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat(" + valDef + ")), " + valRef; - if (o.level > LEVEL_TOP) { - return "(" + code + ")"; - } else { - return code; - } - }; - - return Assign; - - })(Base); - - exports.Code = Code = (function(_super) { - - __extends(Code, _super); - - function Code(params, body, tag) { - this.params = params || []; - this.body = body || new Block; - this.bound = tag === 'boundfunc'; - if (this.bound) this.context = '_this'; - } - - Code.prototype.children = ['params', 'body']; - - Code.prototype.isStatement = function() { - return !!this.ctor; - }; - - Code.prototype.jumps = NO; - - Code.prototype.compileNode = function(o) { - var code, exprs, i, idt, lit, p, param, ref, splats, v, val, vars, wasEmpty, _i, _j, _k, _len, _len2, _len3, _len4, _ref2, _ref3, _ref4, _ref5, _ref6; - o.scope = new Scope(o.scope, this.body, this); - o.scope.shared = del(o, 'sharedScope'); - o.indent += TAB; - delete o.bare; - vars = []; - exprs = []; - _ref2 = this.params; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - param = _ref2[_i]; - if (!param.splat) continue; - _ref3 = this.params; - for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) { - p = _ref3[_j]; - if (p.name.value) o.scope.add(p.name.value, 'var', true); - } - splats = new Assign(new Value(new Arr((function() { - var _k, _len3, _ref4, _results; - _ref4 = this.params; - _results = []; - for (_k = 0, _len3 = _ref4.length; _k < _len3; _k++) { - p = _ref4[_k]; - _results.push(p.asReference(o)); - } - return _results; - }).call(this))), new Value(new Literal('arguments'))); - break; - } - _ref4 = this.params; - for (_k = 0, _len3 = _ref4.length; _k < _len3; _k++) { - param = _ref4[_k]; - if (param.isComplex()) { - val = ref = param.asReference(o); - if (param.value) val = new Op('?', ref, param.value); - exprs.push(new Assign(new Value(param.name), val, '=', { - param: true - })); - } else { - ref = param; - if (param.value) { - lit = new Literal(ref.name.value + ' == null'); - val = new Assign(new Value(param.name), param.value, '='); - exprs.push(new If(lit, val)); - } - } - if (!splats) vars.push(ref); - } - wasEmpty = this.body.isEmpty(); - if (splats) exprs.unshift(splats); - if (exprs.length) { - (_ref5 = this.body.expressions).unshift.apply(_ref5, exprs); - } - if (!splats) { - for (i = 0, _len4 = vars.length; i < _len4; i++) { - v = vars[i]; - o.scope.parameter(vars[i] = v.compile(o)); - } - } - if (!(wasEmpty || this.noReturn)) this.body.makeReturn(); - if (this.bound) { - if ((_ref6 = o.scope.parent.method) != null ? _ref6.bound : void 0) { - this.bound = this.context = o.scope.parent.method.context; - } else if (!this.static) { - o.scope.parent.assign('_this', 'this'); - } - } - idt = o.indent; - code = 'function'; - if (this.ctor) code += ' ' + this.name; - code += '(' + vars.join(', ') + ') {'; - if (!this.body.isEmpty()) { - code += "\n" + (this.body.compileWithDeclarations(o)) + "\n" + this.tab; - } - code += '}'; - if (this.ctor) return this.tab + code; - if (this.front || (o.level >= LEVEL_ACCESS)) { - return "(" + code + ")"; - } else { - return code; - } - }; - - Code.prototype.traverseChildren = function(crossScope, func) { - if (crossScope) { - return Code.__super__.traverseChildren.call(this, crossScope, func); - } - }; - - return Code; - - })(Base); - - exports.Param = Param = (function(_super) { - - __extends(Param, _super); - - function Param(name, value, splat) { - this.name = name; - this.value = value; - this.splat = splat; - } - - Param.prototype.children = ['name', 'value']; - - Param.prototype.compile = function(o) { - return this.name.compile(o, LEVEL_LIST); - }; - - Param.prototype.asReference = function(o) { - var node; - if (this.reference) return this.reference; - node = this.name; - if (node["this"]) { - node = node.properties[0].name; - if (node.value.reserved) node = new Literal('_' + node.value); - } else if (node.isComplex()) { - node = new Literal(o.scope.freeVariable('arg')); - } - node = new Value(node); - if (this.splat) node = new Splat(node); - return this.reference = node; - }; - - Param.prototype.isComplex = function() { - return this.name.isComplex(); - }; - - return Param; - - })(Base); - - exports.Splat = Splat = (function(_super) { - - __extends(Splat, _super); - - Splat.prototype.children = ['name']; - - Splat.prototype.isAssignable = YES; - - function Splat(name) { - this.name = name.compile ? name : new Literal(name); - } - - Splat.prototype.assigns = function(name) { - return this.name.assigns(name); - }; - - Splat.prototype.compile = function(o) { - if (this.index != null) { - return this.compileParam(o); - } else { - return this.name.compile(o); - } - }; - - Splat.prototype.unwrap = function() { - return this.name; - }; - - Splat.compileSplattedArray = function(o, list, apply) { - var args, base, code, i, index, node, _len; - index = -1; - while ((node = list[++index]) && !(node instanceof Splat)) { - continue; - } - if (index >= list.length) return ''; - if (list.length === 1) { - code = list[0].compile(o, LEVEL_LIST); - if (apply) return code; - return "" + (utility('slice')) + ".call(" + code + ")"; - } - args = list.slice(index); - for (i = 0, _len = args.length; i < _len; i++) { - node = args[i]; - code = node.compile(o, LEVEL_LIST); - args[i] = node instanceof Splat ? "" + (utility('slice')) + ".call(" + code + ")" : "[" + code + "]"; - } - if (index === 0) { - return args[0] + (".concat(" + (args.slice(1).join(', ')) + ")"); - } - base = (function() { - var _i, _len2, _ref2, _results; - _ref2 = list.slice(0, index); - _results = []; - for (_i = 0, _len2 = _ref2.length; _i < _len2; _i++) { - node = _ref2[_i]; - _results.push(node.compile(o, LEVEL_LIST)); - } - return _results; - })(); - return "[" + (base.join(', ')) + "].concat(" + (args.join(', ')) + ")"; - }; - - return Splat; - - })(Base); - - exports.While = While = (function(_super) { - - __extends(While, _super); - - function While(condition, options) { - this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; - this.guard = options != null ? options.guard : void 0; - } - - While.prototype.children = ['condition', 'guard', 'body']; - - While.prototype.isStatement = YES; - - While.prototype.makeReturn = function(res) { - if (res) { - return While.__super__.makeReturn.apply(this, arguments); - } else { - this.returns = !this.jumps({ - loop: true - }); - return this; - } - }; - - While.prototype.addBody = function(body) { - this.body = body; - return this; - }; - - While.prototype.jumps = function() { - var expressions, node, _i, _len; - expressions = this.body.expressions; - if (!expressions.length) return false; - for (_i = 0, _len = expressions.length; _i < _len; _i++) { - node = expressions[_i]; - if (node.jumps({ - loop: true - })) return node; - } - return false; - }; - - While.prototype.compileNode = function(o) { - var body, code, rvar, set; - o.indent += TAB; - set = ''; - body = this.body; - if (body.isEmpty()) { - body = ''; - } else { - if (this.returns) { - body.makeReturn(rvar = o.scope.freeVariable('results')); - set = "" + this.tab + rvar + " = [];\n"; - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal("continue"))); - } else { - if (this.guard) body = Block.wrap([new If(this.guard, body)]); - } - } - body = "\n" + (body.compile(o, LEVEL_TOP)) + "\n" + this.tab; - } - code = set + this.tab + ("while (" + (this.condition.compile(o, LEVEL_PAREN)) + ") {" + body + "}"); - if (this.returns) code += "\n" + this.tab + "return " + rvar + ";"; - return code; - }; - - return While; - - })(Base); - - exports.Op = Op = (function(_super) { - var CONVERSIONS, INVERSIONS; - - __extends(Op, _super); - - function Op(op, first, second, flip) { - var call; - if (op === 'in') return new In(first, second); - if (op === 'do') { - call = new Call(first, first.params || []); - call["do"] = true; - return call; - } - if (op === 'new') { - if (first instanceof Call && !first["do"] && !first.isNew) { - return first.newInstance(); - } - if (first instanceof Code && first.bound || first["do"]) { - first = new Parens(first); - } - } - this.operator = CONVERSIONS[op] || op; - this.first = first; - this.second = second; - this.flip = !!flip; - return this; - } - - CONVERSIONS = { - '==': '===', - '!=': '!==', - 'of': 'in' - }; - - INVERSIONS = { - '!==': '===', - '===': '!==' - }; - - Op.prototype.children = ['first', 'second']; - - Op.prototype.isSimpleNumber = NO; - - Op.prototype.isUnary = function() { - return !this.second; - }; - - Op.prototype.isComplex = function() { - var _ref2; - return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex(); - }; - - Op.prototype.isChainable = function() { - var _ref2; - return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!=='; - }; - - Op.prototype.invert = function() { - var allInvertable, curr, fst, op, _ref2; - if (this.isChainable() && this.first.isChainable()) { - allInvertable = true; - curr = this; - while (curr && curr.operator) { - allInvertable && (allInvertable = curr.operator in INVERSIONS); - curr = curr.first; - } - if (!allInvertable) return new Parens(this).invert(); - curr = this; - while (curr && curr.operator) { - curr.invert = !curr.invert; - curr.operator = INVERSIONS[curr.operator]; - curr = curr.first; - } - return this; - } else if (op = INVERSIONS[this.operator]) { - this.operator = op; - if (this.first.unwrap() instanceof Op) this.first.invert(); - return this; - } else if (this.second) { - return new Parens(this).invert(); - } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) { - return fst; - } else { - return new Op('!', this); - } - }; - - Op.prototype.unfoldSoak = function(o) { - var _ref2; - return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first'); - }; - - Op.prototype.compileNode = function(o) { - var code, isChain; - isChain = this.isChainable() && this.first.isChainable(); - if (!isChain) this.first.front = this.front; - if (this.isUnary()) return this.compileUnary(o); - if (isChain) return this.compileChain(o); - if (this.operator === '?') return this.compileExistence(o); - code = this.first.compile(o, LEVEL_OP) + ' ' + this.operator + ' ' + this.second.compile(o, LEVEL_OP); - if (o.level <= LEVEL_OP) { - return code; - } else { - return "(" + code + ")"; - } - }; - - Op.prototype.compileChain = function(o) { - var code, fst, shared, _ref2; - _ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1]; - fst = this.first.compile(o, LEVEL_OP); - code = "" + fst + " " + (this.invert ? '&&' : '||') + " " + (shared.compile(o)) + " " + this.operator + " " + (this.second.compile(o, LEVEL_OP)); - return "(" + code + ")"; - }; - - Op.prototype.compileExistence = function(o) { - var fst, ref; - if (this.first.isComplex() && o.level > LEVEL_TOP) { - ref = new Literal(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, this.first)); - } else { - fst = this.first; - ref = fst; - } - return new If(new Existence(fst), ref, { - type: 'if' - }).addElse(this.second).compile(o); - }; - - Op.prototype.compileUnary = function(o) { - var op, parts, plusMinus; - parts = [op = this.operator]; - plusMinus = op === '+' || op === '-'; - if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) { - parts.push(' '); - } - if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) { - this.first = new Parens(this.first); - } - parts.push(this.first.compile(o, LEVEL_OP)); - if (this.flip) parts.reverse(); - return parts.join(''); - }; - - Op.prototype.toString = function(idt) { - return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); - }; - - return Op; - - })(Base); - - exports.In = In = (function(_super) { - - __extends(In, _super); - - function In(object, array) { - this.object = object; - this.array = array; - } - - In.prototype.children = ['object', 'array']; - - In.prototype.invert = NEGATE; - - In.prototype.compileNode = function(o) { - var hasSplat, obj, _i, _len, _ref2; - if (this.array instanceof Value && this.array.isArray()) { - _ref2 = this.array.base.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (!(obj instanceof Splat)) continue; - hasSplat = true; - break; - } - if (!hasSplat) return this.compileOrTest(o); - } - return this.compileLoopTest(o); - }; - - In.prototype.compileOrTest = function(o) { - var cmp, cnj, i, item, ref, sub, tests, _ref2, _ref3; - if (this.array.base.objects.length === 0) return "" + (!!this.negated); - _ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1]; - _ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1]; - tests = (function() { - var _len, _ref4, _results; - _ref4 = this.array.base.objects; - _results = []; - for (i = 0, _len = _ref4.length; i < _len; i++) { - item = _ref4[i]; - _results.push((i ? ref : sub) + cmp + item.compile(o, LEVEL_ACCESS)); - } - return _results; - }).call(this); - tests = tests.join(cnj); - if (o.level < LEVEL_OP) { - return tests; - } else { - return "(" + tests + ")"; - } - }; - - In.prototype.compileLoopTest = function(o) { - var code, ref, sub, _ref2; - _ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1]; - code = utility('indexOf') + (".call(" + (this.array.compile(o, LEVEL_LIST)) + ", " + ref + ") ") + (this.negated ? '< 0' : '>= 0'); - if (sub === ref) return code; - code = sub + ', ' + code; - if (o.level < LEVEL_LIST) { - return code; - } else { - return "(" + code + ")"; - } - }; - - In.prototype.toString = function(idt) { - return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); - }; - - return In; - - })(Base); - - exports.Try = Try = (function(_super) { - - __extends(Try, _super); - - function Try(attempt, error, recovery, ensure) { - this.attempt = attempt; - this.error = error; - this.recovery = recovery; - this.ensure = ensure; - } - - Try.prototype.children = ['attempt', 'recovery', 'ensure']; - - Try.prototype.isStatement = YES; - - Try.prototype.jumps = function(o) { - var _ref2; - return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0); - }; - - Try.prototype.makeReturn = function(res) { - if (this.attempt) this.attempt = this.attempt.makeReturn(res); - if (this.recovery) this.recovery = this.recovery.makeReturn(res); - return this; - }; - - Try.prototype.compileNode = function(o) { - var catchPart, ensurePart, errorPart, tryPart; - o.indent += TAB; - errorPart = this.error ? " (" + (this.error.compile(o)) + ") " : ' '; - tryPart = this.attempt.compile(o, LEVEL_TOP); - catchPart = this.recovery ? (!o.scope.check(this.error.value) ? o.scope.add(this.error.value, 'param') : void 0, " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}") : !(this.ensure || this.recovery) ? ' catch (_error) {}' : void 0; - ensurePart = this.ensure ? " finally {\n" + (this.ensure.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : ''; - return "" + this.tab + "try {\n" + tryPart + "\n" + this.tab + "}" + (catchPart || '') + ensurePart; - }; - - return Try; - - })(Base); - - exports.Throw = Throw = (function(_super) { - - __extends(Throw, _super); - - function Throw(expression) { - this.expression = expression; - } - - Throw.prototype.children = ['expression']; - - Throw.prototype.isStatement = YES; - - Throw.prototype.jumps = NO; - - Throw.prototype.makeReturn = THIS; - - Throw.prototype.compileNode = function(o) { - return this.tab + ("throw " + (this.expression.compile(o)) + ";"); - }; - - return Throw; - - })(Base); - - exports.Existence = Existence = (function(_super) { - - __extends(Existence, _super); - - function Existence(expression) { - this.expression = expression; - } - - Existence.prototype.children = ['expression']; - - Existence.prototype.invert = NEGATE; - - Existence.prototype.compileNode = function(o) { - var cmp, cnj, code, _ref2; - this.expression.front = this.front; - code = this.expression.compile(o, LEVEL_OP); - if (IDENTIFIER.test(code) && !o.scope.check(code)) { - _ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1]; - code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null"; - } else { - code = "" + code + " " + (this.negated ? '==' : '!=') + " null"; - } - if (o.level <= LEVEL_COND) { - return code; - } else { - return "(" + code + ")"; - } - }; - - return Existence; - - })(Base); - - exports.Parens = Parens = (function(_super) { - - __extends(Parens, _super); - - function Parens(body) { - this.body = body; - } - - Parens.prototype.children = ['body']; - - Parens.prototype.unwrap = function() { - return this.body; - }; - - Parens.prototype.isComplex = function() { - return this.body.isComplex(); - }; - - Parens.prototype.compileNode = function(o) { - var bare, code, expr; - expr = this.body.unwrap(); - if (expr instanceof Value && expr.isAtomic()) { - expr.front = this.front; - return expr.compile(o); - } - code = expr.compile(o, LEVEL_PAREN); - bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)); - if (bare) { - return code; - } else { - return "(" + code + ")"; - } - }; - - return Parens; - - })(Base); - - exports.For = For = (function(_super) { - - __extends(For, _super); - - function For(body, source) { - var _ref2; - this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; - this.body = Block.wrap([body]); - this.own = !!source.own; - this.object = !!source.object; - if (this.object) { - _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1]; - } - if (this.index instanceof Value) { - throw SyntaxError('index cannot be a pattern matching expression'); - } - this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length; - this.pattern = this.name instanceof Value; - if (this.range && this.index) { - throw SyntaxError('indexes do not apply to range loops'); - } - if (this.range && this.pattern) { - throw SyntaxError('cannot pattern match over range loops'); - } - this.returns = false; - } - - For.prototype.children = ['body', 'source', 'guard', 'step']; - - For.prototype.compileNode = function(o) { - var body, defPart, forPart, forVarPart, guardPart, idt1, index, ivar, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, stepPart, stepvar, svar, varPart, _ref2; - body = Block.wrap([this.body]); - lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0; - if (lastJumps && lastJumps instanceof Return) this.returns = false; - source = this.range ? this.source.base : this.source; - scope = o.scope; - name = this.name && this.name.compile(o, LEVEL_LIST); - index = this.index && this.index.compile(o, LEVEL_LIST); - if (name && !this.pattern) { - scope.find(name, { - immediate: true - }); - } - if (index) { - scope.find(index, { - immediate: true - }); - } - if (this.returns) rvar = scope.freeVariable('results'); - ivar = (this.range ? name : index) || scope.freeVariable('i'); - if (this.step && !this.range) stepvar = scope.freeVariable("step"); - if (this.pattern) name = ivar; - varPart = ''; - guardPart = ''; - defPart = ''; - idt1 = this.tab + TAB; - if (this.range) { - forPart = source.compile(merge(o, { - index: ivar, - step: this.step - })); - } else { - svar = this.source.compile(o, LEVEL_LIST); - if ((name || this.own) && !IDENTIFIER.test(svar)) { - defPart = "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; - svar = ref; - } - if (name && !this.pattern) { - namePart = "" + name + " = " + svar + "[" + ivar + "]"; - } - if (!this.object) { - lvar = scope.freeVariable('len'); - forVarPart = ("" + ivar + " = 0, " + lvar + " = " + svar + ".length") + (this.step ? ", " + stepvar + " = " + (this.step.compile(o, LEVEL_OP)) : ''); - stepPart = this.step ? "" + ivar + " += " + stepvar : "" + ivar + "++"; - forPart = "" + forVarPart + "; " + ivar + " < " + lvar + "; " + stepPart; - } - } - if (this.returns) { - resultPart = "" + this.tab + rvar + " = [];\n"; - returnResult = "\n" + this.tab + "return " + rvar + ";"; - body.makeReturn(rvar); - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal("continue"))); - } else { - if (this.guard) body = Block.wrap([new If(this.guard, body)]); - } - } - if (this.pattern) { - body.expressions.unshift(new Assign(this.name, new Literal("" + svar + "[" + ivar + "]"))); - } - defPart += this.pluckDirectCall(o, body); - if (namePart) varPart = "\n" + idt1 + namePart + ";"; - if (this.object) { - forPart = "" + ivar + " in " + svar; - if (this.own) { - guardPart = "\n" + idt1 + "if (!" + (utility('hasProp')) + ".call(" + svar + ", " + ivar + ")) continue;"; - } - } - body = body.compile(merge(o, { - indent: idt1 - }), LEVEL_TOP); - if (body) body = '\n' + body + '\n'; - return "" + defPart + (resultPart || '') + this.tab + "for (" + forPart + ") {" + guardPart + varPart + body + this.tab + "}" + (returnResult || ''); - }; - - For.prototype.pluckDirectCall = function(o, body) { - var base, defs, expr, fn, idx, ref, val, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; - defs = ''; - _ref2 = body.expressions; - for (idx = 0, _len = _ref2.length; idx < _len; idx++) { - expr = _ref2[idx]; - expr = expr.unwrapAll(); - if (!(expr instanceof Call)) continue; - val = expr.variable.unwrapAll(); - if (!((val instanceof Code) || (val instanceof Value && ((_ref3 = val.base) != null ? _ref3.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref4 = (_ref5 = val.properties[0].name) != null ? _ref5.value : void 0) === 'call' || _ref4 === 'apply')))) { - continue; - } - fn = ((_ref6 = val.base) != null ? _ref6.unwrapAll() : void 0) || val; - ref = new Literal(o.scope.freeVariable('fn')); - base = new Value(ref); - if (val.base) _ref7 = [base, val], val.base = _ref7[0], base = _ref7[1]; - body.expressions[idx] = new Call(base, expr.args); - defs += this.tab + new Assign(ref, fn).compile(o, LEVEL_TOP) + ';\n'; - } - return defs; - }; - - return For; - - })(While); - - exports.Switch = Switch = (function(_super) { - - __extends(Switch, _super); - - function Switch(subject, cases, otherwise) { - this.subject = subject; - this.cases = cases; - this.otherwise = otherwise; - } - - Switch.prototype.children = ['subject', 'cases', 'otherwise']; - - Switch.prototype.isStatement = YES; - - Switch.prototype.jumps = function(o) { - var block, conds, _i, _len, _ref2, _ref3, _ref4; - if (o == null) { - o = { - block: true - }; - } - _ref2 = this.cases; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - _ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1]; - if (block.jumps(o)) return block; - } - return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0; - }; - - Switch.prototype.makeReturn = function(res) { - var pair, _i, _len, _ref2, _ref3; - _ref2 = this.cases; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - pair = _ref2[_i]; - pair[1].makeReturn(res); - } - if (res) { - this.otherwise || (this.otherwise = new Block([new Literal('void 0')])); - } - if ((_ref3 = this.otherwise) != null) _ref3.makeReturn(res); - return this; - }; - - Switch.prototype.compileNode = function(o) { - var block, body, code, cond, conditions, expr, i, idt1, idt2, _i, _len, _len2, _ref2, _ref3, _ref4, _ref5; - idt1 = o.indent + TAB; - idt2 = o.indent = idt1 + TAB; - code = this.tab + ("switch (" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : void 0) || false) + ") {\n"); - _ref3 = this.cases; - for (i = 0, _len = _ref3.length; i < _len; i++) { - _ref4 = _ref3[i], conditions = _ref4[0], block = _ref4[1]; - _ref5 = flatten([conditions]); - for (_i = 0, _len2 = _ref5.length; _i < _len2; _i++) { - cond = _ref5[_i]; - if (!this.subject) cond = cond.invert(); - code += idt1 + ("case " + (cond.compile(o, LEVEL_PAREN)) + ":\n"); - } - if (body = block.compile(o, LEVEL_TOP)) code += body + '\n'; - if (i === this.cases.length - 1 && !this.otherwise) break; - expr = this.lastNonComment(block.expressions); - if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { - continue; - } - code += idt2 + 'break;\n'; - } - if (this.otherwise && this.otherwise.expressions.length) { - code += idt1 + ("default:\n" + (this.otherwise.compile(o, LEVEL_TOP)) + "\n"); - } - return code + this.tab + '}'; - }; - - return Switch; - - })(Base); - - exports.If = If = (function(_super) { - - __extends(If, _super); - - function If(condition, body, options) { - this.body = body; - if (options == null) options = {}; - this.condition = options.type === 'unless' ? condition.invert() : condition; - this.elseBody = null; - this.isChain = false; - this.soak = options.soak; - } - - If.prototype.children = ['condition', 'body', 'elseBody']; - - If.prototype.bodyNode = function() { - var _ref2; - return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0; - }; - - If.prototype.elseBodyNode = function() { - var _ref2; - return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0; - }; - - If.prototype.addElse = function(elseBody) { - if (this.isChain) { - this.elseBodyNode().addElse(elseBody); - } else { - this.isChain = elseBody instanceof If; - this.elseBody = this.ensureBlock(elseBody); - } - return this; - }; - - If.prototype.isStatement = function(o) { - var _ref2; - return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0); - }; - - If.prototype.jumps = function(o) { - var _ref2; - return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0); - }; - - If.prototype.compileNode = function(o) { - if (this.isStatement(o)) { - return this.compileStatement(o); - } else { - return this.compileExpression(o); - } - }; - - If.prototype.makeReturn = function(res) { - if (res) { - this.elseBody || (this.elseBody = new Block([new Literal('void 0')])); - } - this.body && (this.body = new Block([this.body.makeReturn(res)])); - this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)])); - return this; - }; - - If.prototype.ensureBlock = function(node) { - if (node instanceof Block) { - return node; - } else { - return new Block([node]); - } - }; - - If.prototype.compileStatement = function(o) { - var body, bodyc, child, cond, exeq, ifPart, _ref2; - child = del(o, 'chainChild'); - exeq = del(o, 'isExistentialEquals'); - if (exeq) { - return new If(this.condition.invert(), this.elseBodyNode(), { - type: 'if' - }).compile(o); - } - cond = this.condition.compile(o, LEVEL_PAREN); - o.indent += TAB; - body = this.ensureBlock(this.body); - bodyc = body.compile(o); - if (1 === ((_ref2 = body.expressions) != null ? _ref2.length : void 0) && !this.elseBody && !child && bodyc && cond && -1 === (bodyc.indexOf('\n')) && 80 > cond.length + bodyc.length) { - return "" + this.tab + "if (" + cond + ") " + (bodyc.replace(/^\s+/, '')); - } - if (bodyc) bodyc = "\n" + bodyc + "\n" + this.tab; - ifPart = "if (" + cond + ") {" + bodyc + "}"; - if (!child) ifPart = this.tab + ifPart; - if (!this.elseBody) return ifPart; - return ifPart + ' else ' + (this.isChain ? (o.indent = this.tab, o.chainChild = true, this.elseBody.unwrap().compile(o, LEVEL_TOP)) : "{\n" + (this.elseBody.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}"); - }; - - If.prototype.compileExpression = function(o) { - var alt, body, code, cond; - cond = this.condition.compile(o, LEVEL_COND); - body = this.bodyNode().compile(o, LEVEL_LIST); - alt = this.elseBodyNode() ? this.elseBodyNode().compile(o, LEVEL_LIST) : 'void 0'; - code = "" + cond + " ? " + body + " : " + alt; - if (o.level >= LEVEL_COND) { - return "(" + code + ")"; - } else { - return code; - } - }; - - If.prototype.unfoldSoak = function() { - return this.soak && this; - }; - - return If; - - })(Base); - - Closure = { - wrap: function(expressions, statement, noReturn) { - var args, call, func, mentionsArgs, meth; - if (expressions.jumps()) return expressions; - func = new Code([], Block.wrap([expressions])); - args = []; - if ((mentionsArgs = expressions.contains(this.literalArgs)) || expressions.contains(this.literalThis)) { - meth = new Literal(mentionsArgs ? 'apply' : 'call'); - args = [new Literal('this')]; - if (mentionsArgs) args.push(new Literal('arguments')); - func = new Value(func, [new Access(meth)]); - } - func.noReturn = noReturn; - call = new Call(func, args); - if (statement) { - return Block.wrap([call]); - } else { - return call; - } - }, - literalArgs: function(node) { - return node instanceof Literal && node.value === 'arguments' && !node.asKey; - }, - literalThis: function(node) { - return (node instanceof Literal && node.value === 'this' && !node.asKey) || (node instanceof Code && node.bound); - } - }; - - unfoldSoak = function(o, parent, name) { - var ifn; - if (!(ifn = parent[name].unfoldSoak(o))) return; - parent[name] = ifn.body; - ifn.body = new Value(parent); - return ifn; - }; - - UTILITIES = { - "extends": function() { - return "function(child, parent) { for (var key in parent) { if (" + (utility('hasProp')) + ".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }"; - }, - bind: function() { - return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }'; - }, - indexOf: function() { - return "Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"; - }, - hasProp: function() { - return 'Object.prototype.hasOwnProperty'; - }, - slice: function() { - return 'Array.prototype.slice'; - } - }; - - LEVEL_TOP = 1; - - LEVEL_PAREN = 2; - - LEVEL_LIST = 3; - - LEVEL_COND = 4; - - LEVEL_OP = 5; - - LEVEL_ACCESS = 6; - - TAB = ' '; - - IDENTIFIER_STR = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; - - IDENTIFIER = RegExp("^" + IDENTIFIER_STR + "$"); - - SIMPLENUM = /^[+-]?\d+$/; - - METHOD_DEF = RegExp("^(?:(" + IDENTIFIER_STR + ")\\.prototype(?:\\.(" + IDENTIFIER_STR + ")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\]))|(" + IDENTIFIER_STR + ")$"); - - IS_STRING = /^['"]/; - - utility = function(name) { - var ref; - ref = "__" + name; - Scope.root.assign(ref, UTILITIES[name]()); - return ref; - }; - - multident = function(code, tab) { - code = code.replace(/\n/g, '$&' + tab); - return code.replace(/\s+$/, ''); - }; - -}).call(this); - -};require['./coffee-script'] = new function() { - var exports = this; - (function() { - var Lexer, RESERVED, compile, fs, lexer, parser, path, vm, _ref, - __hasProp = Object.prototype.hasOwnProperty; - - fs = require('fs'); - - path = require('path'); - - _ref = require('./lexer'), Lexer = _ref.Lexer, RESERVED = _ref.RESERVED; - - parser = require('./parser').parser; - - vm = require('vm'); - - if (require.extensions) { - require.extensions['.coffee'] = function(module, filename) { - var content; - content = compile(fs.readFileSync(filename, 'utf8'), { - filename: filename - }); - return module._compile(content, filename); - }; - } else if (require.registerExtension) { - require.registerExtension('.coffee', function(content) { - return compile(content); - }); - } - - exports.VERSION = '1.2.0'; - - exports.RESERVED = RESERVED; - - exports.helpers = require('./helpers'); - - exports.compile = compile = function(code, options) { - var merge; - if (options == null) options = {}; - merge = exports.helpers.merge; - try { - return (parser.parse(lexer.tokenize(code))).compile(merge({}, options)); - } catch (err) { - if (options.filename) { - err.message = "In " + options.filename + ", " + err.message; - } - throw err; - } - }; - - exports.tokens = function(code, options) { - return lexer.tokenize(code, options); - }; - - exports.nodes = function(source, options) { - if (typeof source === 'string') { - return parser.parse(lexer.tokenize(source, options)); - } else { - return parser.parse(source); - } - }; - - exports.run = function(code, options) { - var mainModule; - mainModule = require.main; - mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.'; - mainModule.moduleCache && (mainModule.moduleCache = {}); - mainModule.paths = require('module')._nodeModulePaths(path.dirname(options.filename)); - if (path.extname(mainModule.filename) !== '.coffee' || require.extensions) { - return mainModule._compile(compile(code, options), mainModule.filename); - } else { - return mainModule._compile(code, mainModule.filename); - } - }; - - exports.eval = function(code, options) { - var Module, Script, js, k, o, r, sandbox, v, _i, _len, _module, _ref2, _ref3, _require; - if (options == null) options = {}; - if (!(code = code.trim())) return; - Script = vm.Script; - if (Script) { - if (options.sandbox != null) { - if (options.sandbox instanceof Script.createContext().constructor) { - sandbox = options.sandbox; - } else { - sandbox = Script.createContext(); - _ref2 = options.sandbox; - for (k in _ref2) { - if (!__hasProp.call(_ref2, k)) continue; - v = _ref2[k]; - sandbox[k] = v; - } - } - sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox; - } else { - sandbox = global; - } - sandbox.__filename = options.filename || 'eval'; - sandbox.__dirname = path.dirname(sandbox.__filename); - if (!(sandbox !== global || sandbox.module || sandbox.require)) { - Module = require('module'); - sandbox.module = _module = new Module(options.modulename || 'eval'); - sandbox.require = _require = function(path) { - return Module._load(path, _module, true); - }; - _module.filename = sandbox.__filename; - _ref3 = Object.getOwnPropertyNames(require); - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - r = _ref3[_i]; - if (r !== 'paths') _require[r] = require[r]; - } - _require.paths = _module.paths = Module._nodeModulePaths(process.cwd()); - _require.resolve = function(request) { - return Module._resolveFilename(request, _module); - }; - } - } - o = {}; - for (k in options) { - if (!__hasProp.call(options, k)) continue; - v = options[k]; - o[k] = v; - } - o.bare = true; - js = compile(code, o); - if (sandbox === global) { - return vm.runInThisContext(js); - } else { - return vm.runInContext(js, sandbox); - } - }; - - lexer = new Lexer; - - parser.lexer = { - lex: function() { - var tag, _ref2; - _ref2 = this.tokens[this.pos++] || [''], tag = _ref2[0], this.yytext = _ref2[1], this.yylineno = _ref2[2]; - return tag; - }, - setInput: function(tokens) { - this.tokens = tokens; - return this.pos = 0; - }, - upcomingInput: function() { - return ""; - } - }; - - parser.yy = require('./nodes'); - -}).call(this); - -};require['./browser'] = new function() { - var exports = this; - (function() { - var CoffeeScript, runScripts; - - CoffeeScript = require('./coffee-script'); - - CoffeeScript.require = require; - - CoffeeScript.eval = function(code, options) { - return eval(CoffeeScript.compile(code, options)); - }; - - CoffeeScript.run = function(code, options) { - if (options == null) options = {}; - options.bare = true; - return Function(CoffeeScript.compile(code, options))(); - }; - - if (typeof window === "undefined" || window === null) return; - - CoffeeScript.load = function(url, callback) { - var xhr; - xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP'); - xhr.open('GET', url, true); - if ('overrideMimeType' in xhr) xhr.overrideMimeType('text/plain'); - xhr.onreadystatechange = function() { - var _ref; - if (xhr.readyState === 4) { - if ((_ref = xhr.status) === 0 || _ref === 200) { - CoffeeScript.run(xhr.responseText); - } else { - throw new Error("Could not load " + url); - } - if (callback) return callback(); - } - }; - return xhr.send(null); - }; - - runScripts = function() { - var coffees, execute, index, length, s, scripts; - scripts = document.getElementsByTagName('script'); - coffees = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = scripts.length; _i < _len; _i++) { - s = scripts[_i]; - if (s.type === 'text/coffeescript') _results.push(s); - } - return _results; - })(); - index = 0; - length = coffees.length; - (execute = function() { - var script; - script = coffees[index++]; - if ((script != null ? script.type : void 0) === 'text/coffeescript') { - if (script.src) { - return CoffeeScript.load(script.src, execute); - } else { - CoffeeScript.run(script.innerHTML); - return execute(); - } - } - })(); - return null; - }; - - if (window.addEventListener) { - addEventListener('DOMContentLoaded', runScripts, false); - } else { - attachEvent('onload', runScripts); - } - -}).call(this); - -}; - return require['./coffee-script']; - }(); - - if (typeof define === 'function' && define.amd) { - // define[NOTE: Added so it doesn't match regex /define\(/](function() { return CoffeeScript; }); - } else { - root.CoffeeScript = CoffeeScript; - } -}(this)); From 2ecb2d9ba154b4063bd344e31765d4c994f79086 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 13:39:51 -0700 Subject: [PATCH 043/281] Remove unneeded _.clone call This is no longer needed after upgrading underscore which fixed a bug with object equality across objects created in different contexts. --- src/app/git.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/git.coffee b/src/app/git.coffee index f824406e8..502b30203 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -107,7 +107,7 @@ class Git headCheckedOut getDiffStats: (path) -> - _.clone(@getRepo().getDiffStats(@relativize(path))) + @getRepo().getDiffStats(@relativize(path)) isSubmodule: (path) -> @getRepo().isSubmodule(@relativize(path)) From f3990722e3e24535b2ec1ab63b9ddc339fa60f42 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 15:38:11 -0700 Subject: [PATCH 044/281] Install node-gyp with custom node distribution This should be done before the rest of the dependencies are installed to that the correct headers are used for compiling native modules. --- script/bootstrap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/script/bootstrap b/script/bootstrap index 465b8195d..0fce8f71f 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -17,7 +17,8 @@ exit_unless_npm_exists() { exit_unless_xcode_exists exit_unless_npm_exists - -HOME=~/.cefode-gyp npm install --target=0.8.21 --dist-url=https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/dist --arch=ia32 +npm install node-gyp +HOME=~/.cefode-gyp node-gyp install --target=0.8.21 --dist-url=https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/dist --arch=ia32 +HOME=~/.cefode-gyp npm install --target=0.8.21 --arch=ia32 git submodule --quiet sync git submodule --quiet update --recursive --init From 5d8a40d240bcd1bb6899fbf69103774b10c40ce6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 15:48:29 -0700 Subject: [PATCH 045/281] Use d3 npm --- package.json | 3 +- .../lib/command-logger-view.coffee | 2 +- .../editor-stats/lib/editor-stats-view.coffee | 2 +- vendor/d3.v3.js | 7812 ----------------- 4 files changed, 4 insertions(+), 7815 deletions(-) delete mode 100644 vendor/d3.v3.js diff --git a/package.json b/package.json index 4b2f92479..e6f588686 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "oniguruma": "0.5.0", "mkdirp": "0.3.5", "git-utils": "0.3.0", - "underscore": "1.4.4" + "underscore": "1.4.4", + "d3": "3.0.8" }, "scripts": { diff --git a/src/packages/command-logger/lib/command-logger-view.coffee b/src/packages/command-logger/lib/command-logger-view.coffee index 510f8f2f9..1743857c8 100644 --- a/src/packages/command-logger/lib/command-logger-view.coffee +++ b/src/packages/command-logger/lib/command-logger-view.coffee @@ -96,7 +96,7 @@ class CommandLoggerView extends ScrollView w = @treeMap.width() h = @treeMap.height() - d3 = require 'd3.v3' + d3 = nodeRequire 'd3' x = d3.scale.linear().range([0, w]) y = d3.scale.linear().range([0, h]) diff --git a/src/packages/editor-stats/lib/editor-stats-view.coffee b/src/packages/editor-stats/lib/editor-stats-view.coffee index 850364c36..7f0d7314e 100644 --- a/src/packages/editor-stats/lib/editor-stats-view.coffee +++ b/src/packages/editor-stats/lib/editor-stats-view.coffee @@ -1,5 +1,5 @@ ScrollView = require 'scroll-view' -d3 = require 'd3.v3' +d3 = nodeRequire 'd3' _ = nodeRequire 'underscore' $ = require 'jquery' diff --git a/vendor/d3.v3.js b/vendor/d3.v3.js deleted file mode 100644 index 308385f6a..000000000 --- a/vendor/d3.v3.js +++ /dev/null @@ -1,7812 +0,0 @@ -// Modified to include a module.exports of the d3 variable -(function() { - var d3_format_decimalPoint = ".", d3_format_thousandsSeparator = ",", d3_format_grouping = [ 3, 3 ]; - if (!Date.now) Date.now = function() { - return +new Date(); - }; - try { - document.createElement("div").style.setProperty("opacity", 0, ""); - } catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; - } - var d3 = { - version: "3.0.0" - }; - var π = Math.PI, ε = 1e-6, d3_radians = π / 180, d3_degrees = 180 / π; - function d3_target(d) { - return d.target; - } - function d3_source(d) { - return d.source; - } - function d3_class(ctor, properties) { - try { - for (var key in properties) { - Object.defineProperty(ctor.prototype, key, { - value: properties[key], - enumerable: false - }); - } - } catch (e) { - ctor.prototype = properties; - } - } - var d3_array = d3_arraySlice; - function d3_arrayCopy(pseudoarray) { - var i = -1, n = pseudoarray.length, array = []; - while (++i < n) array.push(pseudoarray[i]); - return array; - } - function d3_arraySlice(pseudoarray) { - return Array.prototype.slice.call(pseudoarray); - } - try { - d3_array(document.documentElement.childNodes)[0].nodeType; - } catch (e) { - d3_array = d3_arrayCopy; - } - var d3_arraySubclass = [].__proto__ ? function(array, prototype) { - array.__proto__ = prototype; - } : function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; - }; - d3.map = function(object) { - var map = new d3_Map(); - for (var key in object) map.set(key, object[key]); - return map; - }; - function d3_Map() {} - d3_class(d3_Map, { - has: function(key) { - return d3_map_prefix + key in this; - }, - get: function(key) { - return this[d3_map_prefix + key]; - }, - set: function(key, value) { - return this[d3_map_prefix + key] = value; - }, - remove: function(key) { - key = d3_map_prefix + key; - return key in this && delete this[key]; - }, - keys: function() { - var keys = []; - this.forEach(function(key) { - keys.push(key); - }); - return keys; - }, - values: function() { - var values = []; - this.forEach(function(key, value) { - values.push(value); - }); - return values; - }, - entries: function() { - var entries = []; - this.forEach(function(key, value) { - entries.push({ - key: key, - value: value - }); - }); - return entries; - }, - forEach: function(f) { - for (var key in this) { - if (key.charCodeAt(0) === d3_map_prefixCode) { - f.call(this, key.substring(1), this[key]); - } - } - } - }); - var d3_map_prefix = "\0", d3_map_prefixCode = d3_map_prefix.charCodeAt(0); - function d3_identity(d) { - return d; - } - function d3_true() { - return true; - } - function d3_functor(v) { - return typeof v === "function" ? v : function() { - return v; - }; - } - d3.functor = d3_functor; - d3.rebind = function(target, source) { - var i = 1, n = arguments.length, method; - while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); - return target; - }; - function d3_rebind(target, source, method) { - return function() { - var value = method.apply(source, arguments); - return arguments.length ? target : value; - }; - } - d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; - }; - d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; - }; - d3.mean = function(array, f) { - var n = array.length, a, m = 0, i = -1, j = 0; - if (arguments.length === 1) { - while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j; - } else { - while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j; - } - return j ? m : undefined; - }; - d3.median = function(array, f) { - if (arguments.length > 1) array = array.map(f); - array = array.filter(d3_number); - return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined; - }; - d3.min = function(array, f) { - var i = -1, n = array.length, a, b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; - }; - d3.max = function(array, f) { - var i = -1, n = array.length, a, b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; - }; - d3.extent = function(array, f) { - var i = -1, n = array.length, a, b, c; - if (arguments.length === 1) { - while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined; - while (++i < n) if ((b = array[i]) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } else { - while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } - return [ a, c ]; - }; - d3.random = { - normal: function(µ, σ) { - var n = arguments.length; - if (n < 2) σ = 1; - if (n < 1) µ = 0; - return function() { - var x, y, r; - do { - x = Math.random() * 2 - 1; - y = Math.random() * 2 - 1; - r = x * x + y * y; - } while (!r || r > 1); - return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); - }; - }, - logNormal: function(µ, σ) { - var n = arguments.length; - if (n < 2) σ = 1; - if (n < 1) µ = 0; - var random = d3.random.normal(); - return function() { - return Math.exp(µ + σ * random()); - }; - }, - irwinHall: function(m) { - return function() { - for (var s = 0, j = 0; j < m; j++) s += Math.random(); - return s / m; - }; - } - }; - function d3_number(x) { - return x != null && !isNaN(x); - } - d3.sum = function(array, f) { - var s = 0, n = array.length, a, i = -1; - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - return s; - }; - d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h; - return e ? v + e * (values[h] - v) : v; - }; - d3.shuffle = function(array) { - var m = array.length, t, i; - while (m) { - i = Math.random() * m-- | 0; - t = array[m], array[m] = array[i], array[i] = t; - } - return array; - }; - d3.transpose = function(matrix) { - return d3.zip.apply(d3, matrix); - }; - d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) { - zip[j] = arguments[j][i]; - } - } - return zips; - }; - function d3_zipLength(d) { - return d.length; - } - d3.bisector = function(f) { - return { - left: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (f.call(a, a[mid], mid) < x) lo = mid + 1; else hi = mid; - } - return lo; - }, - right: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (x < f.call(a, a[mid], mid)) hi = mid; else lo = mid + 1; - } - return lo; - } - }; - }; - var d3_bisector = d3.bisector(function(d) { - return d; - }); - d3.bisectLeft = d3_bisector.left; - d3.bisect = d3.bisectRight = d3_bisector.right; - d3.nest = function() { - var nest = {}, keys = [], sortKeys = [], sortValues, rollup; - function map(array, depth) { - if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array; - var i = -1, n = array.length, key = keys[depth++], keyValue, object, valuesByKey = new d3_Map(), values, o = {}; - while (++i < n) { - if (values = valuesByKey.get(keyValue = key(object = array[i]))) { - values.push(object); - } else { - valuesByKey.set(keyValue, [ object ]); - } - } - valuesByKey.forEach(function(keyValue, values) { - o[keyValue] = map(values, depth); - }); - return o; - } - function entries(map, depth) { - if (depth >= keys.length) return map; - var a = [], sortKey = sortKeys[depth++], key; - for (key in map) { - a.push({ - key: key, - values: entries(map[key], depth) - }); - } - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - return a; - } - nest.map = function(array) { - return map(array, 0); - }; - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - nest.key = function(d) { - keys.push(d); - return nest; - }; - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - nest.rollup = function(f) { - rollup = f; - return nest; - }; - return nest; - }; - d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; - }; - d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; - }; - d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({ - key: key, - value: map[key] - }); - return entries; - }; - d3.permute = function(array, indexes) { - var permutes = [], i = -1, n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; - }; - d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); - }; - function d3_collapse(s) { - return s.trim().replace(/\s+/g, " "); - } - d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step === Infinity) throw new Error("infinite range"); - var range = [], k = d3_range_integerScale(Math.abs(step)), i = -1, j; - start *= k, stop *= k, step *= k; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k); - return range; - }; - function d3_range_integerScale(x) { - var k = 1; - while (x * k % 1) k *= 10; - return k; - } - d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); - }; - var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; - d3.round = function(x, n) { - return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); - }; - d3.xhr = function(url, mimeType, callback) { - var xhr = {}, dispatch = d3.dispatch("progress", "load", "error"), headers = {}, response = d3_identity, request = new (window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest)(); - "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { - request.readyState > 3 && respond(); - }; - function respond() { - var s = request.status; - !s && request.responseText || s >= 200 && s < 300 || s === 304 ? dispatch.load.call(xhr, response.call(xhr, request)) : dispatch.error.call(xhr, request); - } - request.onprogress = function(event) { - var o = d3.event; - d3.event = event; - try { - dispatch.progress.call(xhr, request); - } finally { - d3.event = o; - } - }; - xhr.header = function(name, value) { - name = (name + "").toLowerCase(); - if (arguments.length < 2) return headers[name]; - if (value == null) delete headers[name]; else headers[name] = value + ""; - return xhr; - }; - xhr.mimeType = function(value) { - if (!arguments.length) return mimeType; - mimeType = value == null ? null : value + ""; - return xhr; - }; - xhr.response = function(value) { - response = value; - return xhr; - }; - [ "get", "post" ].forEach(function(method) { - xhr[method] = function() { - return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments))); - }; - }); - xhr.send = function(method, data, callback) { - if (arguments.length === 2 && typeof data === "function") callback = data, data = null; - request.open(method, url, true); - if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; - if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); - if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); - if (callback != null) xhr.on("error", callback).on("load", function(request) { - callback(null, request); - }); - request.send(data == null ? null : data); - return xhr; - }; - xhr.abort = function() { - request.abort(); - return xhr; - }; - d3.rebind(xhr, dispatch, "on"); - if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, - mimeType = null; - return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); - }; - function d3_xhr_fixCallback(callback) { - return callback.length === 1 ? function(error, request) { - callback(error == null ? request : null); - } : callback; - } - d3.text = function() { - return d3.xhr.apply(d3, arguments).response(d3_text); - }; - function d3_text(request) { - return request.responseText; - } - d3.json = function(url, callback) { - return d3.xhr(url, "application/json", callback).response(d3_json); - }; - function d3_json(request) { - return JSON.parse(request.responseText); - } - d3.html = function(url, callback) { - return d3.xhr(url, "text/html", callback).response(d3_html); - }; - function d3_html(request) { - var range = document.createRange(); - range.selectNode(document.body); - return range.createContextualFragment(request.responseText); - } - d3.xml = function() { - return d3.xhr.apply(d3, arguments).response(d3_xml); - }; - function d3_xml(request) { - return request.responseXML; - } - var d3_nsPrefix = { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }; - d3.ns = { - prefix: d3_nsPrefix, - qualify: function(name) { - var i = name.indexOf(":"), prefix = name; - if (i >= 0) { - prefix = name.substring(0, i); - name = name.substring(i + 1); - } - return d3_nsPrefix.hasOwnProperty(prefix) ? { - space: d3_nsPrefix[prefix], - local: name - } : name; - } - }; - d3.dispatch = function() { - var dispatch = new d3_dispatch(), i = -1, n = arguments.length; - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - return dispatch; - }; - function d3_dispatch() {} - d3_dispatch.prototype.on = function(type, listener) { - var i = type.indexOf("."), name = ""; - if (i > 0) { - name = type.substring(i + 1); - type = type.substring(0, i); - } - return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener); - }; - function d3_dispatch_event(dispatch) { - var listeners = [], listenerByName = new d3_Map(); - function event() { - var z = listeners, i = -1, n = z.length, l; - while (++i < n) if (l = z[i].on) l.apply(this, arguments); - return dispatch; - } - event.on = function(name, listener) { - var l = listenerByName.get(name), i; - if (arguments.length < 2) return l && l.on; - if (l) { - l.on = null; - listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); - listenerByName.remove(name); - } - if (listener) listeners.push(listenerByName.set(name, { - on: listener - })); - return dispatch; - }; - return event; - } - d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "", basePrefix = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, suffix = "", integer = false; - if (precision) precision = +precision.substring(1); - if (zfill || fill === "0" && align === "=") { - zfill = fill = "0"; - align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - switch (type) { - case "n": - comma = true; - type = "g"; - break; - - case "%": - scale = 100; - suffix = "%"; - type = "f"; - break; - - case "p": - scale = 100; - suffix = "%"; - type = "r"; - break; - - case "b": - case "o": - case "x": - case "X": - if (basePrefix) basePrefix = "0" + type.toLowerCase(); - - case "c": - case "d": - integer = true; - precision = 0; - break; - - case "s": - scale = -1; - type = "r"; - break; - } - if (basePrefix === "#") basePrefix = ""; - if (type == "r" && !precision) type = "g"; - type = d3_format_types.get(type) || d3_format_typeDefault; - var zcomma = zfill && comma; - return function(value) { - if (integer && value % 1) return ""; - var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign; - if (scale < 0) { - var prefix = d3.formatPrefix(value, precision); - value = prefix.scale(value); - suffix = prefix.symbol; - } else { - value *= scale; - } - value = type(value, precision); - if (!zfill && comma) value = d3_format_group(value); - var length = basePrefix.length + value.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : ""; - if (zcomma) value = d3_format_group(padding + value); - if (d3_format_decimalPoint) value.replace(".", d3_format_decimalPoint); - negative += basePrefix; - return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + suffix; - }; - }; - var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - var d3_format_types = d3.map({ - b: function(x) { - return x.toString(2); - }, - c: function(x) { - return String.fromCharCode(x); - }, - o: function(x) { - return x.toString(8); - }, - x: function(x) { - return x.toString(16); - }, - X: function(x) { - return x.toString(16).toUpperCase(); - }, - g: function(x, p) { - return x.toPrecision(p); - }, - e: function(x, p) { - return x.toExponential(p); - }, - f: function(x, p) { - return x.toFixed(p); - }, - r: function(x, p) { - return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p))); - } - }); - function d3_format_precision(x, p) { - return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1); - } - function d3_format_typeDefault(x) { - return x + ""; - } - var d3_format_group = d3_identity; - if (d3_format_grouping) { - var d3_format_groupingLength = d3_format_grouping.length; - d3_format_group = function(value) { - var i = value.lastIndexOf("."), f = i >= 0 ? "." + value.substring(i + 1) : (i = value.length, - ""), t = [], j = 0, g = d3_format_grouping[0]; - while (i > 0 && g > 0) { - t.push(value.substring(i -= g, i + g)); - g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength]; - } - return t.reverse().join(d3_format_thousandsSeparator || "") + f; - }; - } - var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "μ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); - d3.formatPrefix = function(value, precision) { - var i = 0; - if (value) { - if (value < 0) value *= -1; - if (precision) value = d3.round(value, d3_format_precision(value, precision)); - i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); - i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3)); - } - return d3_formatPrefixes[8 + i / 3]; - }; - function d3_formatPrefix(d, i) { - var k = Math.pow(10, Math.abs(8 - i) * 3); - return { - scale: i > 8 ? function(d) { - return d / k; - } : function(d) { - return d * k; - }, - symbol: d - }; - } - var d3_ease_default = function() { - return d3_identity; - }; - var d3_ease = d3.map({ - linear: d3_ease_default, - poly: d3_ease_poly, - quad: function() { - return d3_ease_quad; - }, - cubic: function() { - return d3_ease_cubic; - }, - sin: function() { - return d3_ease_sin; - }, - exp: function() { - return d3_ease_exp; - }, - circle: function() { - return d3_ease_circle; - }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { - return d3_ease_bounce; - } - }); - var d3_ease_mode = d3.map({ - "in": d3_identity, - out: d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { - return d3_ease_reflect(d3_ease_reverse(f)); - } - }); - d3.ease = function(name) { - var i = name.indexOf("-"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : "in"; - t = d3_ease.get(t) || d3_ease_default; - m = d3_ease_mode.get(m) || d3_identity; - return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1)))); - }; - function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; - } - function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; - } - function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t)); - }; - } - function d3_ease_quad(t) { - return t * t; - } - function d3_ease_cubic(t) { - return t * t * t; - } - function d3_ease_cubicInOut(t) { - if (t <= 0) return 0; - if (t >= 1) return 1; - var t2 = t * t, t3 = t2 * t; - return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); - } - function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - }; - } - function d3_ease_sin(t) { - return 1 - Math.cos(t * π / 2); - } - function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); - } - function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); - } - function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = .45; - if (arguments.length) s = p / (2 * π) * Math.asin(1 / a); else a = 1, s = p / 4; - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * π / p); - }; - } - function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; - } - function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; - } - d3.event = null; - function d3_eventCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); - } - function d3_eventSource() { - var e = d3.event, s; - while (s = e.sourceEvent) e = s; - return e; - } - function d3_eventDispatch(target) { - var dispatch = new d3_dispatch(), i = 0, n = arguments.length; - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - dispatch.of = function(thiz, argumentz) { - return function(e1) { - try { - var e0 = e1.sourceEvent = d3.event; - e1.target = target; - d3.event = e1; - dispatch[e1.type].apply(thiz, argumentz); - } finally { - d3.event = e0; - } - }; - }; - return dispatch; - } - d3.transform = function(string) { - var g = document.createElementNS(d3.ns.prefix.svg, "g"); - return (d3.transform = function(string) { - g.setAttribute("transform", string); - var t = g.transform.baseVal.consolidate(); - return new d3_transform(t ? t.matrix : d3_transformIdentity); - })(string); - }; - function d3_transform(m) { - var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; - if (r0[0] * r1[1] < r1[0] * r0[1]) { - r0[0] *= -1; - r0[1] *= -1; - kx *= -1; - kz *= -1; - } - this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; - this.translate = [ m.e, m.f ]; - this.scale = [ kx, ky ]; - this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; - } - d3_transform.prototype.toString = function() { - return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")"; - }; - function d3_transformDot(a, b) { - return a[0] * b[0] + a[1] * b[1]; - } - function d3_transformNormalize(a) { - var k = Math.sqrt(d3_transformDot(a, a)); - if (k) { - a[0] /= k; - a[1] /= k; - } - return k; - } - function d3_transformCombine(a, b, k) { - a[0] += k * b[0]; - a[1] += k * b[1]; - return a; - } - var d3_transformIdentity = { - a: 1, - b: 0, - c: 0, - d: 1, - e: 0, - f: 0 - }; - d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ; - return f; - }; - d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { - return a + b * t; - }; - }; - d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { - return Math.round(a + b * t); - }; - }; - d3.interpolateString = function(a, b) { - var m, i, j, s0 = 0, s1 = 0, s = [], q = [], n, o; - d3_interpolate_number.lastIndex = 0; - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({ - i: s.length, - x: m[0] - }); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { - if (o.i) { - if (s[o.i + 1] == null) { - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { - s[o.i] = o.x; - } else { - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { - s[o.i] = o.x; - } else { - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { - return b; - }; - } - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; - }; - d3.interpolateTransform = function(a, b) { - var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale; - if (ta[0] != tb[0] || ta[1] != tb[1]) { - s.push("translate(", null, ",", null, ")"); - q.push({ - i: 1, - x: d3.interpolateNumber(ta[0], tb[0]) - }, { - i: 3, - x: d3.interpolateNumber(ta[1], tb[1]) - }); - } else if (tb[0] || tb[1]) { - s.push("translate(" + tb + ")"); - } else { - s.push(""); - } - if (ra != rb) { - if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; - q.push({ - i: s.push(s.pop() + "rotate(", null, ")") - 2, - x: d3.interpolateNumber(ra, rb) - }); - } else if (rb) { - s.push(s.pop() + "rotate(" + rb + ")"); - } - if (wa != wb) { - q.push({ - i: s.push(s.pop() + "skewX(", null, ")") - 2, - x: d3.interpolateNumber(wa, wb) - }); - } else if (wb) { - s.push(s.pop() + "skewX(" + wb + ")"); - } - if (ka[0] != kb[0] || ka[1] != kb[1]) { - n = s.push(s.pop() + "scale(", null, ",", null, ")"); - q.push({ - i: n - 4, - x: d3.interpolateNumber(ka[0], kb[0]) - }, { - i: n - 2, - x: d3.interpolateNumber(ka[1], kb[1]) - }); - } else if (kb[0] != 1 || kb[1] != 1) { - s.push(s.pop() + "scale(" + kb + ")"); - } - n = q.length; - return function(t) { - var i = -1, o; - while (++i < n) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; - }; - d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab; - return function(t) { - return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t)); - }; - }; - d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, s0 = a.s, l0 = a.l, h1 = b.h - h0, s1 = b.s - s0, l1 = b.l - l0; - if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t) + ""; - }; - }; - d3.interpolateLab = function(a, b) { - a = d3.lab(a); - b = d3.lab(b); - var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab; - return function(t) { - return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + ""; - }; - }; - d3.interpolateHcl = function(a, b) { - a = d3.hcl(a); - b = d3.hcl(b); - var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al; - if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; - return function(t) { - return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + ""; - }; - }; - d3.interpolateArray = function(a, b) { - var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (;i < na; ++i) c[i] = a[i]; - for (;i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; - }; - d3.interpolateObject = function(a, b) { - var i = {}, c = {}, k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; - }; - var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; - function d3_interpolateByName(name) { - return name == "transform" ? d3.interpolateTransform : d3.interpolate; - } - d3.interpolators = [ d3.interpolateObject, function(a, b) { - return b instanceof Array && d3.interpolateArray(a, b); - }, function(a, b) { - return (typeof a === "string" || typeof b === "string") && d3.interpolateString(a + "", b + ""); - }, function(a, b) { - return (typeof b === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Color) && d3.interpolateRgb(a, b); - }, function(a, b) { - return !isNaN(a = +a) && !isNaN(b = +b) && d3.interpolateNumber(a, b); - } ]; - function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { - return (x - a) * b; - }; - } - function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { - return Math.max(0, Math.min(1, (x - a) * b)); - }; - } - function d3_Color() {} - d3_Color.prototype.toString = function() { - return this.rgb() + ""; - }; - d3.rgb = function(r, g, b) { - return arguments.length === 1 ? r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : d3_rgb(~~r, ~~g, ~~b); - }; - function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); - } - function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; - } - var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color(); - d3_rgbPrototype.brighter = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - var r = this.r, g = this.g, b = this.b, i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb(Math.min(255, Math.floor(r / k)), Math.min(255, Math.floor(g / k)), Math.min(255, Math.floor(b / k))); - }; - d3_rgbPrototype.darker = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - return d3_rgb(Math.floor(k * this.r), Math.floor(k * this.g), Math.floor(k * this.b)); - }; - d3_rgbPrototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); - }; - d3_rgbPrototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); - }; - function d3_rgb_hex(v) { - return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16); - } - function d3_rgb_parse(format, rgb, hsl) { - var r = 0, g = 0, b = 0, m1, m2, name; - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": - { - return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100); - } - - case "rgb": - { - return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2])); - } - } - } - if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b); - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); - r += r; - g = format.charAt(2); - g += g; - b = format.charAt(3); - b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - return rgb(r, g, b); - } - function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); - } - function d3_rgb_lab(r, g, b) { - r = d3_rgb_xyz(r); - g = d3_rgb_xyz(g); - b = d3_rgb_xyz(b); - var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z); - return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); - } - function d3_rgb_xyz(r) { - return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4); - } - function d3_rgb_parseNumber(c) { - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; - } - var d3_rgb_names = d3.map({ - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" - }); - d3_rgb_names.forEach(function(key, value) { - d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb)); - }); - d3.hsl = function(h, s, l) { - return arguments.length === 1 ? h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : d3_hsl(+h, +s, +l); - }; - function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); - } - function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; - } - var d3_hslPrototype = d3_Hsl.prototype = new d3_Color(); - d3_hslPrototype.brighter = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); - }; - d3_hslPrototype.darker = function(k) { - k = Math.pow(.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); - }; - d3_hslPrototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); - }; - function d3_hsl_rgb(h, s, l) { - var m1, m2; - h = h % 360; - if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - function v(h) { - if (h > 360) h -= 360; else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - function vv(h) { - return Math.round(v(h) * 255); - } - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); - } - d3.hcl = function(h, c, l) { - return arguments.length === 1 ? h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l) : h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : d3_hcl(+h, +c, +l); - }; - function d3_hcl(h, c, l) { - return new d3_Hcl(h, c, l); - } - function d3_Hcl(h, c, l) { - this.h = h; - this.c = c; - this.l = l; - } - var d3_hclPrototype = d3_Hcl.prototype = new d3_Color(); - d3_hclPrototype.brighter = function(k) { - return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); - }; - d3_hclPrototype.darker = function(k) { - return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); - }; - d3_hclPrototype.rgb = function() { - return d3_hcl_lab(this.h, this.c, this.l).rgb(); - }; - function d3_hcl_lab(h, c, l) { - return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); - } - d3.lab = function(l, a, b) { - return arguments.length === 1 ? l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b) : l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b) : d3_lab(+l, +a, +b); - }; - function d3_lab(l, a, b) { - return new d3_Lab(l, a, b); - } - function d3_Lab(l, a, b) { - this.l = l; - this.a = a; - this.b = b; - } - var d3_lab_K = 18; - var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883; - var d3_labPrototype = d3_Lab.prototype = new d3_Color(); - d3_labPrototype.brighter = function(k) { - return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); - }; - d3_labPrototype.darker = function(k) { - return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); - }; - d3_labPrototype.rgb = function() { - return d3_lab_rgb(this.l, this.a, this.b); - }; - function d3_lab_rgb(l, a, b) { - var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200; - x = d3_lab_xyz(x) * d3_lab_X; - y = d3_lab_xyz(y) * d3_lab_Y; - z = d3_lab_xyz(z) * d3_lab_Z; - return d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z)); - } - function d3_lab_hcl(l, a, b) { - return d3_hcl(Math.atan2(b, a) / π * 180, Math.sqrt(a * a + b * b), l); - } - function d3_lab_xyz(x) { - return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037; - } - function d3_xyz_lab(x) { - return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; - } - function d3_xyz_rgb(r) { - return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055)); - } - function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; - } - var d3_select = function(s, n) { - return n.querySelector(s); - }, d3_selectAll = function(s, n) { - return n.querySelectorAll(s); - }, d3_selectRoot = document.documentElement, d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector, d3_selectMatches = function(n, s) { - return d3_selectMatcher.call(n, s); - }; - if (typeof Sizzle === "function") { - d3_select = function(s, n) { - return Sizzle(s, n)[0] || null; - }; - d3_selectAll = function(s, n) { - return Sizzle.uniqueSort(Sizzle(s, n)); - }; - d3_selectMatches = Sizzle.matchesSelector; - } - var d3_selectionPrototype = []; - d3.selection = function() { - return d3_selectionRoot; - }; - d3.selection.prototype = d3_selectionPrototype; - d3_selectionPrototype.select = function(selector) { - var subgroups = [], subgroup, subnode, group, node; - if (typeof selector !== "function") selector = d3_selection_selector(selector); - for (var j = -1, m = this.length; ++j < m; ) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - return d3_selection(subgroups); - }; - function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; - } - d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], subgroup, node; - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - for (var j = -1, m = this.length; ++j < m; ) { - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i))); - subgroup.parentNode = node; - } - } - } - return d3_selection(subgroups); - }; - function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; - } - d3_selectionPrototype.attr = function(name, value) { - if (arguments.length < 2) { - if (typeof name === "string") { - var node = this.node(); - name = d3.ns.qualify(name); - return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name); - } - for (value in name) this.each(d3_selection_attr(value, name[value])); - return this; - } - return this.each(d3_selection_attr(name, value)); - }; - function d3_selection_attr(name, value) { - name = d3.ns.qualify(name); - function attrNull() { - this.removeAttribute(name); - } - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - function attrConstant() { - this.setAttribute(name, value); - } - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); else this.setAttribute(name, x); - } - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x); - } - return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant; - } - d3_selectionPrototype.classed = function(name, value) { - if (arguments.length < 2) { - if (typeof name === "string") { - var node = this.node(), n = (name = name.trim().split(/^|\s+/g)).length, i = -1; - if (value = node.classList) { - while (++i < n) if (!value.contains(name[i])) return false; - } else { - value = node.className; - if (value.baseVal != null) value = value.baseVal; - while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; - } - return true; - } - for (value in name) this.each(d3_selection_classed(value, name[value])); - return this; - } - return this.each(d3_selection_classed(name, value)); - }; - function d3_selection_classedRe(name) { - return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); - } - function d3_selection_classed(name, value) { - name = name.trim().split(/\s+/).map(d3_selection_classedName); - var n = name.length; - function classedConstant() { - var i = -1; - while (++i < n) name[i](this, value); - } - function classedFunction() { - var i = -1, x = value.apply(this, arguments); - while (++i < n) name[i](this, x); - } - return typeof value === "function" ? classedFunction : classedConstant; - } - function d3_selection_classedName(name) { - var re = d3_selection_classedRe(name); - return function(node, value) { - if (c = node.classList) return value ? c.add(name) : c.remove(name); - var c = node.className, cb = c.baseVal != null, cv = cb ? c.baseVal : c; - if (value) { - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; else node.className = cv; - } - } else if (cv) { - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; else node.className = cv; - } - }; - } - d3_selectionPrototype.style = function(name, value, priority) { - var n = arguments.length; - if (n < 3) { - if (typeof name !== "string") { - if (n < 2) value = ""; - for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); - return this; - } - if (n < 2) return getComputedStyle(this.node(), null).getPropertyValue(name); - priority = ""; - } - return this.each(d3_selection_style(name, value, priority)); - }; - function d3_selection_style(name, value, priority) { - function styleNull() { - this.style.removeProperty(name); - } - function styleConstant() { - this.style.setProperty(name, value, priority); - } - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority); - } - return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant; - } - d3_selectionPrototype.property = function(name, value) { - if (arguments.length < 2) { - if (typeof name === "string") return this.node()[name]; - for (value in name) this.each(d3_selection_property(value, name[value])); - return this; - } - return this.each(d3_selection_property(name, value)); - }; - function d3_selection_property(name, value) { - function propertyNull() { - delete this[name]; - } - function propertyConstant() { - this[name] = value; - } - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; else this[name] = x; - } - return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; - } - d3_selectionPrototype.text = function(value) { - return arguments.length ? this.each(typeof value === "function" ? function() { - var v = value.apply(this, arguments); - this.textContent = v == null ? "" : v; - } : value == null ? function() { - this.textContent = ""; - } : function() { - this.textContent = value; - }) : this.node().textContent; - }; - d3_selectionPrototype.html = function(value) { - return arguments.length ? this.each(typeof value === "function" ? function() { - var v = value.apply(this, arguments); - this.innerHTML = v == null ? "" : v; - } : value == null ? function() { - this.innerHTML = ""; - } : function() { - this.innerHTML = value; - }) : this.node().innerHTML; - }; - d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - function append() { - return this.appendChild(document.createElementNS(this.namespaceURI, name)); - } - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - return this.select(name.local ? appendNS : append); - }; - d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - function insert() { - return this.insertBefore(document.createElementNS(this.namespaceURI, name), d3_select(before, this)); - } - function insertNS() { - return this.insertBefore(document.createElementNS(name.space, name.local), d3_select(before, this)); - } - return this.select(name.local ? insertNS : insert); - }; - d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); - }; - d3_selectionPrototype.data = function(value, key) { - var i = -1, n = this.length, group, node; - if (!arguments.length) { - value = new Array(n = (group = this[0]).length); - while (++i < n) { - if (node = group[i]) { - value[i] = node.__data__; - } - } - return value; - } - function bind(group, groupData) { - var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), n1 = Math.max(n, m), updateNodes = [], enterNodes = [], exitNodes = [], node, nodeData; - if (key) { - var nodeByKeyValue = new d3_Map(), keyValues = [], keyValue, j = groupData.length; - for (i = -1; ++i < n; ) { - keyValue = key.call(node = group[i], node.__data__, i); - if (nodeByKeyValue.has(keyValue)) { - exitNodes[j++] = node; - } else { - nodeByKeyValue.set(keyValue, node); - } - keyValues.push(keyValue); - } - for (i = -1; ++i < m; ) { - keyValue = key.call(groupData, nodeData = groupData[i], i); - if (nodeByKeyValue.has(keyValue)) { - updateNodes[i] = node = nodeByKeyValue.get(keyValue); - node.__data__ = nodeData; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - nodeByKeyValue.remove(keyValue); - } - for (i = -1; ++i < n; ) { - if (nodeByKeyValue.has(keyValues[i])) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0; ) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (;i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (;i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - enterNodes.update = updateNodes; - enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode; - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]); - if (typeof value === "function") { - while (++i < n) { - bind(group = this[i], value.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], value); - } - } - update.enter = function() { - return enter; - }; - update.exit = function() { - return exit; - }; - return update; - }; - function d3_selection_dataNode(data) { - return { - __data__: data - }; - } - d3_selectionPrototype.datum = function(value) { - return arguments.length ? this.property("__data__", value) : this.property("__data__"); - }; - d3_selectionPrototype.filter = function(filter) { - var subgroups = [], subgroup, group, node; - if (typeof filter !== "function") filter = d3_selection_filter(filter); - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - return d3_selection(subgroups); - }; - function d3_selection_filter(selector) { - return function() { - return d3_selectMatches(this, selector); - }; - } - d3_selectionPrototype.order = function() { - for (var j = -1, m = this.length; ++j < m; ) { - for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { - if (node = group[i]) { - if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); - next = node; - } - } - } - return this; - }; - d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator); - return this.order(); - }; - function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; - } - d3_selectionPrototype.on = function(type, listener, capture) { - var n = arguments.length; - if (n < 3) { - if (typeof type !== "string") { - if (n < 2) listener = false; - for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); - return this; - } - if (n < 2) return (n = this.node()["__on" + type]) && n._; - capture = false; - } - return this.each(d3_selection_on(type, listener, capture)); - }; - function d3_selection_on(type, listener, capture) { - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - function onRemove() { - var wrapper = this[name]; - if (wrapper) { - this.removeEventListener(type, wrapper, wrapper.$); - delete this[name]; - } - } - function onAdd() { - var node = this, args = d3_array(arguments); - onRemove.call(this); - this.addEventListener(type, this[name] = wrapper, wrapper.$ = capture); - wrapper._ = listener; - function wrapper(e) { - var o = d3.event; - d3.event = e; - args[0] = node.__data__; - try { - listener.apply(node, args); - } finally { - d3.event = o; - } - } - } - return listener ? onAdd : onRemove; - } - d3_selectionPrototype.each = function(callback) { - return d3_selection_each(this, function(node, i, j) { - callback.call(node, node.__data__, i, j); - }); - }; - function d3_selection_each(groups, callback) { - for (var j = 0, m = groups.length; j < m; j++) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { - if (node = group[i]) callback(node, i, j); - } - } - return groups; - } - d3_selectionPrototype.call = function(callback) { - var args = d3_array(arguments); - callback.apply(args[0] = this, args); - return this; - }; - d3_selectionPrototype.empty = function() { - return !this.node(); - }; - d3_selectionPrototype.node = function() { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; - }; - d3_selectionPrototype.transition = function() { - var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = Object.create(d3_transitionInherit); - transition.time = Date.now(); - for (var j = -1, m = this.length; ++j < m; ) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) d3_transitionNode(node, i, id, transition); - subgroup.push(node); - } - } - return d3_transition(subgroups, id); - }; - var d3_selectionRoot = d3_selection([ [ document ] ]); - d3_selectionRoot[0].parentNode = d3_selectRoot; - d3.select = function(selector) { - return typeof selector === "string" ? d3_selectionRoot.select(selector) : d3_selection([ [ selector ] ]); - }; - d3.selectAll = function(selector) { - return typeof selector === "string" ? d3_selectionRoot.selectAll(selector) : d3_selection([ d3_array(selector) ]); - }; - function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; - } - var d3_selection_enterPrototype = []; - d3.selection.enter = d3_selection_enter; - d3.selection.enter.prototype = d3_selection_enterPrototype; - d3_selection_enterPrototype.append = d3_selectionPrototype.append; - d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; - d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; - d3_selection_enterPrototype.node = d3_selectionPrototype.node; - d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], subgroup, subnode, upgroup, group, node; - for (var j = -1, m = this.length; ++j < m; ) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - return d3_selection(subgroups); - }; - function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - groups.id = id; - return groups; - } - var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit = { - ease: d3_ease_cubicInOut, - delay: 0, - duration: 250 - }; - d3_transitionPrototype.call = d3_selectionPrototype.call; - d3_transitionPrototype.empty = d3_selectionPrototype.empty; - d3_transitionPrototype.node = d3_selectionPrototype.node; - d3.transition = function(selection) { - return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition(); - }; - d3.transition.prototype = d3_transitionPrototype; - function d3_transitionNode(node, i, id, inherit) { - var lock = node.__transition__ || (node.__transition__ = { - active: 0, - count: 0 - }), transition = lock[id]; - if (!transition) { - var time = inherit.time; - transition = lock[id] = { - tween: new d3_Map(), - event: d3.dispatch("start", "end"), - time: time, - ease: inherit.ease, - delay: inherit.delay, - duration: inherit.duration - }; - ++lock.count; - d3.timer(function(elapsed) { - var d = node.__data__, ease = transition.ease, event = transition.event, delay = transition.delay, duration = transition.duration, tweened = []; - return delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time), 1; - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - event.start.call(node, d, i); - transition.tween.forEach(function(key, value) { - if (value = value.call(node, d, i)) { - tweened.push(value); - } - }); - if (!tick(elapsed)) d3.timer(tick, 0, time); - return 1; - } - function tick(elapsed) { - if (lock.active !== id) return stop(); - var t = (elapsed - delay) / duration, e = ease(t), n = tweened.length; - while (n > 0) { - tweened[--n].call(node, e); - } - if (t >= 1) { - stop(); - event.end.call(node, d, i); - return 1; - } - } - function stop() { - if (--lock.count) delete lock[id]; else delete node.__transition__; - return 1; - } - }, 0, time); - return transition; - } - } - d3_transitionPrototype.select = function(selector) { - var id = this.id, subgroups = [], subgroup, subnode, node; - if (typeof selector !== "function") selector = d3_selection_selector(selector); - for (var j = -1, m = this.length; ++j < m; ) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - d3_transitionNode(subnode, i, id, node.__transition__[id]); - subgroup.push(subnode); - } else { - subgroup.push(null); - } - } - } - return d3_transition(subgroups, id); - }; - d3_transitionPrototype.selectAll = function(selector) { - var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition; - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - for (var j = -1, m = this.length; ++j < m; ) { - for (var group = this[j], i = -1, n = group.length; ++i < n; ) { - if (node = group[i]) { - transition = node.__transition__[id]; - subnodes = selector.call(node, node.__data__, i); - subgroups.push(subgroup = []); - for (var k = -1, o = subnodes.length; ++k < o; ) { - d3_transitionNode(subnode = subnodes[k], k, id, transition); - subgroup.push(subnode); - } - } - } - } - return d3_transition(subgroups, id); - }; - d3_transitionPrototype.filter = function(filter) { - var subgroups = [], subgroup, group, node; - if (typeof filter !== "function") filter = d3_selection_filter(filter); - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); - }; - d3_transitionPrototype.attr = function(nameNS, value) { - if (arguments.length < 2) { - for (value in nameNS) this.attr(value, nameNS[value]); - return this; - } - var interpolate = d3_interpolateByName(nameNS), name = d3.ns.qualify(nameNS); - function attrNull() { - this.removeAttribute(name); - } - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - return d3_transition_tween(this, "attr." + nameNS, value, function(b) { - function attrString() { - var a = this.getAttribute(name), i; - return a !== b && (i = interpolate(a, b), function(t) { - this.setAttribute(name, i(t)); - }); - } - function attrStringNS() { - var a = this.getAttributeNS(name.space, name.local), i; - return a !== b && (i = interpolate(a, b), function(t) { - this.setAttributeNS(name.space, name.local, i(t)); - }); - } - return b == null ? name.local ? attrNullNS : attrNull : (b += "", name.local ? attrStringNS : attrString); - }); - }; - d3_transitionPrototype.attrTween = function(nameNS, tween) { - var name = d3.ns.qualify(nameNS); - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); - }; - d3_transitionPrototype.style = function(name, value, priority) { - var n = arguments.length; - if (n < 3) { - if (typeof name !== "string") { - if (n < 2) value = ""; - for (priority in name) this.style(priority, name[priority], value); - return this; - } - priority = ""; - } - var interpolate = d3_interpolateByName(name); - function styleNull() { - this.style.removeProperty(name); - } - return d3_transition_tween(this, "style." + name, value, function(b) { - function styleString() { - var a = getComputedStyle(this, null).getPropertyValue(name), i; - return a !== b && (i = interpolate(a, b), function(t) { - this.style.setProperty(name, i(t), priority); - }); - } - return b == null ? styleNull : (b += "", styleString); - }); - }; - d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); - }; - d3_transitionPrototype.text = function(value) { - return d3_transition_tween(this, "text", value, d3_transition_text); - }; - function d3_transition_text(b) { - if (b == null) b = ""; - return function() { - this.textContent = b; - }; - } - d3_transitionPrototype.remove = function() { - return this.each("end.transition", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); - }; - d3_transitionPrototype.ease = function(value) { - var id = this.id; - if (arguments.length < 1) return this.node().__transition__[id].ease; - if (typeof value !== "function") value = d3.ease.apply(d3, arguments); - return d3_selection_each(this, function(node) { - node.__transition__[id].ease = value; - }); - }; - d3_transitionPrototype.delay = function(value) { - var id = this.id; - return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { - node.__transition__[id].delay = value.call(node, node.__data__, i, j) | 0; - } : (value |= 0, function(node) { - node.__transition__[id].delay = value; - })); - }; - d3_transitionPrototype.duration = function(value) { - var id = this.id; - return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { - node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j) | 0); - } : (value = Math.max(1, value | 0), function(node) { - node.__transition__[id].duration = value; - })); - }; - d3_transitionPrototype.each = function(type, listener) { - var id = this.id; - if (arguments.length < 2) { - var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId; - d3_transitionInheritId = id; - d3_selection_each(this, function(node, i, j) { - d3_transitionInherit = node.__transition__[id]; - type.call(node, node.__data__, i, j); - }); - d3_transitionInherit = inherit; - d3_transitionInheritId = inheritId; - } else { - d3_selection_each(this, function(node) { - node.__transition__[id].event.on(type, listener); - }); - } - return this; - }; - d3_transitionPrototype.transition = function() { - var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition; - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - if (node = group[i]) { - transition = Object.create(node.__transition__[id0]); - transition.delay += transition.duration; - d3_transitionNode(node, i, id1, transition); - } - subgroup.push(node); - } - } - return d3_transition(subgroups, id1); - }; - d3_transitionPrototype.tween = function(name, tween) { - var id = this.id; - if (arguments.length < 2) return this.node().__transition__[id].tween.get(name); - return d3_selection_each(this, tween == null ? function(node) { - node.__transition__[id].tween.remove(name); - } : function(node) { - node.__transition__[id].tween.set(name, tween); - }); - }; - function d3_transition_tween(groups, name, value, tween) { - var id = groups.id; - return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) { - node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j))); - } : (value = tween(value), function(node) { - node.__transition__[id].tween.set(name, value); - })); - } - var d3_timer_id = 0, d3_timer_byId = {}, d3_timer_queue = null, d3_timer_interval, d3_timer_timeout; - d3.timer = function(callback, delay, then) { - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; else if (!isFinite(delay)) return; - then = Date.now(); - } - var timer = d3_timer_byId[callback.id]; - if (timer && timer.callback === callback) { - timer.then = then; - timer.delay = delay; - } else d3_timer_byId[callback.id = ++d3_timer_id] = d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } - }; - function d3_timer_step() { - var elapsed, now = Date.now(), t1 = d3_timer_queue; - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } - } - d3.timer.flush = function() { - var elapsed, now = Date.now(), t1 = d3_timer_queue; - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - d3_timer_flush(); - }; - function d3_timer_flush() { - var t0 = null, t1 = d3_timer_queue, then = Infinity; - while (t1) { - if (t1.flush) { - delete d3_timer_byId[t1.callback.id]; - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; - } - var d3_timer_frame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { - setTimeout(callback, 17); - }; - d3.mouse = function(container) { - return d3_mousePoint(container, d3_eventSource()); - }; - var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - function d3_mousePoint(container, e) { - var svg = container.ownerSVGElement || container; - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - if (d3_mouse_bug44083 < 0 && (window.scrollX || window.scrollY)) { - svg = d3.select(document.body).append("svg").style("position", "absolute").style("top", 0).style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [ point.x, point.y ]; - } - var rect = container.getBoundingClientRect(); - return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ]; - } - d3.touches = function(container, touches) { - if (arguments.length < 2) touches = d3_eventSource().touches; - return touches ? d3_array(touches).map(function(touch) { - var point = d3_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; - }; - function d3_noop() {} - d3.scale = {}; - function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [ start, stop ] : [ stop, start ]; - } - function d3_scaleRange(scale) { - return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); - } - function d3_scale_nice(domain, nice) { - var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx; - if (x1 < x0) { - dx = i0, i0 = i1, i1 = dx; - dx = x0, x0 = x1, x1 = dx; - } - if (nice = nice(x1 - x0)) { - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - } - return domain; - } - function d3_scale_niceDefault() { - return Math; - } - d3.scale.linear = function() { - return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3.interpolate, false); - }; - function d3_scale_linear(domain, range, interpolate, clamp) { - var output, input; - function rescale() { - var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - function scale(x) { - return output(x); - } - scale.invert = function(y) { - return input(y); - }; - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - return rescale(); - } - function d3_scale_linearRebind(scale, linear) { - return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); - } - function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return dx && { - floor: function(x) { - return Math.floor(x / dx) * dx; - }, - ceil: function(x) { - return Math.ceil(x / dx) * dx; - } - }; - } - function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step; - if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; - extent[2] = step; - return extent; - } - function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); - } - function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); - } - function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; - } - function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1; - if (domain[k] < domain[0]) { - domain = domain.slice().reverse(); - range = range.slice().reverse(); - } - while (++j <= k) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - return function(x) { - var j = d3.bisect(domain, x, 1, k) - 1; - return i[j](u[j](x)); - }; - } - d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); - }; - function d3_scale_log(linear, log) { - var pow = log.pow; - function scale(x) { - return linear(log(x)); - } - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), j = Math.ceil(extent[1]), u = pow(extent[0]), v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (;i++ < j; ) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (;i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} - for (j = ticks.length; ticks[j - 1] > v; j--) {} - ticks = ticks.slice(i, j); - } - return ticks; - }; - scale.tickFormat = function(n, format) { - if (arguments.length < 2) format = d3_scale_logFormat; - if (!arguments.length) return format; - var k = Math.max(.1, n / scale.ticks().length), f = log === d3_scale_logn ? (e = -1e-12, - Math.floor) : (e = 1e-12, Math.ceil), e; - return function(d) { - return d / pow(f(log(d) + e)) <= k ? format(d) : ""; - }; - }; - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - return d3_scale_linearRebind(scale, linear); - } - var d3_scale_logFormat = d3.format(".0e"); - function d3_scale_logp(x) { - return Math.log(x < 0 ? 0 : x) / Math.LN10; - } - function d3_scale_logn(x) { - return -Math.log(x > 0 ? 0 : -x) / Math.LN10; - } - d3_scale_logp.pow = function(x) { - return Math.pow(10, x); - }; - d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); - }; - d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); - }; - function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent); - function scale(x) { - return linear(powp(x)); - } - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - return d3_scale_linearRebind(scale, linear); - } - function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; - } - d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); - }; - d3.scale.ordinal = function() { - return d3_scale_ordinal([], { - t: "range", - a: [ [] ] - }); - }; - function d3_scale_ordinal(domain, ranger) { - var index, range, rangeBand; - function scale(x) { - return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length]; - } - function steps(start, step) { - return d3.range(domain.length).map(function(i) { - return start + step * i; - }); - } - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = new d3_Map(); - var i = -1, n = x.length, xi; - while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); - return scale[ranger.t].apply(scale, ranger.a); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = { - t: "range", - a: arguments - }; - return scale; - }; - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding); - range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step); - rangeBand = 0; - ranger = { - t: "rangePoints", - a: arguments - }; - return scale; - }; - scale.rangeBands = function(x, padding, outerPadding) { - if (arguments.length < 2) padding = 0; - if (arguments.length < 3) outerPadding = padding; - var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding); - range = steps(start + step * outerPadding, step); - if (reverse) range.reverse(); - rangeBand = step * (1 - padding); - ranger = { - t: "rangeBands", - a: arguments - }; - return scale; - }; - scale.rangeRoundBands = function(x, padding, outerPadding) { - if (arguments.length < 2) padding = 0; - if (arguments.length < 3) outerPadding = padding; - var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step; - range = steps(start + Math.round(error / 2), step); - if (reverse) range.reverse(); - rangeBand = Math.round(step * (1 - padding)); - ranger = { - t: "rangeRoundBands", - a: arguments - }; - return scale; - }; - scale.rangeBand = function() { - return rangeBand; - }; - scale.rangeExtent = function() { - return d3_scaleExtent(ranger.a[0]); - }; - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - return scale.domain(domain); - } - d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); - }; - d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); - }; - d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); - }; - d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); - }; - var d3_category10 = [ "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" ]; - var d3_category20 = [ "#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5" ]; - var d3_category20b = [ "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", "#637939", "#8ca252", "#b5cf6b", "#cedb9c", "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", "#843c39", "#ad494a", "#d6616b", "#e7969c", "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" ]; - var d3_category20c = [ "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", "#31a354", "#74c476", "#a1d99b", "#c7e9c0", "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", "#636363", "#969696", "#bdbdbd", "#d9d9d9" ]; - d3.scale.quantile = function() { - return d3_scale_quantile([], []); - }; - function d3_scale_quantile(domain, range) { - var thresholds; - function rescale() { - var k = 0, q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { - return !isNaN(d); - }).sort(d3.ascending); - return rescale(); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - scale.quantiles = function() { - return thresholds; - }; - scale.copy = function() { - return d3_scale_quantile(domain, range); - }; - return rescale(); - } - d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [ 0, 1 ]); - }; - function d3_scale_quantize(x0, x1, range) { - var kx, i; - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - scale.domain = function(x) { - if (!arguments.length) return [ x0, x1 ]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); - }; - return rescale(); - } - d3.scale.threshold = function() { - return d3_scale_threshold([ .5 ], [ 0, 1 ]); - }; - function d3_scale_threshold(domain, range) { - function scale(x) { - return range[d3.bisect(domain, x)]; - } - scale.domain = function(_) { - if (!arguments.length) return domain; - domain = _; - return scale; - }; - scale.range = function(_) { - if (!arguments.length) return range; - range = _; - return scale; - }; - scale.copy = function() { - return d3_scale_threshold(domain, range); - }; - return scale; - } - d3.scale.identity = function() { - return d3_scale_identity([ 0, 1 ]); - }; - function d3_scale_identity(domain) { - function identity(x) { - return +x; - } - identity.invert = identity; - identity.domain = identity.range = function(x) { - if (!arguments.length) return domain; - domain = x.map(identity); - return identity; - }; - identity.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - identity.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - identity.copy = function() { - return d3_scale_identity(domain); - }; - return identity; - } - d3.svg = {}; - d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; - function arc() { - var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, - a0 = a1, a1 = da), a1 - a0), df = da < π ? "0" : "1", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1); - return da >= d3_svg_arcMax ? r0 ? "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "M0," + r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + -r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 + "Z" : "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "Z" : r0 ? "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L" + r0 * c1 + "," + r0 * s1 + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 + "Z" : "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L0,0" + "Z"; - } - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3_functor(v); - return arc; - }; - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3_functor(v); - return arc; - }; - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3_functor(v); - return arc; - }; - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3_functor(v); - return arc; - }; - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [ Math.cos(a) * r, Math.sin(a) * r ]; - }; - return arc; - }; - var d3_svg_arcOffset = -π / 2, d3_svg_arcMax = 2 * π - 1e-6; - function d3_svg_arcInnerRadius(d) { - return d.innerRadius; - } - function d3_svg_arcOuterRadius(d) { - return d.outerRadius; - } - function d3_svg_arcStartAngle(d) { - return d.startAngle; - } - function d3_svg_arcEndAngle(d) { - return d.endAngle; - } - function d3_svg_line(projection) { - var x = d3_svg_lineX, y = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7; - function line(data) { - var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); - function segment() { - segments.push("M", interpolate(projection(points), tension)); - } - while (++i < n) { - if (defined.call(this, d = data[i], i)) { - points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]); - } else if (points.length) { - segment(); - points = []; - } - } - if (points.length) segment(); - return segments.length ? segments.join("") : null; - } - line.x = function(_) { - if (!arguments.length) return x; - x = _; - return line; - }; - line.y = function(_) { - if (!arguments.length) return y; - y = _; - return line; - }; - line.defined = function(_) { - if (!arguments.length) return defined; - defined = _; - return line; - }; - line.interpolate = function(_) { - if (!arguments.length) return interpolateKey; - if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; - return line; - }; - line.tension = function(_) { - if (!arguments.length) return tension; - tension = _; - return line; - }; - return line; - } - d3.svg.line = function() { - return d3_svg_line(d3_identity); - }; - function d3_svg_lineX(d) { - return d[0]; - } - function d3_svg_lineY(d) { - return d[1]; - } - var d3_svg_lineInterpolators = d3.map({ - linear: d3_svg_lineLinear, - "linear-closed": d3_svg_lineLinearClosed, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - basis: d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - bundle: d3_svg_lineBundle, - cardinal: d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - monotone: d3_svg_lineMonotone - }); - d3_svg_lineInterpolators.forEach(function(key, value) { - value.key = key; - value.closed = /-closed$/.test(key); - }); - function d3_svg_lineLinear(points) { - return points.join("L"); - } - function d3_svg_lineLinearClosed(points) { - return d3_svg_lineLinear(points) + "Z"; - } - function d3_svg_lineStepBefore(points) { - var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); - } - function d3_svg_lineStepAfter(points) { - var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); - } - function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension)); - } - function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), - points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension)); - } - function d3_svg_lineCardinal(points, tension) { - return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension)); - } - function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) { - return d3_svg_lineLinear(points); - } - var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1; - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; - } - } - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1]; - } - return path; - } - function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]); - } - return tangents; - } - function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0 ]; - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); - } - function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; - while (++i < n) { - pi = points[i]; - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); - } - function d3_svg_lineBasisClosed(points) { - var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; - --i; - while (++i < m) { - pi = points[i % n]; - px.shift(); - px.push(pi[0]); - py.shift(); - py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); - } - function d3_svg_lineBundle(points, tension) { - var n = points.length - 1; - if (n) { - var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - } - return d3_svg_lineBasis(points); - } - function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; - } - var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ]; - function d3_svg_lineBasisBezier(path, x, y) { - path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); - } - function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); - } - function d3_svg_lineFiniteDifferences(points) { - var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2; - } - m[i] = d; - return m; - } - function d3_svg_lineMonotoneTangents(points) { - var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1; - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - a = m[i] / d; - b = m[i + 1] / d; - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - i = -1; - while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); - tangents.push([ s || 0, m[i] * s || 0 ]); - } - return tangents; - } - function d3_svg_lineMonotone(points) { - return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); - } - d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; - }; - function d3_svg_lineRadial(points) { - var point, i = -1, n = points.length, r, a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; - } - function d3_svg_area(projection) { - var x0 = d3_svg_lineX, x1 = d3_svg_lineX, y0 = 0, y1 = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7; - function area(data) { - var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() { - return x; - } : d3_functor(x1), fy1 = y0 === y1 ? function() { - return y; - } : d3_functor(y1), x, y; - function segment() { - segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z"); - } - while (++i < n) { - if (defined.call(this, d = data[i], i)) { - points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]); - points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]); - } else if (points0.length) { - segment(); - points0 = []; - points1 = []; - } - } - if (points0.length) segment(); - return segments.length ? segments.join("") : null; - } - area.x = function(_) { - if (!arguments.length) return x1; - x0 = x1 = _; - return area; - }; - area.x0 = function(_) { - if (!arguments.length) return x0; - x0 = _; - return area; - }; - area.x1 = function(_) { - if (!arguments.length) return x1; - x1 = _; - return area; - }; - area.y = function(_) { - if (!arguments.length) return y1; - y0 = y1 = _; - return area; - }; - area.y0 = function(_) { - if (!arguments.length) return y0; - y0 = _; - return area; - }; - area.y1 = function(_) { - if (!arguments.length) return y1; - y1 = _; - return area; - }; - area.defined = function(_) { - if (!arguments.length) return defined; - defined = _; - return area; - }; - area.interpolate = function(_) { - if (!arguments.length) return interpolateKey; - if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; - interpolateReverse = interpolate.reverse || interpolate; - L = interpolate.closed ? "M" : "L"; - return area; - }; - area.tension = function(_) { - if (!arguments.length) return tension; - tension = _; - return area; - }; - return area; - } - d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; - d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; - d3.svg.area = function() { - return d3_svg_area(d3_identity); - }; - d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; - }; - d3.svg.chord = function() { - var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; - function chord(d, i) { - var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i); - return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z"; - } - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [ r * Math.cos(a0), r * Math.sin(a0) ], - p1: [ r * Math.cos(a1), r * Math.sin(a1) ] - }; - } - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - function arc(r, p, a) { - return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p; - } - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3_functor(v); - return chord; - }; - chord.source = function(v) { - if (!arguments.length) return source; - source = d3_functor(v); - return chord; - }; - chord.target = function(v) { - if (!arguments.length) return target; - target = d3_functor(v); - return chord; - }; - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3_functor(v); - return chord; - }; - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3_functor(v); - return chord; - }; - return chord; - }; - function d3_svg_chordRadius(d) { - return d.radius; - } - d3.svg.diagonal = function() { - var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection; - function diagonal(d, i) { - var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, { - x: p0.x, - y: m - }, { - x: p3.x, - y: m - }, p3 ]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3_functor(x); - return diagonal; - }; - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3_functor(x); - return diagonal; - }; - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - return diagonal; - }; - function d3_svg_diagonalProjection(d) { - return [ d.x, d.y ]; - } - d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection; - diagonal.projection = function(x) { - return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection; - }; - return diagonal; - }; - function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset; - return [ r * Math.cos(a), r * Math.sin(a) ]; - }; - } - d3.svg.symbol = function() { - var type = d3_svg_symbolType, size = d3_svg_symbolSize; - function symbol(d, i) { - return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i)); - } - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3_functor(x); - return symbol; - }; - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3_functor(x); - return symbol; - }; - return symbol; - }; - function d3_svg_symbolSize() { - return 64; - } - function d3_svg_symbolType() { - return "circle"; - } - function d3_svg_symbolCircle(size) { - var r = Math.sqrt(size / π); - return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z"; - } - var d3_svg_symbols = d3.map({ - circle: d3_svg_symbolCircle, - cross: function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z"; - }, - diamond: function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30; - return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z"; - }, - square: function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z"; - } - }); - d3.svg.symbolTypes = d3_svg_symbols.keys(); - var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); - d3.svg.axis = function() { - var scale = d3.scale.linear(), orient = "bottom", tickMajorSize = 6, tickMinorSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_, tickSubdivide = 0; - function axis(g) { - g.each(function() { - var g = d3.select(this); - var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String : tickFormat_; - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), subtick = g.selectAll(".minor").data(subticks, String), subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6), subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), subtickUpdate = d3.transition(subtick).style("opacity", 1); - var tick = g.selectAll("g").data(ticks, String), tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform; - var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = d3.transition(path); - var scale1 = scale.copy(), scale0 = this.__chart__ || scale1; - this.__chart__ = scale1; - path.enter().append("path").attr("class", "domain"); - tickEnter.append("line").attr("class", "tick"); - tickEnter.append("text"); - var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"); - switch (orient) { - case "bottom": - { - tickTransform = d3_svg_axisX; - subtickEnter.attr("y2", tickMinorSize); - subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize); - lineEnter.attr("y2", tickMajorSize); - textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding); - lineUpdate.attr("x2", 0).attr("y2", tickMajorSize); - textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding); - text.attr("dy", ".71em").style("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - - case "top": - { - tickTransform = d3_svg_axisX; - subtickEnter.attr("y2", -tickMinorSize); - subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize); - lineEnter.attr("y2", -tickMajorSize); - textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize); - textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - text.attr("dy", "0em").style("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - - case "left": - { - tickTransform = d3_svg_axisY; - subtickEnter.attr("x2", -tickMinorSize); - subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0); - lineEnter.attr("x2", -tickMajorSize); - textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0); - textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0); - text.attr("dy", ".32em").style("text-anchor", "end"); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - - case "right": - { - tickTransform = d3_svg_axisY; - subtickEnter.attr("x2", tickMinorSize); - subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0); - lineEnter.attr("x2", tickMajorSize); - textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding); - lineUpdate.attr("x2", tickMajorSize).attr("y2", 0); - textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0); - text.attr("dy", ".32em").style("text-anchor", "start"); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - if (scale.ticks) { - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale1); - tickExit.call(tickTransform, scale1); - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale1); - subtickExit.call(tickTransform, scale1); - } else { - var dx = scale1.rangeBand() / 2, x = function(d) { - return scale1(d) + dx; - }; - tickEnter.call(tickTransform, x); - tickUpdate.call(tickTransform, x); - } - }); - } - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - axis.tickValues = function(x) { - if (!arguments.length) return tickValues; - tickValues = x; - return axis; - }; - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - axis.tickSize = function(x, y) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - return axis; - }; - function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { - return "translate(" + x(d) + ",0)"; - }); - } - function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { - return "translate(0," + y(d) + ")"; - }); - } - function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), subticks, i = -1, n = ticks.length, d = (ticks[1] - ticks[0]) / ++m, j, v; - while (++i < n) { - for (j = m; --j > 0; ) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1]; ) { - subticks.push(v); - } - } - return subticks; - } - d3.svg.brush = function() { - var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, resizes = d3_svg_brushResizes[0], extent = [ [ 0, 0 ], [ 0, 0 ] ], extentDomain; - function brush(g) { - g.each(function() { - var g = d3.select(this), bg = g.selectAll(".background").data([ 0 ]), fg = g.selectAll(".extent").data([ 0 ]), tz = g.selectAll(".resize").data(resizes, String), e; - g.style("pointer-events", "all").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart); - bg.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair"); - fg.enter().append("rect").attr("class", "extent").style("cursor", "move"); - tz.enter().append("g").attr("class", function(d) { - return "resize " + d; - }).style("cursor", function(d) { - return d3_svg_brushCursor[d]; - }).append("rect").attr("x", function(d) { - return /[ew]$/.test(d) ? -3 : null; - }).attr("y", function(d) { - return /^[ns]/.test(d) ? -3 : null; - }).attr("width", 6).attr("height", 6).style("visibility", "hidden"); - tz.style("display", brush.empty() ? "none" : null); - tz.exit().remove(); - if (x) { - e = d3_scaleRange(x); - bg.attr("x", e[0]).attr("width", e[1] - e[0]); - redrawX(g); - } - if (y) { - e = d3_scaleRange(y); - bg.attr("y", e[0]).attr("height", e[1] - e[0]); - redrawY(g); - } - redraw(g); - }); - } - function redraw(g) { - g.selectAll(".resize").attr("transform", function(d) { - return "translate(" + extent[+/e$/.test(d)][0] + "," + extent[+/^s/.test(d)][1] + ")"; - }); - } - function redrawX(g) { - g.select(".extent").attr("x", extent[0][0]); - g.selectAll(".extent,.n>rect,.s>rect").attr("width", extent[1][0] - extent[0][0]); - } - function redrawY(g) { - g.select(".extent").attr("y", extent[0][1]); - g.selectAll(".extent,.e>rect,.w>rect").attr("height", extent[1][1] - extent[0][1]); - } - function brushstart() { - var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), center, origin = mouse(), offset; - var w = d3.select(window).on("mousemove.brush", brushmove).on("mouseup.brush", brushend).on("touchmove.brush", brushmove).on("touchend.brush", brushend).on("keydown.brush", keydown).on("keyup.brush", keyup); - if (dragging) { - origin[0] = extent[0][0] - origin[0]; - origin[1] = extent[0][1] - origin[1]; - } else if (resizing) { - var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing); - offset = [ extent[1 - ex][0] - origin[0], extent[1 - ey][1] - origin[1] ]; - origin[0] = extent[ex][0]; - origin[1] = extent[ey][1]; - } else if (d3.event.altKey) center = origin.slice(); - g.style("pointer-events", "none").selectAll(".resize").style("display", null); - d3.select("body").style("cursor", eventTarget.style("cursor")); - event_({ - type: "brushstart" - }); - brushmove(); - d3_eventCancel(); - function mouse() { - var touches = d3.event.changedTouches; - return touches ? d3.touches(target, touches)[0] : d3.mouse(target); - } - function keydown() { - if (d3.event.keyCode == 32) { - if (!dragging) { - center = null; - origin[0] -= extent[1][0]; - origin[1] -= extent[1][1]; - dragging = 2; - } - d3_eventCancel(); - } - } - function keyup() { - if (d3.event.keyCode == 32 && dragging == 2) { - origin[0] += extent[1][0]; - origin[1] += extent[1][1]; - dragging = 0; - d3_eventCancel(); - } - } - function brushmove() { - var point = mouse(), moved = false; - if (offset) { - point[0] += offset[0]; - point[1] += offset[1]; - } - if (!dragging) { - if (d3.event.altKey) { - if (!center) center = [ (extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2 ]; - origin[0] = extent[+(point[0] < center[0])][0]; - origin[1] = extent[+(point[1] < center[1])][1]; - } else center = null; - } - if (resizingX && move1(point, x, 0)) { - redrawX(g); - moved = true; - } - if (resizingY && move1(point, y, 1)) { - redrawY(g); - moved = true; - } - if (moved) { - redraw(g); - event_({ - type: "brush", - mode: dragging ? "move" : "resize" - }); - } - } - function move1(point, scale, i) { - var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], size = extent[1][i] - extent[0][i], min, max; - if (dragging) { - r0 -= position; - r1 -= size + position; - } - min = Math.max(r0, Math.min(r1, point[i])); - if (dragging) { - max = (min += position) + size; - } else { - if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); - if (position < min) { - max = min; - min = position; - } else { - max = position; - } - } - if (extent[0][i] !== min || extent[1][i] !== max) { - extentDomain = null; - extent[0][i] = min; - extent[1][i] = max; - return true; - } - } - function brushend() { - brushmove(); - g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); - d3.select("body").style("cursor", null); - w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null); - event_({ - type: "brushend" - }); - d3_eventCancel(); - } - } - brush.x = function(z) { - if (!arguments.length) return x; - x = z; - resizes = d3_svg_brushResizes[!x << 1 | !y]; - return brush; - }; - brush.y = function(z) { - if (!arguments.length) return y; - y = z; - resizes = d3_svg_brushResizes[!x << 1 | !y]; - return brush; - }; - brush.extent = function(z) { - var x0, x1, y0, y1, t; - if (!arguments.length) { - z = extentDomain || extent; - if (x) { - x0 = z[0][0], x1 = z[1][0]; - if (!extentDomain) { - x0 = extent[0][0], x1 = extent[1][0]; - if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); - if (x1 < x0) t = x0, x0 = x1, x1 = t; - } - } - if (y) { - y0 = z[0][1], y1 = z[1][1]; - if (!extentDomain) { - y0 = extent[0][1], y1 = extent[1][1]; - if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); - if (y1 < y0) t = y0, y0 = y1, y1 = t; - } - } - return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ]; - } - extentDomain = [ [ 0, 0 ], [ 0, 0 ] ]; - if (x) { - x0 = z[0], x1 = z[1]; - if (y) x0 = x0[0], x1 = x1[0]; - extentDomain[0][0] = x0, extentDomain[1][0] = x1; - if (x.invert) x0 = x(x0), x1 = x(x1); - if (x1 < x0) t = x0, x0 = x1, x1 = t; - extent[0][0] = x0 | 0, extent[1][0] = x1 | 0; - } - if (y) { - y0 = z[0], y1 = z[1]; - if (x) y0 = y0[1], y1 = y1[1]; - extentDomain[0][1] = y0, extentDomain[1][1] = y1; - if (y.invert) y0 = y(y0), y1 = y(y1); - if (y1 < y0) t = y0, y0 = y1, y1 = t; - extent[0][1] = y0 | 0, extent[1][1] = y1 | 0; - } - return brush; - }; - brush.clear = function() { - extentDomain = null; - extent[0][0] = extent[0][1] = extent[1][0] = extent[1][1] = 0; - return brush; - }; - brush.empty = function() { - return x && extent[0][0] === extent[1][0] || y && extent[0][1] === extent[1][1]; - }; - return d3.rebind(brush, event, "on"); - }; - var d3_svg_brushCursor = { - n: "ns-resize", - e: "ew-resize", - s: "ns-resize", - w: "ew-resize", - nw: "nwse-resize", - ne: "nesw-resize", - se: "nwse-resize", - sw: "nesw-resize" - }; - var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ]; - d3.behavior = {}; - d3.behavior.drag = function() { - var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null; - function drag() { - this.on("mousedown.drag", mousedown).on("touchstart.drag", mousedown); - } - function mousedown() { - var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null, offset, origin_ = point(), moved = 0; - var w = d3.select(window).on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove).on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true); - if (origin) { - offset = origin.apply(target, arguments); - offset = [ offset.x - origin_[0], offset.y - origin_[1] ]; - } else { - offset = [ 0, 0 ]; - } - if (touchId == null) d3_eventCancel(); - event_({ - type: "dragstart" - }); - function point() { - var p = target.parentNode; - return touchId != null ? d3.touches(p).filter(function(p) { - return p.identifier === touchId; - })[0] : d3.mouse(p); - } - function dragmove() { - if (!target.parentNode) return dragend(); - var p = point(), dx = p[0] - origin_[0], dy = p[1] - origin_[1]; - moved |= dx | dy; - origin_ = p; - d3_eventCancel(); - event_({ - type: "drag", - x: p[0] + offset[0], - y: p[1] + offset[1], - dx: dx, - dy: dy - }); - } - function dragend() { - event_({ - type: "dragend" - }); - if (moved) { - d3_eventCancel(); - if (d3.event.target === eventTarget) w.on("click.drag", click, true); - } - w.on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", null).on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", null); - } - function click() { - d3_eventCancel(); - w.on("click.drag", null); - } - } - drag.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return drag; - }; - return d3.rebind(drag, event, "on"); - }; - d3.behavior.zoom = function() { - var translate = [ 0, 0 ], translate0, scale = 1, scale0, scaleExtent = d3_behavior_zoomInfinity, event = d3_eventDispatch(zoom, "zoom"), x0, x1, y0, y1, touchtime; - function zoom() { - this.on("mousedown.zoom", mousedown).on("mousewheel.zoom", mousewheel).on("mousemove.zoom", mousemove).on("DOMMouseScroll.zoom", mousewheel).on("dblclick.zoom", dblclick).on("touchstart.zoom", touchstart).on("touchmove.zoom", touchmove).on("touchend.zoom", touchstart); - } - zoom.translate = function(x) { - if (!arguments.length) return translate; - translate = x.map(Number); - rescale(); - return zoom; - }; - zoom.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - rescale(); - return zoom; - }; - zoom.scaleExtent = function(x) { - if (!arguments.length) return scaleExtent; - scaleExtent = x == null ? d3_behavior_zoomInfinity : x.map(Number); - return zoom; - }; - zoom.x = function(z) { - if (!arguments.length) return x1; - x1 = z; - x0 = z.copy(); - translate = [ 0, 0 ]; - scale = 1; - return zoom; - }; - zoom.y = function(z) { - if (!arguments.length) return y1; - y1 = z; - y0 = z.copy(); - translate = [ 0, 0 ]; - scale = 1; - return zoom; - }; - function location(p) { - return [ (p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale ]; - } - function point(l) { - return [ l[0] * scale + translate[0], l[1] * scale + translate[1] ]; - } - function scaleTo(s) { - scale = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); - } - function translateTo(p, l) { - l = point(l); - translate[0] += p[0] - l[0]; - translate[1] += p[1] - l[1]; - } - function rescale() { - if (x1) x1.domain(x0.range().map(function(x) { - return (x - translate[0]) / scale; - }).map(x0.invert)); - if (y1) y1.domain(y0.range().map(function(y) { - return (y - translate[1]) / scale; - }).map(y0.invert)); - } - function dispatch(event) { - rescale(); - d3.event.preventDefault(); - event({ - type: "zoom", - scale: scale, - translate: translate - }); - } - function mousedown() { - var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, moved = 0, w = d3.select(window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup), l = location(d3.mouse(target)); - window.focus(); - d3_eventCancel(); - function mousemove() { - moved = 1; - translateTo(d3.mouse(target), l); - dispatch(event_); - } - function mouseup() { - if (moved) d3_eventCancel(); - w.on("mousemove.zoom", null).on("mouseup.zoom", null); - if (moved && d3.event.target === eventTarget) w.on("click.zoom", click, true); - } - function click() { - d3_eventCancel(); - w.on("click.zoom", null); - } - } - function mousewheel() { - if (!translate0) translate0 = location(d3.mouse(this)); - scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * scale); - translateTo(d3.mouse(this), translate0); - dispatch(event.of(this, arguments)); - } - function mousemove() { - translate0 = null; - } - function dblclick() { - var p = d3.mouse(this), l = location(p), k = Math.log(scale) / Math.LN2; - scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1)); - translateTo(p, l); - dispatch(event.of(this, arguments)); - } - function touchstart() { - var touches = d3.touches(this), now = Date.now(); - scale0 = scale; - translate0 = {}; - touches.forEach(function(t) { - translate0[t.identifier] = location(t); - }); - d3_eventCancel(); - if (touches.length === 1) { - if (now - touchtime < 500) { - var p = touches[0], l = location(touches[0]); - scaleTo(scale * 2); - translateTo(p, l); - dispatch(event.of(this, arguments)); - } - touchtime = now; - } - } - function touchmove() { - var touches = d3.touches(this), p0 = touches[0], l0 = translate0[p0.identifier]; - if (p1 = touches[1]) { - var p1, l1 = translate0[p1.identifier]; - p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ]; - l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ]; - scaleTo(d3.event.scale * scale0); - } - translateTo(p0, l0); - touchtime = null; - dispatch(event.of(this, arguments)); - } - return d3.rebind(zoom, event, "on"); - }; - var d3_behavior_zoomDiv, d3_behavior_zoomInfinity = [ 0, Infinity ]; - function d3_behavior_zoomDelta() { - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div").style("visibility", "hidden").style("top", 0).style("height", 0).style("width", 0).style("overflow-y", "scroll").append("div").style("height", "2000px").node().parentNode; - } - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1e3; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1e3 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || -e.detail * 5; - } - return delta; - } - d3.layout = {}; - d3.layout.bundle = function() { - return function(links) { - var paths = [], i = -1, n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; - }; - function d3_layout_bundlePath(link) { - var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; - } - function d3_layout_bundleAncestors(node) { - var ancestors = [], parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; - } - function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; - } - d3.layout.chord = function() { - var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; - function relayout() { - var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; - chords = []; - groups = []; - k = 0, i = -1; - while (++i < n) { - x = 0, j = -1; - while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - k = (2 * π - padding * n) / k; - x = 0, i = -1; - while (++i < n) { - x0 = x, j = -1; - while (++j < n) { - var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: a0, - endAngle: a1, - value: v - }; - } - groups[di] = { - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }; - x += padding; - } - i = -1; - while (++i < n) { - j = i - 1; - while (++j < n) { - var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value ? { - source: target, - target: source - } : { - source: source, - target: target - }); - } - } - } - if (sortChords) resort(); - } - function resort() { - chords.sort(function(a, b) { - return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); - }); - } - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - return chord; - }; - d3.layout.force = function() { - var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, nodes = [], links = [], distances, strengths, charges; - function repulse(node) { - return function(quad, x1, _, x2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy); - if ((x2 - x1) * dn < theta) { - var k = quad.charge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - if (quad.point && isFinite(dn)) { - var k = quad.pointCharge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - return !quad.charge; - }; - } - force.tick = function() { - if ((alpha *= .99) < .005) { - event.end({ - type: "end", - alpha: alpha = 0 - }); - return true; - } - var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = x * x + y * y) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; - if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - if (charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); - i = -1; - while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o)); - } - } - } - i = -1; - while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - event.tick({ - type: "tick", - alpha: alpha - }); - }; - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3_functor(x); - return force; - }; - force.distance = force.linkDistance; - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3_functor(x); - return force; - }; - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - force.charge = function(x) { - if (!arguments.length) return charge; - charge = typeof x === "function" ? x : +x; - return force; - }; - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - force.alpha = function(x) { - if (!arguments.length) return alpha; - if (alpha) { - if (x > 0) alpha = x; else alpha = 0; - } else if (x > 0) { - event.start({ - type: "start", - alpha: alpha = x - }); - d3.timer(force.tick); - } - return force; - }; - force.start = function() { - var i, j, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - charges = []; - if (typeof charge === "function") { - for (i = 0; i < n; ++i) { - charges[i] = +charge.call(this, nodes[i], i); - } - } else { - for (i = 0; i < n; ++i) { - charges[i] = charge; - } - } - function position(dimension, size) { - var neighbors = neighbor(i), j = -1, m = neighbors.length, x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - return force.resume(); - }; - force.resume = function() { - return force.alpha(.1); - }; - force.stop = function() { - return force.alpha(0); - }; - force.drag = function() { - if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart", d3_layout_forceDragstart).on("drag", dragmove).on("dragend", d3_layout_forceDragend); - this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); - }; - function dragmove(d) { - d.px = d3.event.x, d.py = d3.event.y; - force.resume(); - } - return d3.rebind(force, event, "on"); - }; - function d3_layout_forceDragstart(d) { - d.fixed |= 2; - } - function d3_layout_forceDragend(d) { - d.fixed &= 1; - } - function d3_layout_forceMouseover(d) { - d.fixed |= 4; - d.px = d.x, d.py = d.y; - } - function d3_layout_forceMouseout(d) { - d.fixed &= 3; - } - function d3_layout_forceAccumulate(quad, alpha, charges) { - var cx = 0, cy = 0; - quad.charge = 0; - if (!quad.leaf) { - var nodes = quad.nodes, n = nodes.length, i = -1, c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c, alpha, charges); - quad.charge += c.charge; - cx += c.charge * c.cx; - cy += c.charge * c.cy; - } - } - if (quad.point) { - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - var k = alpha * charges[quad.point.index]; - quad.charge += quad.pointCharge = k; - cx += k * quad.point.x; - cy += k * quad.point.y; - } - quad.cx = cx / quad.charge; - quad.cy = cy / quad.charge; - } - function d3_layout_forceLinkDistance() { - return 20; - } - function d3_layout_forceLinkStrength() { - return 1; - } - d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children && (n = children.length)) { - var i = -1, n, c, d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - function depth(node) { - var children = node.children, d = 0; - if (children && (n = children.length)) { - var i = -1, n; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - return d3_layout_hierarchyRebind(partition, hierarchy); - }; - d3.layout.pie = function() { - var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = 2 * π; - function pie(data) { - var values = data.map(function(d, i) { - return +value.call(pie, d, i); - }); - var a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle); - var k = ((typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - startAngle) / d3.sum(values); - var index = d3.range(data.length); - if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { - return values[j] - values[i]; - } : function(i, j) { - return sort(data[i], data[j]); - }); - var arcs = []; - index.forEach(function(i) { - var d; - arcs[i] = { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - return arcs; - } - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - return pie; - }; - var d3_layout_pieSortByValue = {}; - d3.layout.stack = function() { - var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; - function stack(data, index) { - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - var points = series.map(function(d) { - return d.map(function(v, i) { - return [ x.call(stack, v, i), y.call(stack, v, i) ]; - }); - }); - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - var offsets = offset.call(stack, points, index); - var n = series.length, m = series[0].length, i, j, o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - return data; - } - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; - return stack; - }; - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; - return stack; - }; - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - return stack; - }; - function d3_layout_stackX(d) { - return d.x; - } - function d3_layout_stackY(d) { - return d.y; - } - function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; - } - var d3_layout_stackOrders = d3.map({ - "inside-out": function(data) { - var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { - return max[a] - max[b]; - }), top = 0, bottom = 0, tops = [], bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - reverse: function(data) { - return d3.range(data.length).reverse(); - }, - "default": d3_layout_stackOrderDefault - }); - var d3_layout_stackOffsets = d3.map({ - silhouette: function(data) { - var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - wiggle: function(data) { - var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - expand: function(data) { - var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - zero: d3_layout_stackOffsetZero - }); - function d3_layout_stackOrderDefault(data) { - return d3.range(data.length); - } - function d3_layout_stackOffsetZero(data) { - var j = -1, m = data[0].length, y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - function d3_layout_stackMaxIndex(array) { - var i = 1, j = 0, v = array[0][1], k, n = array.length; - for (;i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; - } - function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); - } - function d3_layout_stackSum(p, d) { - return p + d[1]; - } - d3.layout.histogram = function() { - var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; - function histogram(data, i) { - var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - if (m > 0) { - i = -1; - while (++i < n) { - x = values[i]; - if (x >= range[0] && x <= range[1]) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - } - return bins; - } - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3_functor(x); - return histogram; - }; - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" ? function(range) { - return d3_layout_histogramBinFixed(range, x); - } : d3_functor(x); - return histogram; - }; - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - return histogram; - }; - function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); - } - function d3_layout_histogramBinFixed(range, n) { - var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; - while (++x <= n) f[x] = m * x + b; - return f; - } - function d3_layout_histogramRange(values) { - return [ d3.min(values), d3.max(values) ]; - } - d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; - function recurse(node, depth, nodes) { - var childs = children.call(hierarchy, node, depth); - node.depth = depth; - nodes.push(node); - if (childs && (n = childs.length)) { - var i = -1, n, c = node.children = [], v = 0, j = depth + 1, d; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, node, depth) || 0; - } - return node; - } - function revalue(node, depth) { - var children = node.children, v = 0; - if (children && (n = children.length)) { - var i = -1, n, j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, node, depth) || 0; - } - if (value) node.value = v; - return v; - } - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - return hierarchy; - }; - function d3_layout_hierarchyRebind(object, hierarchy) { - d3.rebind(object, hierarchy, "sort", "children", "value"); - object.nodes = object; - object.links = d3_layout_hierarchyLinks; - return object; - } - function d3_layout_hierarchyChildren(d) { - return d.children; - } - function d3_layout_hierarchyValue(d) { - return d.value; - } - function d3_layout_hierarchySort(a, b) { - return b.value - a.value; - } - function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return { - source: parent, - target: child - }; - }); - })); - } - d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ]; - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0]; - root.x = 0; - root.y = 0; - d3_layout_treeVisitAfter(root, function(d) { - d.r = Math.sqrt(d.value); - }); - d3_layout_treeVisitAfter(root, d3_layout_packSiblings); - var w = size[0], h = size[1], k = Math.max(2 * root.r / w, 2 * root.r / h); - if (padding > 0) { - var dr = padding * k / 2; - d3_layout_treeVisitAfter(root, function(d) { - d.r += dr; - }); - d3_layout_treeVisitAfter(root, d3_layout_packSiblings); - d3_layout_treeVisitAfter(root, function(d) { - d.r -= dr; - }); - k = Math.max(2 * root.r / w, 2 * root.r / h); - } - d3_layout_packTransform(root, w / 2, h / 2, 1 / k); - return nodes; - } - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - pack.padding = function(_) { - if (!arguments.length) return padding; - padding = +_; - return pack; - }; - return d3_layout_hierarchyRebind(pack, hierarchy); - }; - function d3_layout_packSort(a, b) { - return a.value - b.value; - } - function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; - } - function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; - } - function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; - return dr * dr - dx * dx - dy * dy > .001; - } - function d3_layout_packSiblings(node) { - if (!(nodes = node.children) || !(n = nodes.length)) return; - var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - nodes.forEach(d3_layout_packLink); - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - for (i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - break; - } - } - } - if (isect) { - if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); - i--; - } else { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } - } - } - } - var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; - for (i = 0; i < n; i++) { - c = nodes[i]; - c.x -= cx; - c.y -= cy; - cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); - } - node.r = cr; - nodes.forEach(d3_layout_packUnlink); - } - function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; - } - function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; - } - function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = x += k * node.x; - node.y = y += k * node.y; - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } - } - function d3_layout_packPlace(a, b, c) { - var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; - if (db && (dx || dy)) { - var da = b.r + c.r, dc = dx * dx + dy * dy; - da *= da; - db *= db; - var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); - c.x = a.x + x * dx + y * dy; - c.y = a.y + x * dy - y * dx; - } else { - c.x = a.x + db; - c.y = a.y; - } - } - d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ]; - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; - d3_layout_treeVisitAfter(root, function(node) { - var children = node.children; - if (children && children.length) { - node.x = d3_layout_clusterX(children); - node.y = d3_layout_clusterY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; - }); - return nodes; - } - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - return d3_layout_hierarchyRebind(cluster, hierarchy); - }; - function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); - } - function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; - } - function d3_layout_clusterLeft(node) { - var children = node.children; - return children && children.length ? d3_layout_clusterLeft(children[0]) : node; - } - function d3_layout_clusterRight(node) { - var children = node.children, n; - return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; - } - d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ]; - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0]; - function firstWalk(node, previousSibling) { - var children = node.children, layout = node._tree; - if (children && (n = children.length)) { - var n, firstChild = children[0], previousChild, ancestor = firstChild, child, i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children && (n = children.length)) { - var i = -1, n; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, vop = node, vim = previousSibling, vom = node.parent.children[0], sip = vip._tree.mod, sop = vop._tree.mod, sim = vim._tree.mod, som = vom._tree.mod, shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - firstWalk(root); - secondWalk(root, -root._tree.prelim); - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), right = d3_layout_treeSearch(root, d3_layout_treeRightmost), deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2, y1 = deep.depth || 1; - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - return nodes; - } - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - return d3_layout_hierarchyRebind(tree, hierarchy); - }; - function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; - } - function d3_layout_treeLeft(node) { - var children = node.children; - return children && children.length ? children[0] : node._tree.thread; - } - function d3_layout_treeRight(node) { - var children = node.children, n; - return children && (n = children.length) ? children[n - 1] : node._tree.thread; - } - function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children && (n = children.length)) { - var child, n, i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; - } - function d3_layout_treeRightmost(a, b) { - return a.x - b.x; - } - function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; - } - function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; - } - function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children && (n = children.length)) { - var child, previousChild = null, i = -1, n; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); - } - function d3_layout_treeShift(node) { - var shift = 0, change = 0, children = node.children, i = children.length, child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } - } - function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; - } - function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent ? vim._tree.ancestor : ancestor; - } - d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); - function scale(children, k) { - var i = -1, n = children.length, child, area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - function squarify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" || mode === "slice-dice" && node.depth & 1 ? rect.dy : Math.min(rect.dx, rect.dy), n; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = remaining.length) > 0) { - row.push(child = remaining[n - 1]); - row.area += child.area; - if (mode !== "squarify" || (score = worst(row, u)) <= best) { - remaining.pop(); - best = score; - } else { - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - children.forEach(squarify); - } - } - function stickify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), remaining = children.slice(), child, row = []; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = remaining.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); - row.length = row.area = 0; - } - } - children.forEach(stickify); - } - } - function worst(row, u) { - var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; - } - function position(row, u, rect, flush) { - var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; - if (u == rect.dx) { - if (flush || v > rect.dy) v = rect.dy; - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); - } - o.z = true; - o.dx += rect.x + rect.dx - x; - rect.y += v; - rect.dy -= v; - } else { - if (flush || v > rect.dx) v = rect.dx; - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); - } - o.z = false; - o.dy += rect.y + rect.dy - y; - rect.x += v; - rect.dx -= v; - } - } - function treemap(d) { - var nodes = stickies || hierarchy(d), root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([ root ], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - treemap.padding = function(x) { - if (!arguments.length) return padding; - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); - } - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], - padConstant) : padConstant; - return treemap; - }; - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - treemap.mode = function(x) { - if (!arguments.length) return mode; - mode = x + ""; - return treemap; - }; - return d3_layout_hierarchyRebind(treemap, hierarchy); - }; - function d3_layout_treemapPadNull(node) { - return { - x: node.x, - y: node.y, - dx: node.dx, - dy: node.dy - }; - } - function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { - x += dx / 2; - dx = 0; - } - if (dy < 0) { - y += dy / 2; - dy = 0; - } - return { - x: x, - y: y, - dx: dx, - dy: dy - }; - } - function d3_dsv(delimiter, mimeType) { - var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); - function dsv(url, callback) { - return d3.xhr(url, mimeType, callback).response(response); - } - function response(request) { - return dsv.parse(request.responseText); - } - dsv.parse = function(text) { - var o; - return dsv.parseRows(text, function(row) { - if (o) return o(row); - o = new Function("d", "return {" + row.map(function(name, i) { - return JSON.stringify(name) + ": d[" + i + "]"; - }).join(",") + "}"); - }); - }; - dsv.parseRows = function(text, f) { - var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; - function token() { - if (I >= N) return EOF; - if (eol) return eol = false, EOL; - var j = I; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < N) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - ++i; - } - } - I = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) ++I; - } else if (c === 10) { - eol = true; - } - return text.substring(j + 1, i).replace(/""/g, '"'); - } - while (I < N) { - var c = text.charCodeAt(I++), k = 1; - if (c === 10) eol = true; else if (c === 13) { - eol = true; - if (text.charCodeAt(I) === 10) ++I, ++k; - } else if (c !== delimiterCode) continue; - return text.substring(j, I - k); - } - return text.substring(j); - } - while ((t = token()) !== EOF) { - var a = []; - while (t !== EOL && t !== EOF) { - a.push(t); - t = token(); - } - if (f && !(a = f(a, n++))) continue; - rows.push(a); - } - return rows; - }; - dsv.format = function(rows) { - return rows.map(formatRow).join("\n"); - }; - function formatRow(row) { - return row.map(formatValue).join(delimiter); - } - function formatValue(text) { - return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; - } - return dsv; - } - d3.csv = d3_dsv(",", "text/csv"); - d3.tsv = d3_dsv(" ", "text/tab-separated-values"); - d3.geo = {}; - d3.geo.stream = function(object, listener) { - if (d3_geo_streamObjectType.hasOwnProperty(object.type)) { - d3_geo_streamObjectType[object.type](object, listener); - } else { - d3_geo_streamGeometry(object, listener); - } - }; - function d3_geo_streamGeometry(geometry, listener) { - if (d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { - d3_geo_streamGeometryType[geometry.type](geometry, listener); - } - } - var d3_geo_streamObjectType = { - Feature: function(feature, listener) { - d3_geo_streamGeometry(feature.geometry, listener); - }, - FeatureCollection: function(object, listener) { - var features = object.features, i = -1, n = features.length; - while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); - }, - GeometryCollection: function(object, listener) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) d3_geo_streamGeometry(geometries[i], listener); - } - }; - var d3_geo_streamGeometryType = { - Sphere: function(object, listener) { - listener.sphere(); - }, - Point: function(object, listener) { - var coordinate = object.coordinates; - listener.point(coordinate[0], coordinate[1]); - }, - MultiPoint: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length, coordinate; - while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]); - }, - LineString: function(object, listener) { - d3_geo_streamLine(object.coordinates, listener, 0); - }, - MultiLineString: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); - }, - Polygon: function(object, listener) { - d3_geo_streamPolygon(object.coordinates, listener); - }, - MultiPolygon: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); - } - }; - function d3_geo_streamLine(coordinates, listener, closed) { - var i = -1, n = coordinates.length - closed, coordinate; - listener.lineStart(); - while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]); - listener.lineEnd(); - } - function d3_geo_streamPolygon(coordinates, listener) { - var i = -1, n = coordinates.length; - listener.polygonStart(); - while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); - listener.polygonEnd(); - } - function d3_geo_spherical(cartesian) { - return [ Math.atan2(cartesian[1], cartesian[0]), Math.asin(Math.max(-1, Math.min(1, cartesian[2]))) ]; - } - function d3_geo_sphericalEqual(a, b) { - return Math.abs(a[0] - b[0]) < ε && Math.abs(a[1] - b[1]) < ε; - } - function d3_geo_cartesian(spherical) { - var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ); - return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ]; - } - function d3_geo_cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - } - function d3_geo_cartesianCross(a, b) { - return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ]; - } - function d3_geo_cartesianAdd(a, b) { - a[0] += b[0]; - a[1] += b[1]; - a[2] += b[2]; - } - function d3_geo_cartesianScale(vector, k) { - return [ vector[0] * k, vector[1] * k, vector[2] * k ]; - } - function d3_geo_cartesianNormalize(d) { - var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l; - d[1] /= l; - d[2] /= l; - } - function d3_geo_resample(project) { - var δ2 = .5, maxDepth = 16; - function resample(stream) { - var λ0, x0, y0, a0, b0, c0; - var resample = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - stream.polygonStart(); - resample.lineStart = polygonLineStart; - }, - polygonEnd: function() { - stream.polygonEnd(); - resample.lineStart = lineStart; - } - }; - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - } - function lineStart() { - x0 = NaN; - resample.point = linePoint; - stream.lineStart(); - } - function linePoint(λ, φ) { - var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ); - resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); - stream.point(x0, y0); - } - function lineEnd() { - resample.point = point; - stream.lineEnd(); - } - function polygonLineStart() { - var λ00, φ00, x00, y00, a00, b00, c00; - lineStart(); - resample.point = function(λ, φ) { - linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; - resample.point = linePoint; - }; - resample.lineEnd = function() { - resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); - resample.lineEnd = lineEnd; - lineEnd(); - }; - } - return resample; - } - function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { - var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy; - if (d2 > 4 * δ2 && depth--) { - var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; - if (dz * dz / d2 > δ2 || Math.abs((dx * dx2 + dy * dy2) / d2 - .5) > .3) { - resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); - stream.point(x2, y2); - resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); - } - } - } - resample.precision = function(_) { - if (!arguments.length) return Math.sqrt(δ2); - maxDepth = (δ2 = _ * _) > 0 && 16; - return resample; - }; - return resample; - } - d3.geo.albersUsa = function() { - var lower48 = d3.geo.albers(); - var alaska = d3.geo.albers().rotate([ 160, 0 ]).center([ 0, 60 ]).parallels([ 55, 65 ]); - var hawaii = d3.geo.albers().rotate([ 160, 0 ]).center([ 0, 20 ]).parallels([ 8, 18 ]); - var puertoRico = d3.geo.albers().rotate([ 60, 0 ]).center([ 0, 10 ]).parallels([ 8, 18 ]); - function albersUsa(coordinates) { - return projection(coordinates)(coordinates); - } - function projection(point) { - var lon = point[0], lat = point[1]; - return lat > 50 ? alaska : lon < -140 ? hawaii : lat < 21 ? puertoRico : lower48; - } - albersUsa.scale = function(x) { - if (!arguments.length) return lower48.scale(); - lower48.scale(x); - alaska.scale(x * .6); - hawaii.scale(x); - puertoRico.scale(x * 1.5); - return albersUsa.translate(lower48.translate()); - }; - albersUsa.translate = function(x) { - if (!arguments.length) return lower48.translate(); - var dz = lower48.scale(), dx = x[0], dy = x[1]; - lower48.translate(x); - alaska.translate([ dx - .4 * dz, dy + .17 * dz ]); - hawaii.translate([ dx - .19 * dz, dy + .2 * dz ]); - puertoRico.translate([ dx + .58 * dz, dy + .43 * dz ]); - return albersUsa; - }; - return albersUsa.scale(lower48.scale()); - }; - function d3_geo_albers(φ0, φ1) { - var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n; - function albers(λ, φ) { - var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; - return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ]; - } - albers.invert = function(x, y) { - var ρ0_y = ρ0 - y; - return [ Math.atan2(x, ρ0_y) / n, Math.asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ]; - }; - return albers; - } - (d3.geo.albers = function() { - var φ0 = 29.5 * d3_radians, φ1 = 45.5 * d3_radians, m = d3_geo_projectionMutator(d3_geo_albers), p = m(φ0, φ1); - p.parallels = function(_) { - if (!arguments.length) return [ φ0 * d3_degrees, φ1 * d3_degrees ]; - return m(φ0 = _[0] * d3_radians, φ1 = _[1] * d3_radians); - }; - return p.rotate([ 98, 0 ]).center([ 0, 38 ]).scale(1e3); - }).raw = d3_geo_albers; - var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) { - return Math.sqrt(2 / (1 + cosλcosφ)); - }, function(ρ) { - return 2 * Math.asin(ρ / 2); - }); - (d3.geo.azimuthalEqualArea = function() { - return d3_geo_projection(d3_geo_azimuthalEqualArea); - }).raw = d3_geo_azimuthalEqualArea; - var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) { - var c = Math.acos(cosλcosφ); - return c && c / Math.sin(c); - }, d3_identity); - (d3.geo.azimuthalEquidistant = function() { - return d3_geo_projection(d3_geo_azimuthalEquidistant); - }).raw = d3_geo_azimuthalEquidistant; - d3.geo.bounds = d3_geo_bounds(); - function d3_geo_bounds(projection) { - var x0, y0, x1, y1; - var bound = { - point: boundPoint, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: function() { - bound.lineEnd = boundPolygonLineEnd; - }, - polygonEnd: function() { - bound.point = boundPoint; - } - }; - var projectBound = projection ? projection.stream(bound) : bound; - function boundPoint(x, y) { - if (x < x0) x0 = x; - if (x > x1) x1 = x; - if (y < y0) y0 = y; - if (y > y1) y1 = y; - } - function boundPolygonLineEnd() { - bound.point = bound.lineEnd = d3_noop; - } - return function(feature) { - y1 = x1 = -(x0 = y0 = Infinity); - d3.geo.stream(feature, projectBound); - return [ [ x0, y0 ], [ x1, y1 ] ]; - }; - } - d3.geo.centroid = function(object) { - d3_geo_centroidDimension = d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0; - d3.geo.stream(object, d3_geo_centroid); - var m; - if (d3_geo_centroidW && Math.abs(m = Math.sqrt(d3_geo_centroidX * d3_geo_centroidX + d3_geo_centroidY * d3_geo_centroidY + d3_geo_centroidZ * d3_geo_centroidZ)) > ε) { - return [ Math.atan2(d3_geo_centroidY, d3_geo_centroidX) * d3_degrees, Math.asin(Math.max(-1, Math.min(1, d3_geo_centroidZ / m))) * d3_degrees ]; - } - }; - var d3_geo_centroidDimension, d3_geo_centroidW, d3_geo_centroidX, d3_geo_centroidY, d3_geo_centroidZ; - var d3_geo_centroid = { - sphere: d3_noop, - point: d3_geo_centroidPoint, - lineStart: d3_geo_centroidLineStart, - lineEnd: d3_geo_centroidLineEnd, - polygonStart: function() { - d3_geo_centroidDimension = 2; - d3_geo_centroid.lineStart = d3_geo_centroidRingStart; - }, - polygonEnd: function() { - d3_geo_centroid.lineStart = d3_geo_centroidLineStart; - } - }; - function d3_geo_centroidPoint(λ, φ) { - if (d3_geo_centroidDimension) return; - ++d3_geo_centroidW; - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - d3_geo_centroidX += (cosφ * Math.cos(λ) - d3_geo_centroidX) / d3_geo_centroidW; - d3_geo_centroidY += (cosφ * Math.sin(λ) - d3_geo_centroidY) / d3_geo_centroidW; - d3_geo_centroidZ += (Math.sin(φ) - d3_geo_centroidZ) / d3_geo_centroidW; - } - function d3_geo_centroidRingStart() { - var λ00, φ00; - if (d3_geo_centroidDimension < 2) { - d3_geo_centroidDimension = 2; - d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0; - } - d3_geo_centroidDimension = 1; - d3_geo_centroidLineStart(); - d3_geo_centroidDimension = 2; - var linePoint = d3_geo_centroid.point; - d3_geo_centroid.point = function(λ, φ) { - linePoint(λ00 = λ, φ00 = φ); - }; - d3_geo_centroid.lineEnd = function() { - d3_geo_centroid.point(λ00, φ00); - d3_geo_centroidLineEnd(); - d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; - }; - } - function d3_geo_centroidLineStart() { - var x0, y0, z0; - if (d3_geo_centroidDimension !== 1) { - if (d3_geo_centroidDimension < 1) { - d3_geo_centroidDimension = 1; - d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0; - } else return; - } - d3_geo_centroid.point = function(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - x0 = cosφ * Math.cos(λ); - y0 = cosφ * Math.sin(λ); - z0 = Math.sin(φ); - d3_geo_centroid.point = nextPoint; - }; - function nextPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); - d3_geo_centroidW += w; - d3_geo_centroidX += w * (x0 + (x0 = x)); - d3_geo_centroidY += w * (y0 + (y0 = y)); - d3_geo_centroidZ += w * (z0 + (z0 = z)); - } - } - function d3_geo_centroidLineEnd() { - d3_geo_centroid.point = d3_geo_centroidPoint; - } - d3.geo.circle = function() { - var origin = [ 0, 0 ], angle, precision = 6, interpolate; - function circle() { - var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(center[0] * d3_radians, center[1] * d3_radians, 0), ring = []; - interpolate(null, null, 1, { - point: function(x, y) { - ring.push(x = rotate(x, y)); - x[0] *= d3_degrees, x[1] *= d3_degrees; - } - }); - return { - type: "Polygon", - coordinates: [ ring ] - }; - } - circle.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return circle; - }; - circle.angle = function(x) { - if (!arguments.length) return angle; - interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); - return circle; - }; - circle.precision = function(_) { - if (!arguments.length) return precision; - interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); - return circle; - }; - return circle.angle(90); - }; - function d3_geo_circleInterpolate(radians, precision) { - var cr = Math.cos(radians), sr = Math.sin(radians); - return function(from, to, direction, listener) { - if (from != null) { - from = d3_geo_circleAngle(cr, from); - to = d3_geo_circleAngle(cr, to); - if (direction > 0 ? from < to : from > to) from += direction * 2 * π; - } else { - from = radians + direction * 2 * π; - to = radians; - } - var point; - for (var step = direction * precision, t = from; direction > 0 ? t > to : t < to; t -= step) { - listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]); - } - }; - } - function d3_geo_circleAngle(cr, point) { - var a = d3_geo_cartesian(point); - a[0] -= cr; - d3_geo_cartesianNormalize(a); - var angle = Math.acos(Math.max(-1, Math.min(1, -a[1]))); - return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); - } - function d3_geo_clip(pointVisible, clipLine, interpolate) { - return function(listener) { - var line = clipLine(listener); - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - clip.point = pointRing; - clip.lineStart = ringStart; - clip.lineEnd = ringEnd; - invisible = false; - invisibleArea = visibleArea = 0; - segments = []; - listener.polygonStart(); - }, - polygonEnd: function() { - clip.point = point; - clip.lineStart = lineStart; - clip.lineEnd = lineEnd; - segments = d3.merge(segments); - if (segments.length) { - d3_geo_clipPolygon(segments, interpolate, listener); - } else if (visibleArea < -ε || invisible && invisibleArea < -ε) { - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - } - listener.polygonEnd(); - segments = null; - }, - sphere: function() { - listener.polygonStart(); - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - listener.polygonEnd(); - } - }; - function point(λ, φ) { - if (pointVisible(λ, φ)) listener.point(λ, φ); - } - function pointLine(λ, φ) { - line.point(λ, φ); - } - function lineStart() { - clip.point = pointLine; - line.lineStart(); - } - function lineEnd() { - clip.point = point; - line.lineEnd(); - } - var segments, visibleArea, invisibleArea, invisible; - var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), ring; - function pointRing(λ, φ) { - ringListener.point(λ, φ); - ring.push([ λ, φ ]); - } - function ringStart() { - ringListener.lineStart(); - ring = []; - } - function ringEnd() { - pointRing(ring[0][0], ring[0][1]); - ringListener.lineEnd(); - var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length; - if (!n) { - invisible = true; - invisibleArea += d3_geo_clipAreaRing(ring, -1); - ring = null; - return; - } - ring = null; - if (clean & 1) { - segment = ringSegments[0]; - visibleArea += d3_geo_clipAreaRing(segment, 1); - var n = segment.length - 1, i = -1, point; - listener.lineStart(); - while (++i < n) listener.point((point = segment[i])[0], point[1]); - listener.lineEnd(); - return; - } - if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); - segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); - } - return clip; - }; - } - function d3_geo_clipPolygon(segments, interpolate, listener) { - var subject = [], clip = []; - segments.forEach(function(segment) { - var n = segment.length; - if (n <= 1) return; - var p0 = segment[0], p1 = segment[n - 1], a = { - point: p0, - points: segment, - other: null, - visited: false, - entry: true, - subject: true - }, b = { - point: p0, - points: [ p0 ], - other: a, - visited: false, - entry: false, - subject: false - }; - a.other = b; - subject.push(a); - clip.push(b); - a = { - point: p1, - points: [ p1 ], - other: null, - visited: false, - entry: false, - subject: true - }; - b = { - point: p1, - points: [ p1 ], - other: a, - visited: false, - entry: true, - subject: false - }; - a.other = b; - subject.push(a); - clip.push(b); - }); - clip.sort(d3_geo_clipSort); - d3_geo_clipLinkCircular(subject); - d3_geo_clipLinkCircular(clip); - if (!subject.length) return; - var start = subject[0], current, points, point; - while (1) { - current = start; - while (current.visited) if ((current = current.next) === start) return; - points = current.points; - listener.lineStart(); - do { - current.visited = current.other.visited = true; - if (current.entry) { - if (current.subject) { - for (var i = 0; i < points.length; i++) listener.point((point = points[i])[0], point[1]); - } else { - interpolate(current.point, current.next.point, 1, listener); - } - current = current.next; - } else { - if (current.subject) { - points = current.prev.points; - for (var i = points.length; --i >= 0; ) listener.point((point = points[i])[0], point[1]); - } else { - interpolate(current.point, current.prev.point, -1, listener); - } - current = current.prev; - } - current = current.other; - points = current.points; - } while (!current.visited); - listener.lineEnd(); - } - } - function d3_geo_clipLinkCircular(array) { - if (!(n = array.length)) return; - var n, i = 0, a = array[0], b; - while (++i < n) { - a.next = b = array[i]; - b.prev = a; - a = b; - } - a.next = b = array[0]; - b.prev = a; - } - function d3_geo_clipSort(a, b) { - return ((a = a.point)[0] < 0 ? a[1] - π / 2 - ε : π / 2 - a[1]) - ((b = b.point)[0] < 0 ? b[1] - π / 2 - ε : π / 2 - b[1]); - } - function d3_geo_clipSegmentLength1(segment) { - return segment.length > 1; - } - function d3_geo_clipBufferListener() { - var lines = [], line; - return { - lineStart: function() { - lines.push(line = []); - }, - point: function(λ, φ) { - line.push([ λ, φ ]); - }, - lineEnd: d3_noop, - buffer: function() { - var buffer = lines; - lines = []; - line = null; - return buffer; - } - }; - } - function d3_geo_clipAreaRing(ring, invisible) { - if (!(n = ring.length)) return 0; - var n, i = 0, area = 0, p = ring[0], λ = p[0], φ = p[1], cosφ = Math.cos(φ), x0 = Math.atan2(invisible * Math.sin(λ) * cosφ, Math.sin(φ)), y0 = 1 - invisible * Math.cos(λ) * cosφ, x1 = x0, x, y; - while (++i < n) { - p = ring[i]; - cosφ = Math.cos(φ = p[1]); - x = Math.atan2(invisible * Math.sin(λ = p[0]) * cosφ, Math.sin(φ)); - y = 1 - invisible * Math.cos(λ) * cosφ; - if (Math.abs(y0 - 2) < ε && Math.abs(y - 2) < ε) continue; - if (Math.abs(y) < ε || Math.abs(y0) < ε) {} else if (Math.abs(Math.abs(x - x0) - π) < ε) { - if (y + y0 > 2) area += 4 * (x - x0); - } else if (Math.abs(y0 - 2) < ε) area += 4 * (x - x1); else area += ((3 * π + x - x0) % (2 * π) - π) * (y0 + y); - x1 = x0, x0 = x, y0 = y; - } - return area; - } - var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate); - function d3_geo_clipAntimeridianLine(listener) { - var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean; - return { - lineStart: function() { - listener.lineStart(); - clean = 1; - }, - point: function(λ1, φ1) { - var sλ1 = λ1 > 0 ? π : -π, dλ = Math.abs(λ1 - λ0); - if (Math.abs(dλ - π) < ε) { - listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? π / 2 : -π / 2); - listener.point(sλ0, φ0); - listener.lineEnd(); - listener.lineStart(); - listener.point(sλ1, φ0); - listener.point(λ1, φ0); - clean = 0; - } else if (sλ0 !== sλ1 && dλ >= π) { - if (Math.abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; - if (Math.abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; - φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); - listener.point(sλ0, φ0); - listener.lineEnd(); - listener.lineStart(); - listener.point(sλ1, φ0); - clean = 0; - } - listener.point(λ0 = λ1, φ0 = φ1); - sλ0 = sλ1; - }, - lineEnd: function() { - listener.lineEnd(); - λ0 = φ0 = NaN; - }, - clean: function() { - return 2 - clean; - } - }; - } - function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { - var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1); - return Math.abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2; - } - function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { - var φ; - if (from == null) { - φ = direction * π / 2; - listener.point(-π, φ); - listener.point(0, φ); - listener.point(π, φ); - listener.point(π, 0); - listener.point(π, -φ); - listener.point(0, -φ); - listener.point(-π, -φ); - listener.point(-π, 0); - listener.point(-π, φ); - } else if (Math.abs(from[0] - to[0]) > ε) { - var s = (from[0] < to[0] ? 1 : -1) * π; - φ = direction * s / 2; - listener.point(-s, φ); - listener.point(0, φ); - listener.point(s, φ); - } else { - listener.point(to[0], to[1]); - } - } - function d3_geo_clipCircle(degrees) { - var radians = degrees * d3_radians, cr = Math.cos(radians), interpolate = d3_geo_circleInterpolate(radians, 6 * d3_radians); - return d3_geo_clip(visible, clipLine, interpolate); - function visible(λ, φ) { - return Math.cos(λ) * Math.cos(φ) > cr; - } - function clipLine(listener) { - var point0, v0, v00, clean; - return { - lineStart: function() { - v00 = v0 = false; - clean = 1; - }, - point: function(λ, φ) { - var point1 = [ λ, φ ], point2, v = visible(λ, φ); - if (!point0 && (v00 = v0 = v)) listener.lineStart(); - if (v !== v0) { - point2 = intersect(point0, point1); - if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { - point1[0] += ε; - point1[1] += ε; - v = visible(point1[0], point1[1]); - } - } - if (v !== v0) { - clean = 0; - if (v0 = v) { - listener.lineStart(); - point2 = intersect(point1, point0); - listener.point(point2[0], point2[1]); - } else { - point2 = intersect(point0, point1); - listener.point(point2[0], point2[1]); - listener.lineEnd(); - } - point0 = point2; - } - if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) listener.point(point1[0], point1[1]); - point0 = point1; - }, - lineEnd: function() { - if (v0) listener.lineEnd(); - point0 = null; - }, - clean: function() { - return clean | (v00 && v0) << 1; - } - }; - } - function intersect(a, b) { - var pa = d3_geo_cartesian(a, 0), pb = d3_geo_cartesian(b, 0); - var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; - if (!determinant) return a; - var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2); - d3_geo_cartesianAdd(A, B); - var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t = Math.sqrt(w * w - uu * (d3_geo_cartesianDot(A, A) - 1)), q = d3_geo_cartesianScale(u, (-w - t) / uu); - d3_geo_cartesianAdd(q, A); - return d3_geo_spherical(q); - } - } - function d3_geo_compose(a, b) { - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); - } - if (a.invert && b.invert) compose.invert = function(x, y) { - return x = b.invert(x, y), a.invert(x[0], x[1]); - }; - return compose; - } - function d3_geo_equirectangular(λ, φ) { - return [ λ, φ ]; - } - (d3.geo.equirectangular = function() { - return d3_geo_projection(d3_geo_equirectangular).scale(250 / π); - }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; - var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) { - return 1 / cosλcosφ; - }, Math.atan); - (d3.geo.gnomonic = function() { - return d3_geo_projection(d3_geo_gnomonic); - }).raw = d3_geo_gnomonic; - d3.geo.graticule = function() { - var x1, x0, y1, y0, dx = 22.5, dy = dx, x, y, precision = 2.5; - function graticule() { - return { - type: "MultiLineString", - coordinates: lines() - }; - } - function lines() { - return d3.range(Math.ceil(x0 / dx) * dx, x1, dx).map(x).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).map(y)); - } - graticule.lines = function() { - return lines().map(function(coordinates) { - return { - type: "LineString", - coordinates: coordinates - }; - }); - }; - graticule.outline = function() { - return { - type: "Polygon", - coordinates: [ x(x0).concat(y(y1).slice(1), x(x1).reverse().slice(1), y(y0).reverse().slice(1)) ] - }; - }; - graticule.extent = function(_) { - if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; - x0 = +_[0][0], x1 = +_[1][0]; - y0 = +_[0][1], y1 = +_[1][1]; - if (x0 > x1) _ = x0, x0 = x1, x1 = _; - if (y0 > y1) _ = y0, y0 = y1, y1 = _; - return graticule.precision(precision); - }; - graticule.step = function(_) { - if (!arguments.length) return [ dx, dy ]; - dx = +_[0], dy = +_[1]; - return graticule; - }; - graticule.precision = function(_) { - if (!arguments.length) return precision; - precision = +_; - x = d3_geo_graticuleX(y0, y1, precision); - y = d3_geo_graticuleY(x0, x1, precision); - return graticule; - }; - return graticule.extent([ [ -180 + ε, -90 + ε ], [ 180 - ε, 90 - ε ] ]); - }; - function d3_geo_graticuleX(y0, y1, dy) { - var y = d3.range(y0, y1 - ε, dy).concat(y1); - return function(x) { - return y.map(function(y) { - return [ x, y ]; - }); - }; - } - function d3_geo_graticuleY(x0, x1, dx) { - var x = d3.range(x0, x1 - ε, dx).concat(x1); - return function(y) { - return x.map(function(x) { - return [ x, y ]; - }); - }; - } - d3.geo.interpolate = function(source, target) { - return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians); - }; - function d3_geo_interpolate(x0, y0, x1, y1) { - var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))), k = 1 / Math.sin(d); - function interpolate(t) { - var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; - return [ Math.atan2(y, x) / d3_radians, Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_radians ]; - } - interpolate.distance = d; - return interpolate; - } - d3.geo.greatArc = function() { - var source = d3_source, s, target = d3_target, t, precision = 6 * d3_radians, interpolate; - function greatArc() { - var p0 = s || source.apply(this, arguments), p1 = t || target.apply(this, arguments), i = interpolate || d3.geo.interpolate(p0, p1), t = 0, dt = precision / i.distance, coordinates = [ p0 ]; - while ((t += dt) < 1) coordinates.push(i(t)); - coordinates.push(p1); - return { - type: "LineString", - coordinates: coordinates - }; - } - greatArc.distance = function() { - return (interpolate || d3.geo.interpolate(s || source.apply(this, arguments), t || target.apply(this, arguments))).distance; - }; - greatArc.source = function(_) { - if (!arguments.length) return source; - source = _, s = typeof _ === "function" ? null : _; - interpolate = s && t ? d3.geo.interpolate(s, t) : null; - return greatArc; - }; - greatArc.target = function(_) { - if (!arguments.length) return target; - target = _, t = typeof _ === "function" ? null : _; - interpolate = s && t ? d3.geo.interpolate(s, t) : null; - return greatArc; - }; - greatArc.precision = function(_) { - if (!arguments.length) return precision / d3_radians; - precision = _ * d3_radians; - return greatArc; - }; - return greatArc; - }; - function d3_geo_mercator(λ, φ) { - return [ λ / (2 * π), Math.max(-.5, Math.min(+.5, Math.log(Math.tan(π / 4 + φ / 2)) / (2 * π))) ]; - } - d3_geo_mercator.invert = function(x, y) { - return [ 2 * π * x, 2 * Math.atan(Math.exp(2 * π * y)) - π / 2 ]; - }; - (d3.geo.mercator = function() { - return d3_geo_projection(d3_geo_mercator).scale(500); - }).raw = d3_geo_mercator; - var d3_geo_orthographic = d3_geo_azimuthal(function() { - return 1; - }, Math.asin); - (d3.geo.orthographic = function() { - return d3_geo_projection(d3_geo_orthographic); - }).raw = d3_geo_orthographic; - d3.geo.path = function() { - var pointRadius = 4.5, projection, context, projectStream, contextStream; - function path(object) { - if (object) d3.geo.stream(object, projectStream(contextStream.pointRadius(typeof pointRadius === "function" ? +pointRadius.apply(this, arguments) : pointRadius))); - return contextStream.result(); - } - path.area = function(object) { - d3_geo_pathAreaSum = 0; - d3.geo.stream(object, projectStream(d3_geo_pathArea)); - return d3_geo_pathAreaSum; - }; - path.centroid = function(object) { - d3_geo_centroidDimension = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0; - d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); - return d3_geo_centroidZ ? [ d3_geo_centroidX / d3_geo_centroidZ, d3_geo_centroidY / d3_geo_centroidZ ] : undefined; - }; - path.bounds = function(object) { - return d3_geo_bounds(projection)(object); - }; - path.projection = function(_) { - if (!arguments.length) return projection; - projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; - return path; - }; - path.context = function(_) { - if (!arguments.length) return context; - contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_); - return path; - }; - path.pointRadius = function(_) { - if (!arguments.length) return pointRadius; - pointRadius = typeof _ === "function" ? _ : +_; - return path; - }; - return path.projection(d3.geo.albersUsa()).context(null); - }; - function d3_geo_pathCircle(radius) { - return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + +2 * radius + "z"; - } - function d3_geo_pathProjectStream(project) { - var resample = d3_geo_resample(function(λ, φ) { - return project([ λ * d3_degrees, φ * d3_degrees ]); - }); - return function(stream) { - stream = resample(stream); - return { - point: function(λ, φ) { - stream.point(λ * d3_radians, φ * d3_radians); - }, - sphere: function() { - stream.sphere(); - }, - lineStart: function() { - stream.lineStart(); - }, - lineEnd: function() { - stream.lineEnd(); - }, - polygonStart: function() { - stream.polygonStart(); - }, - polygonEnd: function() { - stream.polygonEnd(); - } - }; - }; - } - function d3_geo_pathBuffer() { - var pointCircle = d3_geo_pathCircle(4.5), buffer = []; - var stream = { - point: point, - lineStart: function() { - stream.point = pointLineStart; - }, - lineEnd: lineEnd, - polygonStart: function() { - stream.lineEnd = lineEndPolygon; - }, - polygonEnd: function() { - stream.lineEnd = lineEnd; - stream.point = point; - }, - pointRadius: function(_) { - pointCircle = d3_geo_pathCircle(_); - return stream; - }, - result: function() { - if (buffer.length) { - var result = buffer.join(""); - buffer = []; - return result; - } - } - }; - function point(x, y) { - buffer.push("M", x, ",", y, pointCircle); - } - function pointLineStart(x, y) { - buffer.push("M", x, ",", y); - stream.point = pointLine; - } - function pointLine(x, y) { - buffer.push("L", x, ",", y); - } - function lineEnd() { - stream.point = point; - } - function lineEndPolygon() { - buffer.push("Z"); - } - return stream; - } - function d3_geo_pathContext(context) { - var pointRadius = 4.5; - var stream = { - point: point, - lineStart: function() { - stream.point = pointLineStart; - }, - lineEnd: lineEnd, - polygonStart: function() { - stream.lineEnd = lineEndPolygon; - }, - polygonEnd: function() { - stream.lineEnd = lineEnd; - stream.point = point; - }, - pointRadius: function(_) { - pointRadius = _; - return stream; - }, - result: d3_noop - }; - function point(x, y) { - context.moveTo(x, y); - context.arc(x, y, pointRadius, 0, 2 * π); - } - function pointLineStart(x, y) { - context.moveTo(x, y); - stream.point = pointLine; - } - function pointLine(x, y) { - context.lineTo(x, y); - } - function lineEnd() { - stream.point = point; - } - function lineEndPolygon() { - context.closePath(); - } - return stream; - } - var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { - point: d3_noop, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: function() { - d3_geo_pathAreaPolygon = 0; - d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; - }, - polygonEnd: function() { - d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; - d3_geo_pathAreaSum += Math.abs(d3_geo_pathAreaPolygon / 2); - } - }; - function d3_geo_pathAreaRingStart() { - var x00, y00, x0, y0; - d3_geo_pathArea.point = function(x, y) { - d3_geo_pathArea.point = nextPoint; - x00 = x0 = x, y00 = y0 = y; - }; - function nextPoint(x, y) { - d3_geo_pathAreaPolygon += y0 * x - x0 * y; - x0 = x, y0 = y; - } - d3_geo_pathArea.lineEnd = function() { - nextPoint(x00, y00); - }; - } - var d3_geo_pathCentroid = { - point: d3_geo_pathCentroidPoint, - lineStart: d3_geo_pathCentroidLineStart, - lineEnd: d3_geo_pathCentroidLineEnd, - polygonStart: function() { - d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; - }, - polygonEnd: function() { - d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; - d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; - d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; - } - }; - function d3_geo_pathCentroidPoint(x, y) { - if (d3_geo_centroidDimension) return; - d3_geo_centroidX += x; - d3_geo_centroidY += y; - ++d3_geo_centroidZ; - } - function d3_geo_pathCentroidLineStart() { - var x0, y0; - if (d3_geo_centroidDimension !== 1) { - if (d3_geo_centroidDimension < 1) { - d3_geo_centroidDimension = 1; - d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0; - } else return; - } - d3_geo_pathCentroid.point = function(x, y) { - d3_geo_pathCentroid.point = nextPoint; - x0 = x, y0 = y; - }; - function nextPoint(x, y) { - var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); - d3_geo_centroidX += z * (x0 + x) / 2; - d3_geo_centroidY += z * (y0 + y) / 2; - d3_geo_centroidZ += z; - x0 = x, y0 = y; - } - } - function d3_geo_pathCentroidLineEnd() { - d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; - } - function d3_geo_pathCentroidRingStart() { - var x00, y00, x0, y0; - if (d3_geo_centroidDimension < 2) { - d3_geo_centroidDimension = 2; - d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0; - } - d3_geo_pathCentroid.point = function(x, y) { - d3_geo_pathCentroid.point = nextPoint; - x00 = x0 = x, y00 = y0 = y; - }; - function nextPoint(x, y) { - var z = y0 * x - x0 * y; - d3_geo_centroidX += z * (x0 + x); - d3_geo_centroidY += z * (y0 + y); - d3_geo_centroidZ += z * 3; - x0 = x, y0 = y; - } - d3_geo_pathCentroid.lineEnd = function() { - nextPoint(x00, y00); - }; - } - d3.geo.area = function(object) { - d3_geo_areaSum = 0; - d3.geo.stream(object, d3_geo_area); - return d3_geo_areaSum; - }; - var d3_geo_areaSum, d3_geo_areaRing; - var d3_geo_area = { - sphere: function() { - d3_geo_areaSum += 4 * π; - }, - point: d3_noop, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: function() { - d3_geo_areaRing = 0; - d3_geo_area.lineStart = d3_geo_areaRingStart; - }, - polygonEnd: function() { - d3_geo_areaSum += d3_geo_areaRing < 0 ? 4 * π + d3_geo_areaRing : d3_geo_areaRing; - d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; - } - }; - function d3_geo_areaRingStart() { - var λ00, φ00, λ1, λ0, φ0, cosφ0, sinφ0; - d3_geo_area.point = function(λ, φ) { - d3_geo_area.point = nextPoint; - λ1 = λ0 = (λ00 = λ) * d3_radians, φ0 = (φ00 = φ) * d3_radians, cosφ0 = Math.cos(φ0), - sinφ0 = Math.sin(φ0); - }; - function nextPoint(λ, φ) { - λ *= d3_radians, φ *= d3_radians; - if (Math.abs(Math.abs(φ0) - π / 2) < ε && Math.abs(Math.abs(φ) - π / 2) < ε) return; - var cosφ = Math.cos(φ), sinφ = Math.sin(φ); - if (Math.abs(φ0 - π / 2) < ε) d3_geo_areaRing += (λ - λ1) * 2; else { - var dλ = λ - λ0, cosdλ = Math.cos(dλ), d = Math.atan2(Math.sqrt((d = cosφ * Math.sin(dλ)) * d + (d = cosφ0 * sinφ - sinφ0 * cosφ * cosdλ) * d), sinφ0 * sinφ + cosφ0 * cosφ * cosdλ), s = (d + π + φ0 + φ) / 4; - d3_geo_areaRing += (dλ < 0 && dλ > -π || dλ > π ? -4 : 4) * Math.atan(Math.sqrt(Math.abs(Math.tan(s) * Math.tan(s - d / 2) * Math.tan(s - π / 4 - φ0 / 2) * Math.tan(s - π / 4 - φ / 2)))); - } - λ1 = λ0, λ0 = λ, φ0 = φ, cosφ0 = cosφ, sinφ0 = sinφ; - } - d3_geo_area.lineEnd = function() { - nextPoint(λ00, φ00); - }; - } - d3.geo.projection = d3_geo_projection; - d3.geo.projectionMutator = d3_geo_projectionMutator; - function d3_geo_projection(project) { - return d3_geo_projectionMutator(function() { - return project; - })(); - } - function d3_geo_projectionMutator(projectAt) { - var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) { - x = project(x, y); - return [ x[0] * k + δx, δy - x[1] * k ]; - }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, clip = d3_geo_clipAntimeridian, clipAngle = null; - function projection(point) { - point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); - return [ point[0] * k + δx, δy - point[1] * k ]; - } - function invert(point) { - point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); - return [ point[0] * d3_degrees, point[1] * d3_degrees ]; - } - projection.stream = function(stream) { - return d3_geo_projectionRadiansRotate(rotate, clip(projectResample(stream))); - }; - projection.clipAngle = function(_) { - if (!arguments.length) return clipAngle; - clip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle(clipAngle = +_); - return projection; - }; - projection.scale = function(_) { - if (!arguments.length) return k; - k = +_; - return reset(); - }; - projection.translate = function(_) { - if (!arguments.length) return [ x, y ]; - x = +_[0]; - y = +_[1]; - return reset(); - }; - projection.center = function(_) { - if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ]; - λ = _[0] % 360 * d3_radians; - φ = _[1] % 360 * d3_radians; - return reset(); - }; - projection.rotate = function(_) { - if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ]; - δλ = _[0] % 360 * d3_radians; - δφ = _[1] % 360 * d3_radians; - δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; - return reset(); - }; - d3.rebind(projection, projectResample, "precision"); - function reset() { - projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); - var center = project(λ, φ); - δx = x - center[0] * k; - δy = y + center[1] * k; - return projection; - } - return function() { - project = projectAt.apply(this, arguments); - projection.invert = project.invert && invert; - return reset(); - }; - } - function d3_geo_projectionRadiansRotate(rotate, stream) { - return { - point: function(x, y) { - y = rotate(x * d3_radians, y * d3_radians), x = y[0]; - stream.point(x > π ? x - 2 * π : x < -π ? x + 2 * π : x, y[1]); - }, - sphere: function() { - stream.sphere(); - }, - lineStart: function() { - stream.lineStart(); - }, - lineEnd: function() { - stream.lineEnd(); - }, - polygonStart: function() { - stream.polygonStart(); - }, - polygonEnd: function() { - stream.polygonEnd(); - } - }; - } - function d3_geo_rotation(δλ, δφ, δγ) { - return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_equirectangular; - } - function d3_geo_forwardRotationλ(δλ) { - return function(λ, φ) { - return λ += δλ, [ λ > π ? λ - 2 * π : λ < -π ? λ + 2 * π : λ, φ ]; - }; - } - function d3_geo_rotationλ(δλ) { - var rotation = d3_geo_forwardRotationλ(δλ); - rotation.invert = d3_geo_forwardRotationλ(-δλ); - return rotation; - } - function d3_geo_rotationφγ(δφ, δγ) { - var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ); - function rotation(λ, φ) { - var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ; - return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), Math.asin(Math.max(-1, Math.min(1, k * cosδγ + y * sinδγ))) ]; - } - rotation.invert = function(λ, φ) { - var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ; - return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), Math.asin(Math.max(-1, Math.min(1, k * cosδφ - x * sinδφ))) ]; - }; - return rotation; - } - var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) { - return 1 / (1 + cosλcosφ); - }, function(ρ) { - return 2 * Math.atan(ρ); - }); - (d3.geo.stereographic = function() { - return d3_geo_projection(d3_geo_stereographic); - }).raw = d3_geo_stereographic; - function d3_geo_azimuthal(scale, angle) { - function azimuthal(λ, φ) { - var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ); - return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ]; - } - azimuthal.invert = function(x, y) { - var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c); - return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ]; - }; - return azimuthal; - } - d3.geom = {}; - d3.geom.hull = function(vertices) { - if (vertices.length < 3) return []; - var len = vertices.length, plen = len - 1, points = [], stack = [], i, j, h = 0, x1, y1, x2, y2, u, v, a, sp; - for (i = 1; i < len; ++i) { - if (vertices[i][1] < vertices[h][1]) { - h = i; - } else if (vertices[i][1] == vertices[h][1]) { - h = vertices[i][0] < vertices[h][0] ? i : h; - } - } - for (i = 0; i < len; ++i) { - if (i === h) continue; - y1 = vertices[i][1] - vertices[h][1]; - x1 = vertices[i][0] - vertices[h][0]; - points.push({ - angle: Math.atan2(y1, x1), - index: i - }); - } - points.sort(function(a, b) { - return a.angle - b.angle; - }); - a = points[0].angle; - v = points[0].index; - u = 0; - for (i = 1; i < plen; ++i) { - j = points[i].index; - if (a == points[i].angle) { - x1 = vertices[v][0] - vertices[h][0]; - y1 = vertices[v][1] - vertices[h][1]; - x2 = vertices[j][0] - vertices[h][0]; - y2 = vertices[j][1] - vertices[h][1]; - if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) { - points[i].index = -1; - } else { - points[u].index = -1; - a = points[i].angle; - u = i; - v = j; - } - } else { - a = points[i].angle; - u = i; - v = j; - } - } - stack.push(h); - for (i = 0, j = 0; i < 2; ++j) { - if (points[j].index !== -1) { - stack.push(points[j].index); - i++; - } - } - sp = stack.length; - for (;j < plen; ++j) { - if (points[j].index === -1) continue; - while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) { - --sp; - } - stack[sp++] = points[j].index; - } - var poly = []; - for (i = 0; i < sp; ++i) { - poly.push(vertices[stack[i]]); - } - return poly; - }; - function d3_geom_hullCCW(i1, i2, i3, v) { - var t, a, b, c, d, e, f; - t = v[i1]; - a = t[0]; - b = t[1]; - t = v[i2]; - c = t[0]; - d = t[1]; - t = v[i3]; - e = t[0]; - f = t[1]; - return (f - b) * (c - a) - (d - b) * (e - a) > 0; - } - d3.geom.polygon = function(coordinates) { - coordinates.area = function() { - var i = 0, n = coordinates.length, area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1]; - while (++i < n) { - area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1]; - } - return area * .5; - }; - coordinates.centroid = function(k) { - var i = -1, n = coordinates.length, x = 0, y = 0, a, b = coordinates[n - 1], c; - if (!arguments.length) k = -1 / (6 * coordinates.area()); - while (++i < n) { - a = b; - b = coordinates[i]; - c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; - } - return [ x * k, y * k ]; - }; - coordinates.clip = function(subject) { - var input, i = -1, n = coordinates.length, j, m, a = coordinates[n - 1], b, c, d; - while (++i < n) { - input = subject.slice(); - subject.length = 0; - b = coordinates[i]; - c = input[(m = input.length) - 1]; - j = -1; - while (++j < m) { - d = input[j]; - if (d3_geom_polygonInside(d, a, b)) { - if (!d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - subject.push(d); - } else if (d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - c = d; - } - a = b; - } - return subject; - }; - return coordinates; - }; - function d3_geom_polygonInside(p, a, b) { - return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); - } - function d3_geom_polygonIntersect(c, d, a, b) { - var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); - return [ x1 + ua * x21, y1 + ua * y21 ]; - } - d3.geom.voronoi = function(vertices) { - var polygons = vertices.map(function() { - return []; - }), Z = 1e6; - d3_voronoi_tessellate(vertices, function(e) { - var s1, s2, x1, x2, y1, y2; - if (e.a === 1 && e.b >= 0) { - s1 = e.ep.r; - s2 = e.ep.l; - } else { - s1 = e.ep.l; - s2 = e.ep.r; - } - if (e.a === 1) { - y1 = s1 ? s1.y : -Z; - x1 = e.c - e.b * y1; - y2 = s2 ? s2.y : Z; - x2 = e.c - e.b * y2; - } else { - x1 = s1 ? s1.x : -Z; - y1 = e.c - e.a * x1; - x2 = s2 ? s2.x : Z; - y2 = e.c - e.a * x2; - } - var v1 = [ x1, y1 ], v2 = [ x2, y2 ]; - polygons[e.region.l.index].push(v1, v2); - polygons[e.region.r.index].push(v1, v2); - }); - polygons = polygons.map(function(polygon, i) { - var cx = vertices[i][0], cy = vertices[i][1], angle = polygon.map(function(v) { - return Math.atan2(v[0] - cx, v[1] - cy); - }); - return d3.range(polygon.length).sort(function(a, b) { - return angle[a] - angle[b]; - }).filter(function(d, i, order) { - return !i || angle[d] - angle[order[i - 1]] > ε; - }).map(function(d) { - return polygon[d]; - }); - }); - polygons.forEach(function(polygon, i) { - var n = polygon.length; - if (!n) return polygon.push([ -Z, -Z ], [ -Z, Z ], [ Z, Z ], [ Z, -Z ]); - if (n > 2) return; - var p0 = vertices[i], p1 = polygon[0], p2 = polygon[1], x0 = p0[0], y0 = p0[1], x1 = p1[0], y1 = p1[1], x2 = p2[0], y2 = p2[1], dx = Math.abs(x2 - x1), dy = y2 - y1; - if (Math.abs(dy) < ε) { - var y = y0 < y1 ? -Z : Z; - polygon.push([ -Z, y ], [ Z, y ]); - } else if (dx < ε) { - var x = x0 < x1 ? -Z : Z; - polygon.push([ x, -Z ], [ x, Z ]); - } else { - var y = (x2 - x1) * (y1 - y0) < (x1 - x0) * (y2 - y1) ? Z : -Z, z = Math.abs(dy) - dx; - if (Math.abs(z) < ε) { - polygon.push([ dy < 0 ? y : -y, y ]); - } else { - if (z > 0) y *= -1; - polygon.push([ -Z, y ], [ Z, y ]); - } - } - }); - return polygons; - }; - var d3_voronoi_opposite = { - l: "r", - r: "l" - }; - function d3_voronoi_tessellate(vertices, callback) { - var Sites = { - list: vertices.map(function(v, i) { - return { - index: i, - x: v[0], - y: v[1] - }; - }).sort(function(a, b) { - return a.y < b.y ? -1 : a.y > b.y ? 1 : a.x < b.x ? -1 : a.x > b.x ? 1 : 0; - }), - bottomSite: null - }; - var EdgeList = { - list: [], - leftEnd: null, - rightEnd: null, - init: function() { - EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l"); - EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l"); - EdgeList.leftEnd.r = EdgeList.rightEnd; - EdgeList.rightEnd.l = EdgeList.leftEnd; - EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd); - }, - createHalfEdge: function(edge, side) { - return { - edge: edge, - side: side, - vertex: null, - l: null, - r: null - }; - }, - insert: function(lb, he) { - he.l = lb; - he.r = lb.r; - lb.r.l = he; - lb.r = he; - }, - leftBound: function(p) { - var he = EdgeList.leftEnd; - do { - he = he.r; - } while (he != EdgeList.rightEnd && Geom.rightOf(he, p)); - he = he.l; - return he; - }, - del: function(he) { - he.l.r = he.r; - he.r.l = he.l; - he.edge = null; - }, - right: function(he) { - return he.r; - }, - left: function(he) { - return he.l; - }, - leftRegion: function(he) { - return he.edge == null ? Sites.bottomSite : he.edge.region[he.side]; - }, - rightRegion: function(he) { - return he.edge == null ? Sites.bottomSite : he.edge.region[d3_voronoi_opposite[he.side]]; - } - }; - var Geom = { - bisect: function(s1, s2) { - var newEdge = { - region: { - l: s1, - r: s2 - }, - ep: { - l: null, - r: null - } - }; - var dx = s2.x - s1.x, dy = s2.y - s1.y, adx = dx > 0 ? dx : -dx, ady = dy > 0 ? dy : -dy; - newEdge.c = s1.x * dx + s1.y * dy + (dx * dx + dy * dy) * .5; - if (adx > ady) { - newEdge.a = 1; - newEdge.b = dy / dx; - newEdge.c /= dx; - } else { - newEdge.b = 1; - newEdge.a = dx / dy; - newEdge.c /= dy; - } - return newEdge; - }, - intersect: function(el1, el2) { - var e1 = el1.edge, e2 = el2.edge; - if (!e1 || !e2 || e1.region.r == e2.region.r) { - return null; - } - var d = e1.a * e2.b - e1.b * e2.a; - if (Math.abs(d) < 1e-10) { - return null; - } - var xint = (e1.c * e2.b - e2.c * e1.b) / d, yint = (e2.c * e1.a - e1.c * e2.a) / d, e1r = e1.region.r, e2r = e2.region.r, el, e; - if (e1r.y < e2r.y || e1r.y == e2r.y && e1r.x < e2r.x) { - el = el1; - e = e1; - } else { - el = el2; - e = e2; - } - var rightOfSite = xint >= e.region.r.x; - if (rightOfSite && el.side === "l" || !rightOfSite && el.side === "r") { - return null; - } - return { - x: xint, - y: yint - }; - }, - rightOf: function(he, p) { - var e = he.edge, topsite = e.region.r, rightOfSite = p.x > topsite.x; - if (rightOfSite && he.side === "l") { - return 1; - } - if (!rightOfSite && he.side === "r") { - return 0; - } - if (e.a === 1) { - var dyp = p.y - topsite.y, dxp = p.x - topsite.x, fast = 0, above = 0; - if (!rightOfSite && e.b < 0 || rightOfSite && e.b >= 0) { - above = fast = dyp >= e.b * dxp; - } else { - above = p.x + p.y * e.b > e.c; - if (e.b < 0) { - above = !above; - } - if (!above) { - fast = 1; - } - } - if (!fast) { - var dxs = topsite.x - e.region.l.x; - above = e.b * (dxp * dxp - dyp * dyp) < dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b); - if (e.b < 0) { - above = !above; - } - } - } else { - var yl = e.c - e.a * p.x, t1 = p.y - yl, t2 = p.x - topsite.x, t3 = yl - topsite.y; - above = t1 * t1 > t2 * t2 + t3 * t3; - } - return he.side === "l" ? above : !above; - }, - endPoint: function(edge, side, site) { - edge.ep[side] = site; - if (!edge.ep[d3_voronoi_opposite[side]]) return; - callback(edge); - }, - distance: function(s, t) { - var dx = s.x - t.x, dy = s.y - t.y; - return Math.sqrt(dx * dx + dy * dy); - } - }; - var EventQueue = { - list: [], - insert: function(he, site, offset) { - he.vertex = site; - he.ystar = site.y + offset; - for (var i = 0, list = EventQueue.list, l = list.length; i < l; i++) { - var next = list[i]; - if (he.ystar > next.ystar || he.ystar == next.ystar && site.x > next.vertex.x) { - continue; - } else { - break; - } - } - list.splice(i, 0, he); - }, - del: function(he) { - for (var i = 0, ls = EventQueue.list, l = ls.length; i < l && ls[i] != he; ++i) {} - ls.splice(i, 1); - }, - empty: function() { - return EventQueue.list.length === 0; - }, - nextEvent: function(he) { - for (var i = 0, ls = EventQueue.list, l = ls.length; i < l; ++i) { - if (ls[i] == he) return ls[i + 1]; - } - return null; - }, - min: function() { - var elem = EventQueue.list[0]; - return { - x: elem.vertex.x, - y: elem.ystar - }; - }, - extractMin: function() { - return EventQueue.list.shift(); - } - }; - EdgeList.init(); - Sites.bottomSite = Sites.list.shift(); - var newSite = Sites.list.shift(), newIntStar; - var lbnd, rbnd, llbnd, rrbnd, bisector; - var bot, top, temp, p, v; - var e, pm; - while (true) { - if (!EventQueue.empty()) { - newIntStar = EventQueue.min(); - } - if (newSite && (EventQueue.empty() || newSite.y < newIntStar.y || newSite.y == newIntStar.y && newSite.x < newIntStar.x)) { - lbnd = EdgeList.leftBound(newSite); - rbnd = EdgeList.right(lbnd); - bot = EdgeList.rightRegion(lbnd); - e = Geom.bisect(bot, newSite); - bisector = EdgeList.createHalfEdge(e, "l"); - EdgeList.insert(lbnd, bisector); - p = Geom.intersect(lbnd, bisector); - if (p) { - EventQueue.del(lbnd); - EventQueue.insert(lbnd, p, Geom.distance(p, newSite)); - } - lbnd = bisector; - bisector = EdgeList.createHalfEdge(e, "r"); - EdgeList.insert(lbnd, bisector); - p = Geom.intersect(bisector, rbnd); - if (p) { - EventQueue.insert(bisector, p, Geom.distance(p, newSite)); - } - newSite = Sites.list.shift(); - } else if (!EventQueue.empty()) { - lbnd = EventQueue.extractMin(); - llbnd = EdgeList.left(lbnd); - rbnd = EdgeList.right(lbnd); - rrbnd = EdgeList.right(rbnd); - bot = EdgeList.leftRegion(lbnd); - top = EdgeList.rightRegion(rbnd); - v = lbnd.vertex; - Geom.endPoint(lbnd.edge, lbnd.side, v); - Geom.endPoint(rbnd.edge, rbnd.side, v); - EdgeList.del(lbnd); - EventQueue.del(rbnd); - EdgeList.del(rbnd); - pm = "l"; - if (bot.y > top.y) { - temp = bot; - bot = top; - top = temp; - pm = "r"; - } - e = Geom.bisect(bot, top); - bisector = EdgeList.createHalfEdge(e, pm); - EdgeList.insert(llbnd, bisector); - Geom.endPoint(e, d3_voronoi_opposite[pm], v); - p = Geom.intersect(llbnd, bisector); - if (p) { - EventQueue.del(llbnd); - EventQueue.insert(llbnd, p, Geom.distance(p, bot)); - } - p = Geom.intersect(bisector, rrbnd); - if (p) { - EventQueue.insert(bisector, p, Geom.distance(p, bot)); - } - } else { - break; - } - } - for (lbnd = EdgeList.right(EdgeList.leftEnd); lbnd != EdgeList.rightEnd; lbnd = EdgeList.right(lbnd)) { - callback(lbnd.edge); - } - } - d3.geom.delaunay = function(vertices) { - var edges = vertices.map(function() { - return []; - }), triangles = []; - d3_voronoi_tessellate(vertices, function(e) { - edges[e.region.l.index].push(vertices[e.region.r.index]); - }); - edges.forEach(function(edge, i) { - var v = vertices[i], cx = v[0], cy = v[1]; - edge.forEach(function(v) { - v.angle = Math.atan2(v[0] - cx, v[1] - cy); - }); - edge.sort(function(a, b) { - return a.angle - b.angle; - }); - for (var j = 0, m = edge.length - 1; j < m; j++) { - triangles.push([ v, edge[j], edge[j + 1] ]); - } - }); - return triangles; - }; - d3.geom.quadtree = function(points, x1, y1, x2, y2) { - var p, i = -1, n = points.length; - if (arguments.length < 5) { - if (arguments.length === 3) { - y2 = y1; - x2 = x1; - y1 = x1 = 0; - } else { - x1 = y1 = Infinity; - x2 = y2 = -Infinity; - while (++i < n) { - p = points[i]; - if (p.x < x1) x1 = p.x; - if (p.y < y1) y1 = p.y; - if (p.x > x2) x2 = p.x; - if (p.y > y2) y2 = p.y; - } - } - } - var dx = x2 - x1, dy = y2 - y1; - if (dx > dy) y2 = y1 + dx; else x2 = x1 + dy; - function insert(n, p, x1, y1, x2, y2) { - if (isNaN(p.x) || isNaN(p.y)) return; - if (n.leaf) { - var v = n.point; - if (v) { - if (Math.abs(v.x - p.x) + Math.abs(v.y - p.y) < .01) { - insertChild(n, p, x1, y1, x2, y2); - } else { - n.point = null; - insertChild(n, v, x1, y1, x2, y2); - insertChild(n, p, x1, y1, x2, y2); - } - } else { - n.point = p; - } - } else { - insertChild(n, p, x1, y1, x2, y2); - } - } - function insertChild(n, p, x1, y1, x2, y2) { - var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = p.x >= sx, bottom = p.y >= sy, i = (bottom << 1) + right; - n.leaf = false; - n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); - if (right) x1 = sx; else x2 = sx; - if (bottom) y1 = sy; else y2 = sy; - insert(n, p, x1, y1, x2, y2); - } - var root = d3_geom_quadtreeNode(); - root.add = function(p) { - insert(root, p, x1, y1, x2, y2); - }; - root.visit = function(f) { - d3_geom_quadtreeVisit(f, root, x1, y1, x2, y2); - }; - points.forEach(root.add); - return root; - }; - function d3_geom_quadtreeNode() { - return { - leaf: true, - nodes: [], - point: null - }; - } - function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { - if (!f(node, x1, y1, x2, y2)) { - var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes; - if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); - if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); - if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); - if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); - } - } - d3.time = {}; - var d3_time = Date, d3_time_daySymbols = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; - function d3_time_utc() { - this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]); - } - d3_time_utc.prototype = { - getDate: function() { - return this._.getUTCDate(); - }, - getDay: function() { - return this._.getUTCDay(); - }, - getFullYear: function() { - return this._.getUTCFullYear(); - }, - getHours: function() { - return this._.getUTCHours(); - }, - getMilliseconds: function() { - return this._.getUTCMilliseconds(); - }, - getMinutes: function() { - return this._.getUTCMinutes(); - }, - getMonth: function() { - return this._.getUTCMonth(); - }, - getSeconds: function() { - return this._.getUTCSeconds(); - }, - getTime: function() { - return this._.getTime(); - }, - getTimezoneOffset: function() { - return 0; - }, - valueOf: function() { - return this._.valueOf(); - }, - setDate: function() { - d3_time_prototype.setUTCDate.apply(this._, arguments); - }, - setDay: function() { - d3_time_prototype.setUTCDay.apply(this._, arguments); - }, - setFullYear: function() { - d3_time_prototype.setUTCFullYear.apply(this._, arguments); - }, - setHours: function() { - d3_time_prototype.setUTCHours.apply(this._, arguments); - }, - setMilliseconds: function() { - d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); - }, - setMinutes: function() { - d3_time_prototype.setUTCMinutes.apply(this._, arguments); - }, - setMonth: function() { - d3_time_prototype.setUTCMonth.apply(this._, arguments); - }, - setSeconds: function() { - d3_time_prototype.setUTCSeconds.apply(this._, arguments); - }, - setTime: function() { - d3_time_prototype.setTime.apply(this._, arguments); - } - }; - var d3_time_prototype = Date.prototype; - var d3_time_formatDateTime = "%a %b %e %X %Y", d3_time_formatDate = "%m/%d/%Y", d3_time_formatTime = "%H:%M:%S"; - var d3_time_days = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], d3_time_dayAbbreviations = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], d3_time_months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], d3_time_monthAbbreviations = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; - d3.time.format = function(template) { - var n = template.length; - function format(date) { - var string = [], i = -1, j = 0, c, p, f; - while (++i < n) { - if (template.charCodeAt(i) === 37) { - string.push(template.substring(j, i)); - if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i); - if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p); - string.push(c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - format.parse = function(string) { - var d = { - y: 1900, - m: 0, - d: 1, - H: 0, - M: 0, - S: 0, - L: 0 - }, i = d3_time_parse(d, template, string, 0); - if (i != string.length) return null; - if ("p" in d) d.H = d.H % 12 + d.p * 12; - var date = new d3_time(); - date.setFullYear(d.y, d.m, d.d); - date.setHours(d.H, d.M, d.S, d.L); - return date; - }; - format.toString = function() { - return template; - }; - return format; - }; - function d3_time_parse(date, template, string, j) { - var c, p, i = 0, n = template.length, m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c === 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || (j = p(date, string, j)) < 0) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; - } - function d3_time_formatRe(names) { - return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i"); - } - function d3_time_formatLookup(names) { - var map = new d3_Map(), i = -1, n = names.length; - while (++i < n) map.set(names[i].toLowerCase(), i); - return map; - } - function d3_time_formatPad(value, fill, width) { - value += ""; - var length = value.length; - return length < width ? new Array(width - length + 1).join(fill) + value : value; - } - var d3_time_dayRe = d3_time_formatRe(d3_time_days), d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations), d3_time_monthRe = d3_time_formatRe(d3_time_months), d3_time_monthLookup = d3_time_formatLookup(d3_time_months), d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations), d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations); - var d3_time_formatPads = { - "-": "", - _: " ", - "0": "0" - }; - var d3_time_formats = { - a: function(d) { - return d3_time_dayAbbreviations[d.getDay()]; - }, - A: function(d) { - return d3_time_days[d.getDay()]; - }, - b: function(d) { - return d3_time_monthAbbreviations[d.getMonth()]; - }, - B: function(d) { - return d3_time_months[d.getMonth()]; - }, - c: d3.time.format(d3_time_formatDateTime), - d: function(d, p) { - return d3_time_formatPad(d.getDate(), p, 2); - }, - e: function(d, p) { - return d3_time_formatPad(d.getDate(), p, 2); - }, - H: function(d, p) { - return d3_time_formatPad(d.getHours(), p, 2); - }, - I: function(d, p) { - return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); - }, - j: function(d, p) { - return d3_time_formatPad(1 + d3.time.dayOfYear(d), p, 3); - }, - L: function(d, p) { - return d3_time_formatPad(d.getMilliseconds(), p, 3); - }, - m: function(d, p) { - return d3_time_formatPad(d.getMonth() + 1, p, 2); - }, - M: function(d, p) { - return d3_time_formatPad(d.getMinutes(), p, 2); - }, - p: function(d) { - return d.getHours() >= 12 ? "PM" : "AM"; - }, - S: function(d, p) { - return d3_time_formatPad(d.getSeconds(), p, 2); - }, - U: function(d, p) { - return d3_time_formatPad(d3.time.sundayOfYear(d), p, 2); - }, - w: function(d) { - return d.getDay(); - }, - W: function(d, p) { - return d3_time_formatPad(d3.time.mondayOfYear(d), p, 2); - }, - x: d3.time.format(d3_time_formatDate), - X: d3.time.format(d3_time_formatTime), - y: function(d, p) { - return d3_time_formatPad(d.getFullYear() % 100, p, 2); - }, - Y: function(d, p) { - return d3_time_formatPad(d.getFullYear() % 1e4, p, 4); - }, - Z: d3_time_zone, - "%": function() { - return "%"; - } - }; - var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour24, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - }; - function d3_time_parseWeekdayAbbrev(date, string, i) { - d3_time_dayAbbrevRe.lastIndex = 0; - var n = d3_time_dayAbbrevRe.exec(string.substring(i)); - return n ? i += n[0].length : -1; - } - function d3_time_parseWeekday(date, string, i) { - d3_time_dayRe.lastIndex = 0; - var n = d3_time_dayRe.exec(string.substring(i)); - return n ? i += n[0].length : -1; - } - function d3_time_parseMonthAbbrev(date, string, i) { - d3_time_monthAbbrevRe.lastIndex = 0; - var n = d3_time_monthAbbrevRe.exec(string.substring(i)); - return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i += n[0].length) : -1; - } - function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i)); - return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i += n[0].length) : -1; - } - function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); - } - function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); - } - function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); - } - function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.y = +n[0], i += n[0].length) : -1; - } - function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.y = d3_time_expandYear(+n[0]), i += n[0].length) : -1; - } - function d3_time_expandYear(d) { - return d + (d > 68 ? 1900 : 2e3); - } - function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.m = n[0] - 1, i += n[0].length) : -1; - } - function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.d = +n[0], i += n[0].length) : -1; - } - function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.H = +n[0], i += n[0].length) : -1; - } - function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.M = +n[0], i += n[0].length) : -1; - } - function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.S = +n[0], i += n[0].length) : -1; - } - function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.L = +n[0], i += n[0].length) : -1; - } - var d3_time_numberRe = /^\s*\d+/; - function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase()); - return n == null ? -1 : (date.p = n, i); - } - var d3_time_amPmLookup = d3.map({ - am: 0, - pm: 1 - }); - function d3_time_zone(d) { - var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = ~~(Math.abs(z) / 60), zm = Math.abs(z) % 60; - return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2); - } - d3.time.format.utc = function(template) { - var local = d3.time.format(template); - function format(date) { - try { - d3_time = d3_time_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - format.parse = function(string) { - try { - d3_time = d3_time_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - format.toString = local.toString; - return format; - }; - var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - function d3_time_formatIsoNative(date) { - return date.toISOString(); - } - d3_time_formatIsoNative.parse = function(string) { - var date = new Date(string); - return isNaN(date) ? null : date; - }; - d3_time_formatIsoNative.toString = d3_time_formatIso.toString; - function d3_time_interval(local, step, number) { - function round(date) { - var d0 = local(date), d1 = offset(d0, 1); - return date - d0 < d1 - date ? d0 : d1; - } - function ceil(date) { - step(date = local(new d3_time(date - 1)), 1); - return date; - } - function offset(date, k) { - step(date = new d3_time(+date), k); - return date; - } - function range(t0, t1, dt) { - var time = ceil(t0), times = []; - if (dt > 1) { - while (time < t1) { - if (!(number(time) % dt)) times.push(new Date(+time)); - step(time, 1); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time, 1); - } - return times; - } - function range_utc(t0, t1, dt) { - try { - d3_time = d3_time_utc; - var utc = new d3_time_utc(); - utc._ = t0; - return range(utc, t1, dt); - } finally { - d3_time = Date; - } - } - local.floor = local; - local.round = round; - local.ceil = ceil; - local.offset = offset; - local.range = range; - var utc = local.utc = d3_time_interval_utc(local); - utc.floor = utc; - utc.round = d3_time_interval_utc(round); - utc.ceil = d3_time_interval_utc(ceil); - utc.offset = d3_time_interval_utc(offset); - utc.range = range_utc; - return local; - } - function d3_time_interval_utc(method) { - return function(date, k) { - try { - d3_time = d3_time_utc; - var utc = new d3_time_utc(); - utc._ = date; - return method(utc, k)._; - } finally { - d3_time = Date; - } - }; - } - d3.time.second = d3_time_interval(function(date) { - return new d3_time(Math.floor(date / 1e3) * 1e3); - }, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 1e3); - }, function(date) { - return date.getSeconds(); - }); - d3.time.seconds = d3.time.second.range; - d3.time.seconds.utc = d3.time.second.utc.range; - d3.time.minute = d3_time_interval(function(date) { - return new d3_time(Math.floor(date / 6e4) * 6e4); - }, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 6e4); - }, function(date) { - return date.getMinutes(); - }); - d3.time.minutes = d3.time.minute.range; - d3.time.minutes.utc = d3.time.minute.utc.range; - d3.time.hour = d3_time_interval(function(date) { - var timezone = date.getTimezoneOffset() / 60; - return new d3_time((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); - }, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 36e5); - }, function(date) { - return date.getHours(); - }); - d3.time.hours = d3.time.hour.range; - d3.time.hours.utc = d3.time.hour.utc.range; - d3.time.day = d3_time_interval(function(date) { - var day = new d3_time(1970, 0); - day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); - return day; - }, function(date, offset) { - date.setDate(date.getDate() + offset); - }, function(date) { - return date.getDate() - 1; - }); - d3.time.days = d3.time.day.range; - d3.time.days.utc = d3.time.day.utc.range; - d3.time.dayOfYear = function(date) { - var year = d3.time.year(date); - return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5); - }; - d3_time_daySymbols.forEach(function(day, i) { - day = day.toLowerCase(); - i = 7 - i; - var interval = d3.time[day] = d3_time_interval(function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); - return date; - }, function(date, offset) { - date.setDate(date.getDate() + Math.floor(offset) * 7); - }, function(date) { - var day = d3.time.year(date).getDay(); - return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); - }); - d3.time[day + "s"] = interval.range; - d3.time[day + "s"].utc = interval.utc.range; - d3.time[day + "OfYear"] = function(date) { - var day = d3.time.year(date).getDay(); - return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7); - }; - }); - d3.time.week = d3.time.sunday; - d3.time.weeks = d3.time.sunday.range; - d3.time.weeks.utc = d3.time.sunday.utc.range; - d3.time.weekOfYear = d3.time.sundayOfYear; - d3.time.month = d3_time_interval(function(date) { - date = d3.time.day(date); - date.setDate(1); - return date; - }, function(date, offset) { - date.setMonth(date.getMonth() + offset); - }, function(date) { - return date.getMonth(); - }); - d3.time.months = d3.time.month.range; - d3.time.months.utc = d3.time.month.utc.range; - d3.time.year = d3_time_interval(function(date) { - date = d3.time.day(date); - date.setMonth(0, 1); - return date; - }, function(date, offset) { - date.setFullYear(date.getFullYear() + offset); - }, function(date) { - return date.getFullYear(); - }); - d3.time.years = d3.time.year.range; - d3.time.years.utc = d3.time.year.utc.range; - function d3_time_scale(linear, methods, format) { - function scale(x) { - return linear(x); - } - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - scale.nice = function(m) { - return scale.domain(d3_scale_nice(scale.domain(), function() { - return m; - })); - }; - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], target = span / m, i = d3.bisect(d3_time_scaleSteps, target); - if (i == d3_time_scaleSteps.length) return methods.year(extent, m); - if (!i) return linear.ticks(m).map(d3_time_scaleDate); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0].range; - } - return m(extent[0], new Date(+extent[1] + 1), k); - }; - scale.tickFormat = function() { - return format; - }; - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); - } - function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [ start, stop ] : [ stop, start ]; - } - function d3_time_scaleDate(t) { - return new Date(t); - } - function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; - } - function d3_time_scaleSetYear(y) { - var d = new Date(y, 0, 1); - d.setFullYear(y); - return d; - } - function d3_time_scaleGetYear(d) { - var y = d.getFullYear(), d0 = d3_time_scaleSetYear(y), d1 = d3_time_scaleSetYear(y + 1); - return y + (d - d0) / (d1 - d0); - } - var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ]; - var d3_time_scaleLocalMethods = [ [ d3.time.second, 1 ], [ d3.time.second, 5 ], [ d3.time.second, 15 ], [ d3.time.second, 30 ], [ d3.time.minute, 1 ], [ d3.time.minute, 5 ], [ d3.time.minute, 15 ], [ d3.time.minute, 30 ], [ d3.time.hour, 1 ], [ d3.time.hour, 3 ], [ d3.time.hour, 6 ], [ d3.time.hour, 12 ], [ d3.time.day, 1 ], [ d3.time.day, 2 ], [ d3.time.week, 1 ], [ d3.time.month, 1 ], [ d3.time.month, 3 ], [ d3.time.year, 1 ] ]; - var d3_time_scaleLocalFormats = [ [ d3.time.format("%Y"), d3_true ], [ d3.time.format("%B"), function(d) { - return d.getMonth(); - } ], [ d3.time.format("%b %d"), function(d) { - return d.getDate() != 1; - } ], [ d3.time.format("%a %d"), function(d) { - return d.getDay() && d.getDate() != 1; - } ], [ d3.time.format("%I %p"), function(d) { - return d.getHours(); - } ], [ d3.time.format("%I:%M"), function(d) { - return d.getMinutes(); - } ], [ d3.time.format(":%S"), function(d) { - return d.getSeconds(); - } ], [ d3.time.format(".%L"), function(d) { - return d.getMilliseconds(); - } ] ]; - var d3_time_scaleLinear = d3.scale.linear(), d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - d3_time_scaleLocalMethods.year = function(extent, m) { - return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear); - }; - d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); - }; - var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) { - return [ m[0].utc, m[1] ]; - }); - var d3_time_scaleUTCFormats = [ [ d3.time.format.utc("%Y"), d3_true ], [ d3.time.format.utc("%B"), function(d) { - return d.getUTCMonth(); - } ], [ d3.time.format.utc("%b %d"), function(d) { - return d.getUTCDate() != 1; - } ], [ d3.time.format.utc("%a %d"), function(d) { - return d.getUTCDay() && d.getUTCDate() != 1; - } ], [ d3.time.format.utc("%I %p"), function(d) { - return d.getUTCHours(); - } ], [ d3.time.format.utc("%I:%M"), function(d) { - return d.getUTCMinutes(); - } ], [ d3.time.format.utc(":%S"), function(d) { - return d.getUTCSeconds(); - } ], [ d3.time.format.utc(".%L"), function(d) { - return d.getUTCMilliseconds(); - } ] ]; - var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - function d3_time_scaleUTCSetYear(y) { - var d = new Date(Date.UTC(y, 0, 1)); - d.setUTCFullYear(y); - return d; - } - function d3_time_scaleUTCGetYear(d) { - var y = d.getUTCFullYear(), d0 = d3_time_scaleUTCSetYear(y), d1 = d3_time_scaleUTCSetYear(y + 1); - return y + (d - d0) / (d1 - d0); - } - d3_time_scaleUTCMethods.year = function(extent, m) { - return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear); - }; - d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); - }; - - module.exports = d3; -})(); From 10fe754dfdd63e14aeeb02d2c0e61b08ac301f9a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 15:59:34 -0700 Subject: [PATCH 046/281] Only install headers if directory does not exist --- script/bootstrap | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/script/bootstrap b/script/bootstrap index 0fce8f71f..7717ca80b 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -17,8 +17,14 @@ exit_unless_npm_exists() { exit_unless_xcode_exists exit_unless_npm_exists -npm install node-gyp -HOME=~/.cefode-gyp node-gyp install --target=0.8.21 --dist-url=https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/dist --arch=ia32 -HOME=~/.cefode-gyp npm install --target=0.8.21 --arch=ia32 + +NODE_DIR="$HOME/.cefode-gyp" +NODE_VERSION="0.8.21" +NODE_URL="https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/dist" +if [ ! -d "$NODE_DIR" ]; then + npm install node-gyp + HOME="$NODE_DIR" node-gyp install --target="$NODE_VERSION" --dist-url="$NODE_URL" --arch=ia32 +fi +HOME="$NODE_DIR" npm install --target="$NODE_VERSION" --arch=ia32 git submodule --quiet sync git submodule --quiet update --recursive --init From 9139df5779f6354aee03d06c458c78764a20a4be Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 17:36:48 -0700 Subject: [PATCH 047/281] Remove unused vendor assert.js --- vendor/assert.js | 325 ----------------------------------------------- 1 file changed, 325 deletions(-) delete mode 100644 vendor/assert.js diff --git a/vendor/assert.js b/vendor/assert.js deleted file mode 100644 index 41e208069..000000000 --- a/vendor/assert.js +++ /dev/null @@ -1,325 +0,0 @@ -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the 'Software'), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -// UTILITY -// var util = require('util'); -var pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -assert.AssertionError = function AssertionError(options) { - this.name = 'AssertionError'; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// util.inherits(assert.AssertionError, Error); - -function replacer(key, value) { - if (value === undefined) { - return '' + value; - } - if (typeof value === 'number' && (isNaN(value) || !isFinite(value))) { - return value.toString(); - } - if (typeof value === 'function' || value instanceof RegExp) { - return value.toString(); - } - return value; -} - -function truncate(s, n) { - if (typeof s == 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [ this.name + ':', this.message ].join(' '); - } else { - return [ - this.name + ':', - truncate(JSON.stringify(this.actual, replacer), 128), - this.operator, - truncate(JSON.stringify(this.expected, replacer), 128) - ].join(' '); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, '==', assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, 'deepEqual', assert.deepEqual); - } -}; - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - - } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - - return true; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical 'prototype' property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try { - var ka = Object.keys(a), - kb = Object.keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key])) return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', assert.notStrictEqual); - } -}; - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (expected instanceof RegExp) { - return expected.test(actual); - } else if (actual instanceof expected) { - return true; - } else if (expected.call({}, actual) === true) { - return true; - } - - return false; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - try { - block(); - } catch (e) { - actual = e; - } - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail('Missing expected exception' + message); - } - - if (!shouldThrow && expectedException(actual, expected)) { - fail('Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function(err) { if (err) {throw err;}}; From 2a78183a150404039566d581f27658447bfe7fef Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 19:07:08 -0700 Subject: [PATCH 048/281] Use node's crypto API for pasteboard md5s --- src/app/pasteboard.coffee | 9 +- vendor/md5.js | 391 -------------------------------------- 2 files changed, 6 insertions(+), 394 deletions(-) delete mode 100755 vendor/md5.js diff --git a/src/app/pasteboard.coffee b/src/app/pasteboard.coffee index 6349c0a10..7e5d6ccb7 100644 --- a/src/app/pasteboard.coffee +++ b/src/app/pasteboard.coffee @@ -1,16 +1,19 @@ -{hex_md5} = require 'md5' +crypto = nodeRequire 'crypto' module.exports = class Pasteboard signatureForMetadata: null + md5: (text) -> + crypto.createHash('md5').update(text).digest('hex') + write: (text, metadata) -> - @signatureForMetadata = hex_md5(text) + @signatureForMetadata = @md5(text) @metadata = metadata $native.writeToPasteboard(text) read: -> text = $native.readFromPasteboard() value = [text] - value.push(@metadata) if @signatureForMetadata == hex_md5(text) + value.push(@metadata) if @signatureForMetadata == @md5(text) value diff --git a/vendor/md5.js b/vendor/md5.js deleted file mode 100755 index 5cb2b3319..000000000 --- a/vendor/md5.js +++ /dev/null @@ -1,391 +0,0 @@ -/* - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ - -/* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ -var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ -var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ - -/* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ -function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); } -function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); } -function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); } -function hex_hmac_md5(k, d) - { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } -function b64_hmac_md5(k, d) - { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } -function any_hmac_md5(k, d, e) - { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); } - -// Modified by Nathan Sobo to integrate into Atom's module system -module.exports = { - hex_md5: hex_md5, - b64_md5: b64_md5, - any_md5: any_md5, - hex_hmac_md5: hex_hmac_md5, - rstr2hex: rstr2hex, - b64_hmac_md5: b64_hmac_md5, - rstr2b64: rstr2b64, - any_hmac_md5: any_hmac_md5 -}; - -/* - * Perform a simple self-test to see if the VM is working - */ -function md5_vm_test() -{ - return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72"; -} - -/* - * Calculate the MD5 of a raw string - */ -function rstr_md5(s) -{ - return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); -} - -/* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ -function rstr_hmac_md5(key, data) -{ - var bkey = rstr2binl(key); - if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8); - - var ipad = Array(16), opad = Array(16); - for(var i = 0; i < 16; i++) - { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); -} - -/* - * Convert a raw string to a hex string - */ -function rstr2hex(input) -{ - try { hexcase } catch(e) { hexcase=0; } - var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var output = ""; - var x; - for(var i = 0; i < input.length; i++) - { - x = input.charCodeAt(i); - output += hex_tab.charAt((x >>> 4) & 0x0F) - + hex_tab.charAt( x & 0x0F); - } - return output; -} - -/* - * Convert a raw string to a base-64 string - */ -function rstr2b64(input) -{ - try { b64pad } catch(e) { b64pad=''; } - var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var output = ""; - var len = input.length; - for(var i = 0; i < len; i += 3) - { - var triplet = (input.charCodeAt(i) << 16) - | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0) - | (i + 2 < len ? input.charCodeAt(i+2) : 0); - for(var j = 0; j < 4; j++) - { - if(i * 8 + j * 6 > input.length * 8) output += b64pad; - else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); - } - } - return output; -} - -/* - * Convert a raw string to an arbitrary string encoding - */ -function rstr2any(input, encoding) -{ - var divisor = encoding.length; - var i, j, q, x, quotient; - - /* Convert to an array of 16-bit big-endian values, forming the dividend */ - var dividend = Array(Math.ceil(input.length / 2)); - for(i = 0; i < dividend.length; i++) - { - dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); - } - - /* - * Repeatedly perform a long division. The binary array forms the dividend, - * the length of the encoding is the divisor. Once computed, the quotient - * forms the dividend for the next step. All remainders are stored for later - * use. - */ - var full_length = Math.ceil(input.length * 8 / - (Math.log(encoding.length) / Math.log(2))); - var remainders = Array(full_length); - for(j = 0; j < full_length; j++) - { - quotient = Array(); - x = 0; - for(i = 0; i < dividend.length; i++) - { - x = (x << 16) + dividend[i]; - q = Math.floor(x / divisor); - x -= q * divisor; - if(quotient.length > 0 || q > 0) - quotient[quotient.length] = q; - } - remainders[j] = x; - dividend = quotient; - } - - /* Convert the remainders to the output string */ - var output = ""; - for(i = remainders.length - 1; i >= 0; i--) - output += encoding.charAt(remainders[i]); - - return output; -} - -/* - * Encode a string as utf-8. - * For efficiency, this assumes the input is valid utf-16. - */ -function str2rstr_utf8(input) -{ - var output = ""; - var i = -1; - var x, y; - - while(++i < input.length) - { - /* Decode utf-16 surrogate pairs */ - x = input.charCodeAt(i); - y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; - if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) - { - x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); - i++; - } - - /* Encode output as utf-8 */ - if(x <= 0x7F) - output += String.fromCharCode(x); - else if(x <= 0x7FF) - output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), - 0x80 | ( x & 0x3F)); - else if(x <= 0xFFFF) - output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - else if(x <= 0x1FFFFF) - output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), - 0x80 | ((x >>> 12) & 0x3F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - } - return output; -} - -/* - * Encode a string as utf-16 - */ -function str2rstr_utf16le(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode( input.charCodeAt(i) & 0xFF, - (input.charCodeAt(i) >>> 8) & 0xFF); - return output; -} - -function str2rstr_utf16be(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, - input.charCodeAt(i) & 0xFF); - return output; -} - -/* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ -function rstr2binl(input) -{ - var output = Array(input.length >> 2); - for(var i = 0; i < output.length; i++) - output[i] = 0; - for(var i = 0; i < input.length * 8; i += 8) - output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32); - return output; -} - -/* - * Convert an array of little-endian words to a string - */ -function binl2rstr(input) -{ - var output = ""; - for(var i = 0; i < input.length * 32; i += 8) - output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF); - return output; -} - -/* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ -function binl_md5(x, len) -{ - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for(var i = 0; i < x.length; i += 16) - { - var olda = a; - var oldb = b; - var oldc = c; - var oldd = d; - - a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); - d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); - c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); - b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); - a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); - d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); - c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); - b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); - a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); - d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); - c = md5_ff(c, d, a, b, x[i+10], 17, -42063); - b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); - a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); - d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); - c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); - b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); - - a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); - d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); - c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); - b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); - a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); - d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); - c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); - b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); - a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); - d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); - c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); - b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); - a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); - d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); - c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); - b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); - - a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); - d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); - c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); - b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); - a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); - d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); - c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); - b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); - a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); - d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); - c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); - b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); - a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); - d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); - c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); - b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); - - a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); - d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); - c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); - b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); - a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); - d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); - c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); - b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); - a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); - d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); - c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); - b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); - a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); - d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); - c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); - b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - } - return Array(a, b, c, d); -} - -/* - * These functions implement the four basic operations the algorithm uses. - */ -function md5_cmn(q, a, b, x, s, t) -{ - return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); -} -function md5_ff(a, b, c, d, x, s, t) -{ - return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); -} -function md5_gg(a, b, c, d, x, s, t) -{ - return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); -} -function md5_hh(a, b, c, d, x, s, t) -{ - return md5_cmn(b ^ c ^ d, a, b, x, s, t); -} -function md5_ii(a, b, c, d, x, s, t) -{ - return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); -} - -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ -function safe_add(x, y) -{ - var lsw = (x & 0xFFFF) + (y & 0xFFFF); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); -} - -/* - * Bitwise rotate a 32-bit number to the left. - */ -function bit_rol(num, cnt) -{ - return (num << cnt) | (num >>> (32 - cnt)); -} From cc7ddc59ffba0547df48793a0c263f6221093c03 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 19:15:23 -0700 Subject: [PATCH 049/281] Set input encoding to utf8 --- src/app/pasteboard.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/pasteboard.coffee b/src/app/pasteboard.coffee index 7e5d6ccb7..4d635ceee 100644 --- a/src/app/pasteboard.coffee +++ b/src/app/pasteboard.coffee @@ -5,7 +5,7 @@ class Pasteboard signatureForMetadata: null md5: (text) -> - crypto.createHash('md5').update(text).digest('hex') + crypto.createHash('md5').update(text, 'utf8').digest('hex') write: (text, metadata) -> @signatureForMetadata = @md5(text) From ec8a5b368bd0bd1c6ff87aa055ed4d7553172cdf Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 19:20:36 -0700 Subject: [PATCH 050/281] Use node's crypto from fs.md5ForPath() --- src/stdlib/fs.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index 479b0608a..aef59bdf6 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -146,7 +146,8 @@ module.exports = traverse(rootPath, '', onFile, onDirectory) md5ForPath: (path) -> - $native.md5ForPath(path) + contents = nodeFs.readFileSync(path) + nodeRequire('crypto').createHash('md5').update(contents).digest('hex') resolve: (args...) -> extensions = args.pop() if _.isArray(_.last(args)) From 832df7149e7510fccea0f7637f6feb232d0c0a7f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 19:36:53 -0700 Subject: [PATCH 051/281] Remove $native.md5ForPath() --- native/v8_extensions/native.mm | 19 +------------------ src/stdlib/require.coffee | 4 +++- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 8d7705a79..ee8ef0112 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -25,7 +25,7 @@ namespace v8_extensions { const char* methodNames[] = { "absolute", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", - "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", + "moveToTrash", "reload", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -159,23 +159,6 @@ namespace v8_extensions { else if (name == "reload") { CefV8Context::GetCurrentContext()->GetBrowser()->ReloadIgnoreCache(); } - else if (name == "md5ForPath") { - NSString *path = stringFromCefV8Value(arguments[0]); - unsigned char outputData[CC_MD5_DIGEST_LENGTH]; - - NSData *inputData = [[NSData alloc] initWithContentsOfFile:path]; - CC_MD5([inputData bytes], [inputData length], outputData); - [inputData release]; - - NSMutableString *hash = [[NSMutableString alloc] init]; - - for (NSUInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { - [hash appendFormat:@"%02x", outputData[i]]; - } - - retval = CefV8Value::CreateString([hash UTF8String]); - return true; - } else if (name == "getPlatform") { retval = CefV8Value::CreateString("mac"); return true; diff --git a/src/stdlib/require.coffee b/src/stdlib/require.coffee index b4fa85ea1..c6cb7b38d 100644 --- a/src/stdlib/require.coffee +++ b/src/stdlib/require.coffee @@ -1,4 +1,5 @@ fs = nodeRequire 'fs' +crypto = nodeRequire 'crypto' paths = [ "#{window.resourcePath}/spec" @@ -86,7 +87,8 @@ createCacheDirectory = -> fs.mkdirSync('/tmp/atom-compiled-scripts') unless __exists('/tmp/atom-compiled-scripts') getCacheFilePath = (path) -> - "/tmp/atom-compiled-scripts/#{$native.md5ForPath(path)}" + md5 = crypto.createHash('md5').update(fs.readFileSync(path)).digest('hex') + "/tmp/atom-compiled-scripts/#{md5}" resolve = (name, {verifyExistence}={}) -> verifyExistence ?= true From 115b960ce7c60f587a2e2c9d320c54fa8216004d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 22:39:57 -0700 Subject: [PATCH 052/281] Handle reading and writing in cson.coffee Moves helpers from fs.coffee to cson.coffee --- src/app/atom-package.coffee | 3 ++- src/app/atom-theme.coffee | 3 ++- src/app/config.coffee | 5 +++-- src/app/keymap.coffee | 3 ++- src/app/text-mate-grammar.coffee | 5 +++-- src/app/text-mate-package.coffee | 5 +++-- .../snippets/lib/load-snippets-handler.coffee | 5 +++-- src/packages/snippets/lib/snippets.coffee | 3 ++- src/stdlib/cson.coffee | 20 +++++++++++++++++++ src/stdlib/fs.coffee | 20 ------------------- 10 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index 8bd99562e..eb4cbfdfc 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -2,6 +2,7 @@ Package = require 'package' fs = require 'fs' _ = nodeRequire 'underscore' $ = require 'jquery' +CSON = require 'cson' module.exports = class AtomPackage extends Package @@ -69,7 +70,7 @@ class AtomPackage extends Package loadMetadata: -> if metadataPath = fs.resolveExtension(fs.join(@path, 'package'), ['cson', 'json']) - @metadata = fs.readObject(metadataPath) + @metadata = CSON.readObject(metadataPath) @metadata ?= {} loadKeymaps: -> diff --git a/src/app/atom-theme.coffee b/src/app/atom-theme.coffee index 6a3e1e379..697e44697 100644 --- a/src/app/atom-theme.coffee +++ b/src/app/atom-theme.coffee @@ -1,5 +1,6 @@ fs = require 'fs' Theme = require 'theme' +CSON = require 'cson' module.exports = class AtomTheme extends Theme @@ -13,7 +14,7 @@ class AtomTheme extends Theme else metadataPath = fs.resolveExtension(fs.join(@path, 'package'), ['cson', 'json']) if fs.isFile(metadataPath) - stylesheetNames = fs.readObject(metadataPath)?.stylesheets + stylesheetNames = CSON.readObject(metadataPath)?.stylesheets if stylesheetNames @loadStylesheet(fs.join(@path, name)) for name in stylesheetNames else diff --git a/src/app/config.coffee b/src/app/config.coffee index d01180a3f..126202609 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -1,6 +1,7 @@ fs = require 'fs' _ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' +CSON = require 'cson' configDirPath = fs.absolute("~/.atom") bundledPackagesDirPath = fs.join(resourcePath, "src/packages") @@ -55,7 +56,7 @@ class Config loadUserConfig: -> if fs.exists(@configFilePath) - userConfig = fs.readObject(@configFilePath) + userConfig = CSON.readObject(@configFilePath) _.extend(@settings, userConfig) get: (keyPath) -> @@ -96,6 +97,6 @@ class Config @trigger 'updated' save: -> - fs.writeObject(@configFilePath, @settings) + CSON.writeObject(@configFilePath, @settings) _.extend Config.prototype, EventEmitter diff --git a/src/app/keymap.coffee b/src/app/keymap.coffee index b3d45872d..9846fd58f 100644 --- a/src/app/keymap.coffee +++ b/src/app/keymap.coffee @@ -1,6 +1,7 @@ $ = require 'jquery' _ = nodeRequire 'underscore' fs = require 'fs' +CSON = require 'cson' BindingSet = require 'binding-set' @@ -39,7 +40,7 @@ class Keymap @load(filePath) for filePath in fs.list(directoryPath, ['.cson', '.json']) load: (path) -> - @add(fs.readObject(path)) + @add(CSON.readObject(path)) add: (keymap) -> for selector, bindings of keymap diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index 712b3e2ad..2ceb59bfb 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -2,14 +2,15 @@ _ = nodeRequire 'underscore' fs = require 'fs' plist = require 'plist' Token = require 'token' +CSON = require 'cson' {OnigRegExp, OnigScanner} = nodeRequire 'oniguruma' module.exports = class TextMateGrammar @readFromPath: (path) -> grammarContent = null - if fs.isObjectPath(path) - grammarContent = fs.readObject(path) + if CSON.isObjectPath(path) + grammarContent = CSON.readObject(path) else plist.parseString fs.read(path), (e, data) -> throw new Error(e) if e diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index 2c430de99..1e727860b 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -3,6 +3,7 @@ fs = require 'fs' plist = require 'plist' _ = nodeRequire 'underscore' TextMateGrammar = require 'text-mate-grammar' +CSON = require 'cson' module.exports = class TextMatePackage extends Package @@ -76,8 +77,8 @@ class TextMatePackage extends Package readObjectFromPath: (path, callback) -> object = null error = null - if fs.isObjectPath(path) - object = fs.readObject(path) + if CSON.isObjectPath(path) + object = CSON.readObject(path) else plist.parseString fs.read(path), (e, data) -> error = e diff --git a/src/packages/snippets/lib/load-snippets-handler.coffee b/src/packages/snippets/lib/load-snippets-handler.coffee index c897330dc..331013adb 100644 --- a/src/packages/snippets/lib/load-snippets-handler.coffee +++ b/src/packages/snippets/lib/load-snippets-handler.coffee @@ -1,6 +1,7 @@ fs = require 'fs' TextMatePackage = require 'text-mate-package' SnippetBodyParser = require './snippet-body-parser' +CSON = require 'cson' module.exports = snippetsLoaded: (snippets) -> @@ -20,7 +21,7 @@ module.exports = continue if fs.base(snippetsPath).indexOf('.') is 0 try - if fs.isObjectPath(snippetsPath) and object = fs.readObject(snippetsPath) + if CSON.isObjectPath(snippetsPath) and object = CSON.readObject(snippetsPath) snippets.push(object) else if object = fs.readPlist(snippetsPath) snippets.push(object) @@ -37,7 +38,7 @@ module.exports = for snippetsPath in fs.list(snippetsDirPath) continue if fs.base(snippetsPath).indexOf('.') is 0 try - snippets.push(fs.readObject(snippetsPath)) + snippets.push(CSON.readObject(snippetsPath)) catch e console.warn "Error reading snippets file '#{snippetsPath}'" @snippetsLoaded(snippets) diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index 74e02cae9..ee89f587b 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -4,6 +4,7 @@ _ = nodeRequire 'underscore' SnippetExpansion = require './snippet-expansion' Snippet = require './snippet' LoadSnippetsTask = require './load-snippets-task' +CSON = require 'cson' module.exports = snippetsByExtension: {} @@ -28,7 +29,7 @@ module.exports = loadFile: (snippetsPath) -> try - snippets = fs.readObject(snippetsPath) + snippets = CSON.readObject(snippetsPath) catch e console.warn "Error reading snippets file '#{snippetsPath}'" @add(snippets) diff --git a/src/stdlib/cson.coffee b/src/stdlib/cson.coffee index 30402be5a..c723a558b 100644 --- a/src/stdlib/cson.coffee +++ b/src/stdlib/cson.coffee @@ -1,6 +1,26 @@ _ = nodeRequire 'underscore' +fs = require 'fs' module.exports = + isObjectPath: (path) -> + extension = fs.extension(path) + extension is '.cson' or extension is '.json' + + readObject: (path) -> + contents = fs.read(path) + if fs.extension(path) is '.cson' + CoffeeScript = nodeRequire 'coffee-script' + CoffeeScript.eval(contents, bare: true) + else + JSON.parse(contents) + + writeObject: (path, object) -> + if fs.extension(path) is '.cson' + content = @stringify(object) + else + content = JSON.stringify(object, undefined, 2) + fs.write(path, "#{content}\n") + stringifyIndent: (level=0) -> _.multiplyString(' ', Math.max(level, 0)) stringifyString: (string) -> diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index aef59bdf6..bebe835fe 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -212,26 +212,6 @@ module.exports = base = @base(path, extension).toLowerCase() base is 'readme' and (extension is '' or @isMarkdownExtension(extension)) - isObjectPath: (path) -> - extension = @extension(path) - extension is '.cson' or extension is '.json' - - readObject: (path) -> - contents = @read(path) - if @extension(path) is '.cson' - CoffeeScript = nodeRequire 'coffee-script' - CoffeeScript.eval(contents, bare: true) - else - JSON.parse(contents) - - writeObject: (path, object) -> - if @extension(path) is '.cson' - CSON = require 'cson' - content = CSON.stringify(object) - else - content = JSON.stringify(object, undefined, 2) - @write(path, "#{content}\n") - readPlist: (path) -> plist = require 'plist' object = null From a5a41cf2927a17ecb4a88b367a9339767ef69e9c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 12 Mar 2013 20:55:32 +0800 Subject: [PATCH 053/281] Update cefode to branch 1432 revision 1135. --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 403cc250a..a45f7d722 100644 --- a/Rakefile +++ b/Rakefile @@ -20,7 +20,7 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - exit 1 unless system %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -28,7 +28,7 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - sh %{prebuilt-cef/script/download -b 1410 -r 1107 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do From 6f5138a56e31f3435efe08ffd764de4ee7fd153b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 08:23:54 -0700 Subject: [PATCH 054/281] Revert "Remove $native.md5ForPath()" This reverts commit 832df7149e7510fccea0f7637f6feb232d0c0a7f. --- native/v8_extensions/native.mm | 19 ++++++++++++++++++- src/stdlib/require.coffee | 4 +--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index ee8ef0112..8d7705a79 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -25,7 +25,7 @@ namespace v8_extensions { const char* methodNames[] = { "absolute", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", - "moveToTrash", "reload", "getPlatform", "setWindowState", + "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -159,6 +159,23 @@ namespace v8_extensions { else if (name == "reload") { CefV8Context::GetCurrentContext()->GetBrowser()->ReloadIgnoreCache(); } + else if (name == "md5ForPath") { + NSString *path = stringFromCefV8Value(arguments[0]); + unsigned char outputData[CC_MD5_DIGEST_LENGTH]; + + NSData *inputData = [[NSData alloc] initWithContentsOfFile:path]; + CC_MD5([inputData bytes], [inputData length], outputData); + [inputData release]; + + NSMutableString *hash = [[NSMutableString alloc] init]; + + for (NSUInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { + [hash appendFormat:@"%02x", outputData[i]]; + } + + retval = CefV8Value::CreateString([hash UTF8String]); + return true; + } else if (name == "getPlatform") { retval = CefV8Value::CreateString("mac"); return true; diff --git a/src/stdlib/require.coffee b/src/stdlib/require.coffee index c6cb7b38d..b4fa85ea1 100644 --- a/src/stdlib/require.coffee +++ b/src/stdlib/require.coffee @@ -1,5 +1,4 @@ fs = nodeRequire 'fs' -crypto = nodeRequire 'crypto' paths = [ "#{window.resourcePath}/spec" @@ -87,8 +86,7 @@ createCacheDirectory = -> fs.mkdirSync('/tmp/atom-compiled-scripts') unless __exists('/tmp/atom-compiled-scripts') getCacheFilePath = (path) -> - md5 = crypto.createHash('md5').update(fs.readFileSync(path)).digest('hex') - "/tmp/atom-compiled-scripts/#{md5}" + "/tmp/atom-compiled-scripts/#{$native.md5ForPath(path)}" resolve = (name, {verifyExistence}={}) -> verifyExistence ?= true From cec037333f292bc3e4804d117756c86acc1f45c5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 08:50:09 -0700 Subject: [PATCH 055/281] Add all resource paths to NODE_PATH env var --- native/atom_window_controller.mm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 7a74fdf22..6bde507e3 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -54,7 +54,15 @@ _resourcePath = [_resourcePath stringByStandardizingPath]; [_resourcePath retain]; - NSString *nodePath = [NSString stringWithFormat:@"%@/node_modules", _resourcePath]; + NSArray *paths = [NSArray arrayWithObjects:@"spec", @"benchmark", + @"src/stdlib", @"src/app", @"src/packages", @"src", + @"vendor/packages", @"vendor", @"static", @"themes", nil]; + NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; + for (int i = 0; i < paths.count; i++) { + NSString *fullPath = [NSString stringWithFormat:@"%@/%@", _resourcePath, [paths objectAtIndex:i]]; + [resourcePaths addObject:fullPath]; + } + NSString *nodePath = [resourcePaths componentsJoinedByString:@":"]; setenv("NODE_PATH", [nodePath UTF8String], TRUE); if (!background) { From 1d1ba5f6d1d8fc9e4acd7beb8e44da356ba08abf Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 10:38:05 -0700 Subject: [PATCH 056/281] Use node's require instead of internal require --- benchmark/benchmark-helper.coffee | 2 +- benchmark/benchmark-suite.coffee | 4 +- benchmark/fixtures/medium.coffee | 2 +- native/atom_window_controller.mm | 5 ++- spec/app/atom-package-spec.coffee | 2 +- spec/app/config-spec.coffee | 4 +- spec/app/directory-spec.coffee | 2 +- spec/app/display-buffer-spec.coffee | 4 +- spec/app/edit-session-spec.coffee | 2 +- spec/app/editor-spec.coffee | 6 +-- spec/app/event-emitter-spec.coffee | 2 +- spec/app/file-spec.coffee | 2 +- spec/app/git-spec.coffee | 2 +- spec/app/grammar-view-spec.coffee | 2 +- spec/app/language-mode-spec.coffee | 2 +- spec/app/pane-container-spec.coffee | 2 +- spec/app/project-spec.coffee | 4 +- spec/app/root-view-spec.coffee | 4 +- spec/app/selection-spec.coffee | 2 +- spec/app/syntax-spec.coffee | 2 +- ...fer-spec.coffee => tex-buffer-spec.coffee} | 6 +-- spec/app/text-mate-grammar-spec.coffee | 4 +- spec/app/text-mate-theme-spec.coffee | 2 +- spec/app/theme-spec.coffee | 2 +- spec/app/tokenized-buffer-spec.coffee | 4 +- spec/app/undo-manager-spec.coffee | 2 +- spec/app/window-spec.coffee | 2 +- spec/atom-reporter.coffee | 2 +- spec/spec-helper.coffee | 6 +-- spec/spec-suite.coffee | 2 +- spec/stdlib/cson-spec.coffee | 2 +- .../{fs-spec.coffee => fs-utils-spec.coffee} | 2 +- spec/stdlib/onig-reg-exp-spec.coffee | 2 +- spec/stdlib/underscore-extensions-spec.coffee | 2 +- spec/time-reporter.coffee | 2 +- src/app/atom-package.coffee | 4 +- src/app/atom-theme.coffee | 2 +- src/app/atom.coffee | 4 +- src/app/binding-set.coffee | 4 +- src/app/buffer-change-operation.coffee | 2 +- src/app/buffer-marker.coffee | 2 +- src/app/config.coffee | 6 +-- src/app/cursor-view.coffee | 2 +- src/app/cursor.coffee | 2 +- src/app/directory.coffee | 4 +- src/app/display-buffer-marker.coffee | 2 +- src/app/display-buffer.coffee | 2 +- src/app/edit-session.coffee | 6 +-- src/app/editor.coffee | 6 +-- src/app/event-emitter.coffee | 2 +- src/app/file.coffee | 4 +- src/app/git.coffee | 6 +-- src/app/keymap.coffee | 6 +-- src/app/language-mode.coffee | 4 +- src/app/package.coffee | 2 +- src/app/pane-column.coffee | 2 +- src/app/pane-row.coffee | 2 +- src/app/pane.coffee | 2 +- src/app/pasteboard.coffee | 2 +- src/app/project.coffee | 6 +-- src/app/range.coffee | 2 +- src/app/repository-status-handler.coffee | 4 +- src/app/repository-status-task.coffee | 2 +- src/app/root-view.coffee | 6 +-- src/app/screen-line.coffee | 2 +- src/app/selection.coffee | 2 +- src/app/syntax.coffee | 4 +- src/app/{buffer.coffee => text-buffer.coffee} | 4 +- src/app/text-mate-grammar.coffee | 6 +-- src/app/text-mate-package.coffee | 4 +- src/app/text-mate-theme.coffee | 4 +- src/app/theme.coffee | 2 +- src/app/token.coffee | 2 +- src/app/tokenized-buffer.coffee | 2 +- src/app/undo-manager.coffee | 2 +- src/app/window.coffee | 4 +- .../spec/autocomplete-spec.coffee | 2 +- .../lib/bracket-matcher.coffee | 2 +- .../lib/command-logger-view.coffee | 4 +- .../lib/command-palette-view.coffee | 2 +- .../spec/command-palette-spec.coffee | 2 +- .../lib/command-interpreter.coffee | 2 +- .../lib/command-panel-view.coffee | 2 +- .../lib/commands/composite-command.coffee | 2 +- .../command-panel/lib/path-view.coffee | 2 +- .../command-panel/lib/preview-list.coffee | 4 +- .../spec/command-interpreter-spec.coffee | 4 +- .../spec/command-panel-spec.coffee | 2 +- .../editor-stats/lib/editor-stats-view.coffee | 4 +- .../spec/editor-stats-spec.coffee | 2 +- .../fuzzy-finder/lib/fuzzy-finder-view.coffee | 4 +- .../fuzzy-finder/lib/fuzzy-finder.coffee | 2 +- .../lib/load-paths-handler.coffee | 4 +- .../spec/fuzzy-finder-spec.coffee | 4 +- .../lib/markdown-preview-view.coffee | 2 +- .../spec/markdown-preview-spec.coffee | 2 +- .../lib/package-generator-view.coffee | 4 +- .../spec/package-generator-spec.coffee | 2 +- .../snippets/lib/load-snippets-handler.coffee | 2 +- .../snippets/lib/snippet-body-parser.coffee | 2 +- .../snippets/lib/snippet-expansion.coffee | 2 +- src/packages/snippets/lib/snippet.coffee | 2 +- src/packages/snippets/lib/snippets.coffee | 4 +- .../snippets/spec/snippets-spec.coffee | 6 +-- .../spell-check/lib/spell-check-view.coffee | 2 +- .../status-bar/lib/status-bar-view.coffee | 2 +- .../status-bar/spec/status-bar-spec.coffee | 4 +- .../strip-trailing-whitespace-spec.coffee | 2 +- .../symbols-view/lib/load-tags-handler.coffee | 4 +- .../symbols-view/lib/symbols-view.coffee | 2 +- .../symbols-view/lib/tag-reader.coffee | 4 +- .../spec/symbols-view-spec.coffee | 2 +- src/packages/tabs/lib/tab-bar-view.coffee | 2 +- src/packages/tabs/lib/tab-view.coffee | 2 +- src/packages/tabs/spec/tabs-spec.coffee | 4 +- src/packages/tree-view/lib/dialog.coffee | 2 +- src/packages/tree-view/lib/file-view.coffee | 2 +- src/packages/tree-view/lib/tree-view.coffee | 4 +- .../tree-view/spec/tree-view-spec.coffee | 4 +- .../wrap-guide/lib/wrap-guide-view.coffee | 2 +- src/stdlib/buffered-process.coffee | 2 +- src/stdlib/cson.coffee | 6 +-- src/stdlib/event.coffee | 2 +- src/stdlib/{fs.coffee => fs-utils.coffee} | 43 +++++++++++-------- src/stdlib/jquery-extensions.coffee | 2 +- src/stdlib/path.coffee | 2 +- src/stdlib/require.coffee | 6 +-- src/stdlib/settings.coffee | 2 +- src/stdlib/space-pen-extensions.coffee | 2 +- src/stdlib/task-shell.coffee | 8 +--- src/stdlib/task.coffee | 13 ++++-- src/stdlib/underscore-extensions.coffee | 2 +- static/index.html | 6 +-- 133 files changed, 229 insertions(+), 226 deletions(-) rename spec/app/{buffer-spec.coffee => tex-buffer-spec.coffee} (99%) rename spec/stdlib/{fs-spec.coffee => fs-utils-spec.coffee} (99%) rename src/app/{buffer.coffee => text-buffer.coffee} (99%) rename src/stdlib/{fs.coffee => fs-utils.coffee} (87%) diff --git a/benchmark/benchmark-helper.coffee b/benchmark/benchmark-helper.coffee index bfe5ba06e..16272283b 100644 --- a/benchmark/benchmark-helper.coffee +++ b/benchmark/benchmark-helper.coffee @@ -1,6 +1,6 @@ nakedLoad 'jasmine-jquery' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' Keymap = require 'keymap' Point = require 'point' Config = require 'config' diff --git a/benchmark/benchmark-suite.coffee b/benchmark/benchmark-suite.coffee index b2ff4bdfc..8f549b061 100644 --- a/benchmark/benchmark-suite.coffee +++ b/benchmark/benchmark-suite.coffee @@ -1,7 +1,7 @@ require 'benchmark-helper' -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' TokenizedBuffer = require 'tokenized-buffer' describe "editor.", -> diff --git a/benchmark/fixtures/medium.coffee b/benchmark/fixtures/medium.coffee index 403353b76..2bdb8c6f7 100644 --- a/benchmark/fixtures/medium.coffee +++ b/benchmark/fixtures/medium.coffee @@ -145,7 +145,7 @@ generate_html = (source, sections) -> # Require our external dependencies, including **Showdown.js** # (the JavaScript implementation of Markdown). -fs = require 'fs' +fs = require 'fs-utils' path = require 'path' showdown = require('./../vendor/showdown').Showdown {spawn, exec} = require 'child_process' diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 6bde507e3..b4f0fb2a3 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -56,8 +56,11 @@ NSArray *paths = [NSArray arrayWithObjects:@"spec", @"benchmark", @"src/stdlib", @"src/app", @"src/packages", @"src", - @"vendor/packages", @"vendor", @"static", @"themes", nil]; + @"vendor/packages", @"vendor", @"static", @"themes", + @"node_modules", nil]; NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; + NSString *userPackagesDirectory = [@"~/.atom/packages" stringByStandardizingPath]; + [resourcePaths addObject:userPackagesDirectory]; for (int i = 0; i < paths.count; i++) { NSString *fullPath = [NSString stringWithFormat:@"%@/%@", _resourcePath, [paths objectAtIndex:i]]; [resourcePaths addObject:fullPath]; diff --git a/spec/app/atom-package-spec.coffee b/spec/app/atom-package-spec.coffee index 7b75b8ede..9bbf6095f 100644 --- a/spec/app/atom-package-spec.coffee +++ b/spec/app/atom-package-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' AtomPackage = require 'atom-package' -fs = require 'fs' +fs = require 'fs-utils' describe "AtomPackage", -> describe ".load()", -> diff --git a/spec/app/config-spec.coffee b/spec/app/config-spec.coffee index 65c212c24..7602d1118 100644 --- a/spec/app/config-spec.coffee +++ b/spec/app/config-spec.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' describe "Config", -> describe ".get(keyPath) and .set(keyPath, value)", -> @@ -49,7 +49,7 @@ describe "Config", -> config.save() expect(fs.write.argsForCall[0][0]).toBe(fs.join(config.configDirPath, "config.cson")) - CoffeeScript = nodeRequire 'coffee-script' + CoffeeScript = require 'coffee-script' writtenConfig = CoffeeScript.eval(fs.write.argsForCall[0][1], bare: true) expect(writtenConfig).toEqual config.settings diff --git a/spec/app/directory-spec.coffee b/spec/app/directory-spec.coffee index d33341623..3acdca5f9 100644 --- a/spec/app/directory-spec.coffee +++ b/spec/app/directory-spec.coffee @@ -1,5 +1,5 @@ Directory = require 'directory' -fs = require 'fs' +fs = require 'fs-utils' describe "Directory", -> directory = null diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 11b177235..a46f2f63d 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -1,6 +1,6 @@ DisplayBuffer = require 'display-buffer' -Buffer = require 'buffer' -_ = nodeRequire 'underscore' +Buffer = require 'text-buffer' +_ = require 'underscore' describe "DisplayBuffer", -> [editSession, displayBuffer, buffer, changeHandler, tabLength] = [] diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index d9f7be7f6..990c8e7c7 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -1,5 +1,5 @@ Project = require 'project' -Buffer = require 'buffer' +Buffer = require 'text-buffer' EditSession = require 'edit-session' describe "EditSession", -> diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index da885955e..43d50065b 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1,12 +1,12 @@ EditSession = require 'edit-session' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Editor = require 'editor' Range = require 'range' Project = require 'project' $ = require 'jquery' {$$} = require 'space-pen' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' describe "Editor", -> [buffer, editor, editSession, cachedLineHeight, cachedCharWidth] = [] diff --git a/spec/app/event-emitter-spec.coffee b/spec/app/event-emitter-spec.coffee index a8ff230f7..5256220ee 100644 --- a/spec/app/event-emitter-spec.coffee +++ b/spec/app/event-emitter-spec.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' EventEmitter = require 'event-emitter' describe "EventEmitter mixin", -> diff --git a/spec/app/file-spec.coffee b/spec/app/file-spec.coffee index d99bd4380..91220218e 100644 --- a/spec/app/file-spec.coffee +++ b/spec/app/file-spec.coffee @@ -1,5 +1,5 @@ File = require 'file' -fs = require 'fs' +fs = require 'fs-utils' describe 'File', -> [path, file] = [] diff --git a/spec/app/git-spec.coffee b/spec/app/git-spec.coffee index fcdb120d8..e37c18192 100644 --- a/spec/app/git-spec.coffee +++ b/spec/app/git-spec.coffee @@ -1,5 +1,5 @@ Git = require 'git' -fs = require 'fs' +fs = require 'fs-utils' Task = require 'task' describe "Git", -> diff --git a/spec/app/grammar-view-spec.coffee b/spec/app/grammar-view-spec.coffee index 548a30d22..45157aab0 100644 --- a/spec/app/grammar-view-spec.coffee +++ b/spec/app/grammar-view-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' GrammarView = require 'grammar-view' -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "GrammarView", -> [editor, textGrammar, jsGrammar] = [] diff --git a/spec/app/language-mode-spec.coffee b/spec/app/language-mode-spec.coffee index 5b2704947..715296e6b 100644 --- a/spec/app/language-mode-spec.coffee +++ b/spec/app/language-mode-spec.coffee @@ -1,5 +1,5 @@ Project = require 'project' -Buffer = require 'buffer' +Buffer = require 'text-buffer' EditSession = require 'edit-session' describe "LanguageMode", -> diff --git a/spec/app/pane-container-spec.coffee b/spec/app/pane-container-spec.coffee index 05b76f09b..56ea53336 100644 --- a/spec/app/pane-container-spec.coffee +++ b/spec/app/pane-container-spec.coffee @@ -1,7 +1,7 @@ PaneContainer = require 'pane-container' Pane = require 'pane' {View, $$} = require 'space-pen' -_ = nodeRequire 'underscore' +_ = require 'underscore' $ = require 'jquery' describe "PaneContainer", -> diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index 278c00f5f..3b277f778 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -1,6 +1,6 @@ Project = require 'project' -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' BufferedProcess = require 'buffered-process' describe "Project", -> diff --git a/spec/app/root-view-spec.coffee b/spec/app/root-view-spec.coffee index 89c8ef8c1..7a48b84ae 100644 --- a/spec/app/root-view-spec.coffee +++ b/spec/app/root-view-spec.coffee @@ -1,8 +1,8 @@ $ = require 'jquery' -fs = require 'fs' +fs = require 'fs-utils' Project = require 'project' RootView = require 'root-view' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Editor = require 'editor' Pane = require 'pane' {View, $$} = require 'space-pen' diff --git a/spec/app/selection-spec.coffee b/spec/app/selection-spec.coffee index 9a56e6118..a10068466 100644 --- a/spec/app/selection-spec.coffee +++ b/spec/app/selection-spec.coffee @@ -1,4 +1,4 @@ -Buffer = require 'buffer' +Buffer = require 'text-buffer' EditSession = require 'edit-session' Range = require 'range' diff --git a/spec/app/syntax-spec.coffee b/spec/app/syntax-spec.coffee index 5cf79f7e3..017f3f85b 100644 --- a/spec/app/syntax-spec.coffee +++ b/spec/app/syntax-spec.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' describe "the `syntax` global", -> describe ".grammarForFilePath(filePath)", -> diff --git a/spec/app/buffer-spec.coffee b/spec/app/tex-buffer-spec.coffee similarity index 99% rename from spec/app/buffer-spec.coffee rename to spec/app/tex-buffer-spec.coffee index 77253422f..d4ecbe1bf 100644 --- a/spec/app/buffer-spec.coffee +++ b/spec/app/tex-buffer-spec.coffee @@ -1,7 +1,7 @@ Project = require 'project' -Buffer = require 'buffer' -fs = require 'fs' -_ = nodeRequire 'underscore' +Buffer = require 'text-buffer' +fs = require 'fs-utils' +_ = require 'underscore' describe 'Buffer', -> [filePath, fileContents, buffer] = [] diff --git a/spec/app/text-mate-grammar-spec.coffee b/spec/app/text-mate-grammar-spec.coffee index e727f0382..09d236487 100644 --- a/spec/app/text-mate-grammar-spec.coffee +++ b/spec/app/text-mate-grammar-spec.coffee @@ -1,8 +1,8 @@ TextMateGrammar = require 'text-mate-grammar' TextMatePackage = require 'text-mate-package' plist = require 'plist' -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' describe "TextMateGrammar", -> grammar = null diff --git a/spec/app/text-mate-theme-spec.coffee b/spec/app/text-mate-theme-spec.coffee index b2f6e54fe..ff6c5cb16 100644 --- a/spec/app/text-mate-theme-spec.coffee +++ b/spec/app/text-mate-theme-spec.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' plist = require 'plist' TextMateTheme = require 'text-mate-theme' Theme = require 'theme' diff --git a/spec/app/theme-spec.coffee b/spec/app/theme-spec.coffee index 518482292..c5b588f0b 100644 --- a/spec/app/theme-spec.coffee +++ b/spec/app/theme-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -fs = require 'fs' +fs = require 'fs-utils' Theme = require 'theme' describe "@load(name)", -> diff --git a/spec/app/tokenized-buffer-spec.coffee b/spec/app/tokenized-buffer-spec.coffee index 3fb102d75..378534b37 100644 --- a/spec/app/tokenized-buffer-spec.coffee +++ b/spec/app/tokenized-buffer-spec.coffee @@ -1,8 +1,8 @@ TokenizedBuffer = require 'tokenized-buffer' LanguageMode = require 'language-mode' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Range = require 'range' -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "TokenizedBuffer", -> [editSession, tokenizedBuffer, buffer, changeHandler] = [] diff --git a/spec/app/undo-manager-spec.coffee b/spec/app/undo-manager-spec.coffee index 6134a4da2..e213751d4 100644 --- a/spec/app/undo-manager-spec.coffee +++ b/spec/app/undo-manager-spec.coffee @@ -1,5 +1,5 @@ UndoManager = require 'undo-manager' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Range = require 'range' describe "UndoManager", -> diff --git a/spec/app/window-spec.coffee b/spec/app/window-spec.coffee index 12f79248f..1f6e77d91 100644 --- a/spec/app/window-spec.coffee +++ b/spec/app/window-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -fs = require 'fs' +fs = require 'fs-utils' describe "Window", -> projectPath = null diff --git a/spec/atom-reporter.coffee b/spec/atom-reporter.coffee index f8b7714c5..c02035cc8 100644 --- a/spec/atom-reporter.coffee +++ b/spec/atom-reporter.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' {View, $$} = require 'space-pen' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class AtomReporter extends View diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 5f19f9264..9a48e0276 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -3,7 +3,7 @@ window.setUpEnvironment() nakedLoad 'jasmine-jquery' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' Keymap = require 'keymap' Config = require 'config' Point = require 'point' @@ -12,11 +12,11 @@ Directory = require 'directory' File = require 'file' Editor = require 'editor' TokenizedBuffer = require 'tokenized-buffer' -fs = require 'fs' +fs = require 'fs-utils' RootView = require 'root-view' Git = require 'git' requireStylesheet "jasmine.css" -fixturePackagesPath = require.resolve('fixtures/packages') +fixturePackagesPath = fs.resolveOnLoadPath('fixtures/packages') require.paths.unshift(fixturePackagesPath) keymap.loadBundledKeymaps() [bindingSetsToRestore, bindingSetsByFirstKeystrokeToRestore] = [] diff --git a/spec/spec-suite.coffee b/spec/spec-suite.coffee index 67da12ee2..e35c622e3 100644 --- a/spec/spec-suite.coffee +++ b/spec/spec-suite.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' require 'spec-helper' diff --git a/spec/stdlib/cson-spec.coffee b/spec/stdlib/cson-spec.coffee index a8ca1746b..0171cebfb 100644 --- a/spec/stdlib/cson-spec.coffee +++ b/spec/stdlib/cson-spec.coffee @@ -85,6 +85,6 @@ describe "CSON", -> singleTrailingNewline: true cson = CSON.stringify(object) - CoffeeScript = nodeRequire 'coffee-script' + CoffeeScript = require 'coffee-script' evaledObject = CoffeeScript.eval(cson, bare: true) expect(evaledObject).toEqual object diff --git a/spec/stdlib/fs-spec.coffee b/spec/stdlib/fs-utils-spec.coffee similarity index 99% rename from spec/stdlib/fs-spec.coffee rename to spec/stdlib/fs-utils-spec.coffee index 3c74f0b33..85a52a903 100644 --- a/spec/stdlib/fs-spec.coffee +++ b/spec/stdlib/fs-utils-spec.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' describe "fs", -> describe ".read(path)", -> diff --git a/spec/stdlib/onig-reg-exp-spec.coffee b/spec/stdlib/onig-reg-exp-spec.coffee index b2d591b0f..5f0b9c87d 100644 --- a/spec/stdlib/onig-reg-exp-spec.coffee +++ b/spec/stdlib/onig-reg-exp-spec.coffee @@ -1,4 +1,4 @@ -{OnigRegExp} = nodeRequire 'oniguruma' +{OnigRegExp} = require 'oniguruma' describe "OnigRegExp", -> describe ".search(string, index)", -> diff --git a/spec/stdlib/underscore-extensions-spec.coffee b/spec/stdlib/underscore-extensions-spec.coffee index eed055ced..5ae310cde 100644 --- a/spec/stdlib/underscore-extensions-spec.coffee +++ b/spec/stdlib/underscore-extensions-spec.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "underscore extensions", -> describe "_.adviseBefore", -> diff --git a/spec/time-reporter.coffee b/spec/time-reporter.coffee index 1862103e5..7004072ef 100644 --- a/spec/time-reporter.coffee +++ b/spec/time-reporter.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class TimeReporter extends jasmine.Reporter diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index eb4cbfdfc..b88d7d0a0 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -1,6 +1,6 @@ Package = require 'package' -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' $ = require 'jquery' CSON = require 'cson' diff --git a/src/app/atom-theme.coffee b/src/app/atom-theme.coffee index 697e44697..9c524eac7 100644 --- a/src/app/atom-theme.coffee +++ b/src/app/atom-theme.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' Theme = require 'theme' CSON = require 'cson' diff --git a/src/app/atom.coffee b/src/app/atom.coffee index eb00a399a..4eaec8f73 100644 --- a/src/app/atom.coffee +++ b/src/app/atom.coffee @@ -1,5 +1,5 @@ -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' Package = require 'package' TextMatePackage = require 'text-mate-package' Theme = require 'theme' diff --git a/src/app/binding-set.coffee b/src/app/binding-set.coffee index 318e91c36..5621ef9cb 100644 --- a/src/app/binding-set.coffee +++ b/src/app/binding-set.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' Specificity = require 'specificity' PEG = require 'pegjs' diff --git a/src/app/buffer-change-operation.coffee b/src/app/buffer-change-operation.coffee index c70180914..cbbf68b0a 100644 --- a/src/app/buffer-change-operation.coffee +++ b/src/app/buffer-change-operation.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class BufferChangeOperation diff --git a/src/app/buffer-marker.coffee b/src/app/buffer-marker.coffee index d315120c1..199171595 100644 --- a/src/app/buffer-marker.coffee +++ b/src/app/buffer-marker.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' Point = require 'point' Range = require 'range' EventEmitter = require 'event-emitter' diff --git a/src/app/config.coffee b/src/app/config.coffee index 126202609..ec54870c0 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -1,5 +1,5 @@ -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' EventEmitter = require 'event-emitter' CSON = require 'cson' @@ -11,8 +11,6 @@ vendoredThemesDirPath = fs.join(resourcePath, "vendor/themes") userThemesDirPath = fs.join(configDirPath, "themes") userPackagesDirPath = fs.join(configDirPath, "packages") -require.paths.unshift userPackagesDirPath - module.exports = class Config configDirPath: configDirPath diff --git a/src/app/cursor-view.coffee b/src/app/cursor-view.coffee index 755229a0a..03fae93de 100644 --- a/src/app/cursor-view.coffee +++ b/src/app/cursor-view.coffee @@ -1,7 +1,7 @@ {View} = require 'space-pen' Point = require 'point' Range = require 'range' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class CursorView extends View diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index 22d492f01..5708d4bf7 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -1,7 +1,7 @@ Point = require 'point' Range = require 'range' EventEmitter = require 'event-emitter' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class Cursor diff --git a/src/app/directory.coffee b/src/app/directory.coffee index f2daa21f3..211ec42aa 100644 --- a/src/app/directory.coffee +++ b/src/app/directory.coffee @@ -1,5 +1,5 @@ -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' File = require 'file' EventEmitter = require 'event-emitter' diff --git a/src/app/display-buffer-marker.coffee b/src/app/display-buffer-marker.coffee index c8cf38c16..c8ed1648a 100644 --- a/src/app/display-buffer-marker.coffee +++ b/src/app/display-buffer-marker.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = nodeRequire 'underscore' +_ = require 'underscore' EventEmitter = require 'event-emitter' module.exports = diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 9b9d307f7..0f24a235d 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' TokenizedBuffer = require 'tokenized-buffer' LineMap = require 'line-map' Point = require 'point' diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 1a158dad7..255eb3571 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -1,5 +1,5 @@ Point = require 'point' -Buffer = require 'buffer' +Buffer = require 'text-buffer' LanguageMode = require 'language-mode' DisplayBuffer = require 'display-buffer' Cursor = require 'cursor' @@ -7,8 +7,8 @@ Selection = require 'selection' EventEmitter = require 'event-emitter' Subscriber = require 'subscriber' Range = require 'range' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' module.exports = class EditSession diff --git a/src/app/editor.coffee b/src/app/editor.coffee index a8c2992f5..c82b7fb79 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -1,14 +1,14 @@ {View, $$} = require 'space-pen' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Gutter = require 'gutter' Point = require 'point' Range = require 'range' EditSession = require 'edit-session' CursorView = require 'cursor-view' SelectionView = require 'selection-view' -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class Editor extends View diff --git a/src/app/event-emitter.coffee b/src/app/event-emitter.coffee index bdcce5529..3abcb74ac 100644 --- a/src/app/event-emitter.coffee +++ b/src/app/event-emitter.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = on: (eventName, handler) -> diff --git a/src/app/file.coffee b/src/app/file.coffee index 7f203af71..8ecc33e68 100644 --- a/src/app/file.coffee +++ b/src/app/file.coffee @@ -1,7 +1,7 @@ EventEmitter = require 'event-emitter' -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' module.exports = class File diff --git a/src/app/git.coffee b/src/app/git.coffee index 502b30203..c295f1c6d 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -1,9 +1,9 @@ -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' Subscriber = require 'subscriber' EventEmitter = require 'event-emitter' RepositoryStatusTask = require 'repository-status-task' -GitUtils = nodeRequire 'git-utils' +GitUtils = require 'git-utils' module.exports = class Git diff --git a/src/app/keymap.coffee b/src/app/keymap.coffee index 9846fd58f..f83181d50 100644 --- a/src/app/keymap.coffee +++ b/src/app/keymap.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' CSON = require 'cson' BindingSet = require 'binding-set' @@ -31,7 +31,7 @@ class Keymap $(document).command 'open-dev', => atom.openDev() loadBundledKeymaps: -> - @loadDirectory(require.resolve('keymaps')) + @loadDirectory(fs.resolveOnLoadPath('keymaps')) loadUserKeymaps: -> @loadDirectory(fs.join(config.configDirPath, 'keymaps')) diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index d88f78bd7..af461e30d 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -1,7 +1,7 @@ Range = require 'range' -_ = nodeRequire 'underscore' +_ = require 'underscore' require 'underscore-extensions' -{OnigRegExp} = nodeRequire 'oniguruma' +{OnigRegExp} = require 'oniguruma' module.exports = class LanguageMode diff --git a/src/app/package.coffee b/src/app/package.coffee index 5a7897347..57c4dc8f5 100644 --- a/src/app/package.coffee +++ b/src/app/package.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' module.exports = class Package diff --git a/src/app/pane-column.coffee b/src/app/pane-column.coffee index d603837e8..43ba40cbb 100644 --- a/src/app/pane-column.coffee +++ b/src/app/pane-column.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' PaneAxis = require 'pane-axis' module.exports = diff --git a/src/app/pane-row.coffee b/src/app/pane-row.coffee index 76b49a7d6..ce7a09f82 100644 --- a/src/app/pane-row.coffee +++ b/src/app/pane-row.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' PaneAxis = require 'pane-axis' module.exports = diff --git a/src/app/pane.coffee b/src/app/pane.coffee index 414507b2b..ef29ce72f 100644 --- a/src/app/pane.coffee +++ b/src/app/pane.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' PaneRow = require 'pane-row' PaneColumn = require 'pane-column' diff --git a/src/app/pasteboard.coffee b/src/app/pasteboard.coffee index 4d635ceee..404b48216 100644 --- a/src/app/pasteboard.coffee +++ b/src/app/pasteboard.coffee @@ -1,4 +1,4 @@ -crypto = nodeRequire 'crypto' +crypto = require 'crypto' module.exports = class Pasteboard diff --git a/src/app/project.coffee b/src/app/project.coffee index 766f25952..a0bee7fb2 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -1,8 +1,8 @@ -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' $ = require 'jquery' Range = require 'range' -Buffer = require 'buffer' +Buffer = require 'text-buffer' EditSession = require 'edit-session' EventEmitter = require 'event-emitter' Directory = require 'directory' diff --git a/src/app/range.coffee b/src/app/range.coffee index e5a2bf39a..a3870ea66 100644 --- a/src/app/range.coffee +++ b/src/app/range.coffee @@ -1,5 +1,5 @@ Point = require 'point' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class Range diff --git a/src/app/repository-status-handler.coffee b/src/app/repository-status-handler.coffee index d35a47055..a6699942a 100644 --- a/src/app/repository-status-handler.coffee +++ b/src/app/repository-status-handler.coffee @@ -1,5 +1,5 @@ -Git = nodeRequire 'git-utils' -fs = require 'fs' +Git = require 'git-utils' +fs = require 'fs-utils' module.exports = loadStatuses: (path) -> diff --git a/src/app/repository-status-task.coffee b/src/app/repository-status-task.coffee index 020654d0d..0e5f746a5 100644 --- a/src/app/repository-status-task.coffee +++ b/src/app/repository-status-task.coffee @@ -1,5 +1,5 @@ Task = require 'task' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class RepositoryStatusTask extends Task diff --git a/src/app/root-view.coffee b/src/app/root-view.coffee index 0ab323fae..f25e156ad 100644 --- a/src/app/root-view.coffee +++ b/src/app/root-view.coffee @@ -1,10 +1,10 @@ $ = require 'jquery' {$$} = require 'space-pen' -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' {View} = require 'space-pen' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Editor = require 'editor' Project = require 'project' Pane = require 'pane' diff --git a/src/app/screen-line.coffee b/src/app/screen-line.coffee index 5574542c3..739d23eff 100644 --- a/src/app/screen-line.coffee +++ b/src/app/screen-line.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class ScreenLine diff --git a/src/app/selection.coffee b/src/app/selection.coffee index e5e3a115a..9377498a2 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -1,6 +1,6 @@ Range = require 'range' EventEmitter = require 'event-emitter' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class Selection diff --git a/src/app/syntax.coffee b/src/app/syntax.coffee index f6ef7ccca..7f89a63fe 100644 --- a/src/app/syntax.coffee +++ b/src/app/syntax.coffee @@ -1,8 +1,8 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' jQuery = require 'jquery' Specificity = require 'specificity' {$$} = require 'space-pen' -fs = require 'fs' +fs = require 'fs-utils' EventEmitter = require 'event-emitter' module.exports = diff --git a/src/app/buffer.coffee b/src/app/text-buffer.coffee similarity index 99% rename from src/app/buffer.coffee rename to src/app/text-buffer.coffee index 9c16f3eb8..2c5c623e3 100644 --- a/src/app/buffer.coffee +++ b/src/app/text-buffer.coffee @@ -1,5 +1,5 @@ -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' File = require 'file' Point = require 'point' Range = require 'range' diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index 2ceb59bfb..a8ef8065c 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -1,9 +1,9 @@ -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' plist = require 'plist' Token = require 'token' CSON = require 'cson' -{OnigRegExp, OnigScanner} = nodeRequire 'oniguruma' +{OnigRegExp, OnigScanner} = require 'oniguruma' module.exports = class TextMateGrammar diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index 1e727860b..988aa1ebf 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -1,7 +1,7 @@ Package = require 'package' -fs = require 'fs' +fs = require 'fs-utils' plist = require 'plist' -_ = nodeRequire 'underscore' +_ = require 'underscore' TextMateGrammar = require 'text-mate-grammar' CSON = require 'cson' diff --git a/src/app/text-mate-theme.coffee b/src/app/text-mate-theme.coffee index 0d56b6e93..956bcbdf1 100644 --- a/src/app/text-mate-theme.coffee +++ b/src/app/text-mate-theme.coffee @@ -1,5 +1,5 @@ -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' plist = require 'plist' Theme = require 'theme' diff --git a/src/app/theme.coffee b/src/app/theme.coffee index b16a7ef1c..7b20df793 100644 --- a/src/app/theme.coffee +++ b/src/app/theme.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' module.exports = class Theme diff --git a/src/app/token.coffee b/src/app/token.coffee index 20d1b5efa..9c3d50ed8 100644 --- a/src/app/token.coffee +++ b/src/app/token.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class Token diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 0ef4ea2c0..70e982e28 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' ScreenLine = require 'screen-line' EventEmitter = require 'event-emitter' Token = require 'token' diff --git a/src/app/undo-manager.coffee b/src/app/undo-manager.coffee index 3f4025740..fc5b73e00 100644 --- a/src/app/undo-manager.coffee +++ b/src/app/undo-manager.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = diff --git a/src/app/window.coffee b/src/app/window.coffee index 10e7fbf8f..e1748daf8 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -1,6 +1,6 @@ -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' -ChildProcess = nodeRequire 'child_process' +ChildProcess = require 'child_process' require 'jquery-extensions' require 'underscore-extensions' require 'space-pen-extensions' diff --git a/src/packages/autocomplete/spec/autocomplete-spec.coffee b/src/packages/autocomplete/spec/autocomplete-spec.coffee index 9bfa9af7f..c210b2173 100644 --- a/src/packages/autocomplete/spec/autocomplete-spec.coffee +++ b/src/packages/autocomplete/spec/autocomplete-spec.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' AutocompleteView = require 'autocomplete/lib/autocomplete-view' Autocomplete = require 'autocomplete/lib/autocomplete' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Editor = require 'editor' RootView = require 'root-view' diff --git a/src/packages/bracket-matcher/lib/bracket-matcher.coffee b/src/packages/bracket-matcher/lib/bracket-matcher.coffee index 44dc1998b..52ad5aa50 100644 --- a/src/packages/bracket-matcher/lib/bracket-matcher.coffee +++ b/src/packages/bracket-matcher/lib/bracket-matcher.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' {$$} = require 'space-pen' Range = require 'range' diff --git a/src/packages/command-logger/lib/command-logger-view.coffee b/src/packages/command-logger/lib/command-logger-view.coffee index 1743857c8..e4dd5838d 100644 --- a/src/packages/command-logger/lib/command-logger-view.coffee +++ b/src/packages/command-logger/lib/command-logger-view.coffee @@ -1,6 +1,6 @@ {$$$} = require 'space-pen' ScrollView = require 'scroll-view' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class CommandLoggerView extends ScrollView @@ -96,7 +96,7 @@ class CommandLoggerView extends ScrollView w = @treeMap.width() h = @treeMap.height() - d3 = nodeRequire 'd3' + d3 = require 'd3' x = d3.scale.linear().range([0, w]) y = d3.scale.linear().range([0, h]) diff --git a/src/packages/command-palette/lib/command-palette-view.coffee b/src/packages/command-palette/lib/command-palette-view.coffee index 717118041..2acb80753 100644 --- a/src/packages/command-palette/lib/command-palette-view.coffee +++ b/src/packages/command-palette/lib/command-palette-view.coffee @@ -1,7 +1,7 @@ {$$} = require 'space-pen' SelectList = require 'select-list' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class CommandPaletteView extends SelectList diff --git a/src/packages/command-palette/spec/command-palette-spec.coffee b/src/packages/command-palette/spec/command-palette-spec.coffee index 780ad33b3..414c53996 100644 --- a/src/packages/command-palette/spec/command-palette-spec.coffee +++ b/src/packages/command-palette/spec/command-palette-spec.coffee @@ -1,7 +1,7 @@ RootView = require 'root-view' CommandPalette = require 'command-palette/lib/command-palette-view' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "CommandPalette", -> [palette] = [] diff --git a/src/packages/command-panel/lib/command-interpreter.coffee b/src/packages/command-panel/lib/command-interpreter.coffee index c2328ceed..8caa07b20 100644 --- a/src/packages/command-panel/lib/command-interpreter.coffee +++ b/src/packages/command-panel/lib/command-interpreter.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' PEG = require 'pegjs' module.exports = diff --git a/src/packages/command-panel/lib/command-panel-view.coffee b/src/packages/command-panel/lib/command-panel-view.coffee index 72c2b95e6..2430c7ae0 100644 --- a/src/packages/command-panel/lib/command-panel-view.coffee +++ b/src/packages/command-panel/lib/command-panel-view.coffee @@ -5,7 +5,7 @@ CompositeCommand = require './commands/composite-command' PreviewList = require './preview-list' Editor = require 'editor' {SyntaxError} = require('pegjs').parser -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class CommandPanelView extends View diff --git a/src/packages/command-panel/lib/commands/composite-command.coffee b/src/packages/command-panel/lib/commands/composite-command.coffee index 7c6648bce..cc5485b4a 100644 --- a/src/packages/command-panel/lib/commands/composite-command.coffee +++ b/src/packages/command-panel/lib/commands/composite-command.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' $ = require 'jquery' module.exports = diff --git a/src/packages/command-panel/lib/path-view.coffee b/src/packages/command-panel/lib/path-view.coffee index dbd93751d..21042bfb9 100644 --- a/src/packages/command-panel/lib/path-view.coffee +++ b/src/packages/command-panel/lib/path-view.coffee @@ -1,5 +1,5 @@ {View} = require 'space-pen' -fs = require 'fs' +fs = require 'fs-utils' OperationView = require './operation-view' $ = require 'jquery' diff --git a/src/packages/command-panel/lib/preview-list.coffee b/src/packages/command-panel/lib/preview-list.coffee index 6d7629128..06abb868e 100644 --- a/src/packages/command-panel/lib/preview-list.coffee +++ b/src/packages/command-panel/lib/preview-list.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' ScrollView = require 'scroll-view' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' PathView = require './path-view' OperationView = require './operation-view' diff --git a/src/packages/command-panel/spec/command-interpreter-spec.coffee b/src/packages/command-panel/spec/command-interpreter-spec.coffee index 9d6b0c1c1..ed1c4a702 100644 --- a/src/packages/command-panel/spec/command-interpreter-spec.coffee +++ b/src/packages/command-panel/spec/command-interpreter-spec.coffee @@ -1,9 +1,9 @@ CommandInterpreter = require 'command-panel/lib/command-interpreter' Project = require 'project' -Buffer = require 'buffer' +Buffer = require 'text-buffer' EditSession = require 'edit-session' -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "CommandInterpreter", -> [interpreter, editSession, buffer] = [] diff --git a/src/packages/command-panel/spec/command-panel-spec.coffee b/src/packages/command-panel/spec/command-panel-spec.coffee index d5f087c1a..213d14191 100644 --- a/src/packages/command-panel/spec/command-panel-spec.coffee +++ b/src/packages/command-panel/spec/command-panel-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' CommandPanelView = require 'command-panel/lib/command-panel-view' -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "CommandPanel", -> [editSession, buffer, commandPanel] = [] diff --git a/src/packages/editor-stats/lib/editor-stats-view.coffee b/src/packages/editor-stats/lib/editor-stats-view.coffee index 7f0d7314e..d1a554449 100644 --- a/src/packages/editor-stats/lib/editor-stats-view.coffee +++ b/src/packages/editor-stats/lib/editor-stats-view.coffee @@ -1,6 +1,6 @@ ScrollView = require 'scroll-view' -d3 = nodeRequire 'd3' -_ = nodeRequire 'underscore' +d3 = require 'd3' +_ = require 'underscore' $ = require 'jquery' module.exports = diff --git a/src/packages/editor-stats/spec/editor-stats-spec.coffee b/src/packages/editor-stats/spec/editor-stats-spec.coffee index d8f372365..5d8708e42 100644 --- a/src/packages/editor-stats/spec/editor-stats-spec.coffee +++ b/src/packages/editor-stats/spec/editor-stats-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' RootView = require 'root-view' EditorStats = require 'editor-stats/lib/editor-stats-view' diff --git a/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee b/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee index 013d4b344..3161115d8 100644 --- a/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee +++ b/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee @@ -1,8 +1,8 @@ {View, $$} = require 'space-pen' SelectList = require 'select-list' -_ = nodeRequire 'underscore' +_ = require 'underscore' $ = require 'jquery' -fs = require 'fs' +fs = require 'fs-utils' LoadPathsTask = require './load-paths-task' module.exports = diff --git a/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee b/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee index e3fcf839c..c6fbe92aa 100644 --- a/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee +++ b/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = projectPaths: null diff --git a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee index 783b93d35..12ac60605 100644 --- a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee +++ b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee @@ -1,5 +1,5 @@ -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' module.exports = loadPaths: (rootPath, ignoredNames, excludeGitIgnoredPaths) -> diff --git a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee index 0f9b04e64..d512d0b0e 100644 --- a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee +++ b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee @@ -1,10 +1,10 @@ RootView = require 'root-view' FuzzyFinder = require 'fuzzy-finder/lib/fuzzy-finder-view' LoadPathsTask = require 'fuzzy-finder/lib/load-paths-task' -_ = nodeRequire 'underscore' +_ = require 'underscore' $ = require 'jquery' {$$} = require 'space-pen' -fs = require 'fs' +fs = require 'fs-utils' describe 'FuzzyFinder', -> [finderView] = [] diff --git a/src/packages/markdown-preview/lib/markdown-preview-view.coffee b/src/packages/markdown-preview/lib/markdown-preview-view.coffee index b78827a83..580704007 100644 --- a/src/packages/markdown-preview/lib/markdown-preview-view.coffee +++ b/src/packages/markdown-preview/lib/markdown-preview-view.coffee @@ -1,5 +1,5 @@ ScrollView = require 'scroll-view' -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' {$$$} = require 'space-pen' diff --git a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee index 4941e36d6..7704768ee 100644 --- a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee +++ b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' RootView = require 'root-view' MarkdownPreview = require 'markdown-preview/lib/markdown-preview-view' -_ = nodeRequire 'underscore' +_ = require 'underscore' describe "MarkdownPreview", -> beforeEach -> diff --git a/src/packages/package-generator/lib/package-generator-view.coffee b/src/packages/package-generator/lib/package-generator-view.coffee index 95d17b2e6..b8f123ecd 100644 --- a/src/packages/package-generator/lib/package-generator-view.coffee +++ b/src/packages/package-generator/lib/package-generator-view.coffee @@ -1,8 +1,8 @@ {View} = require 'space-pen' Editor = require 'editor' $ = require 'jquery' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' module.exports = class PackageGeneratorView extends View diff --git a/src/packages/package-generator/spec/package-generator-spec.coffee b/src/packages/package-generator/spec/package-generator-spec.coffee index cae5d5d54..c1b57b255 100644 --- a/src/packages/package-generator/spec/package-generator-spec.coffee +++ b/src/packages/package-generator/spec/package-generator-spec.coffee @@ -1,5 +1,5 @@ RootView = require 'root-view' -fs = require 'fs' +fs = require 'fs-utils' describe 'Package Generator', -> [packageGenerator] = [] diff --git a/src/packages/snippets/lib/load-snippets-handler.coffee b/src/packages/snippets/lib/load-snippets-handler.coffee index 331013adb..6d65a46c4 100644 --- a/src/packages/snippets/lib/load-snippets-handler.coffee +++ b/src/packages/snippets/lib/load-snippets-handler.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' TextMatePackage = require 'text-mate-package' SnippetBodyParser = require './snippet-body-parser' CSON = require 'cson' diff --git a/src/packages/snippets/lib/snippet-body-parser.coffee b/src/packages/snippets/lib/snippet-body-parser.coffee index 0239fee3f..f4c3f99f7 100644 --- a/src/packages/snippets/lib/snippet-body-parser.coffee +++ b/src/packages/snippets/lib/snippet-body-parser.coffee @@ -1,4 +1,4 @@ PEG = require 'pegjs' -fs = require 'fs' +fs = require 'fs-utils' grammarSrc = fs.read(require.resolve('./snippet-body.pegjs')) module.exports = PEG.buildParser(grammarSrc, trackLineAndColumn: true) diff --git a/src/packages/snippets/lib/snippet-expansion.coffee b/src/packages/snippets/lib/snippet-expansion.coffee index 825cd92f7..68f9935af 100644 --- a/src/packages/snippets/lib/snippet-expansion.coffee +++ b/src/packages/snippets/lib/snippet-expansion.coffee @@ -1,5 +1,5 @@ Subscriber = require 'subscriber' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class SnippetExpansion diff --git a/src/packages/snippets/lib/snippet.coffee b/src/packages/snippets/lib/snippet.coffee index 6d484fef6..6e0069862 100644 --- a/src/packages/snippets/lib/snippet.coffee +++ b/src/packages/snippets/lib/snippet.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' Range = require 'range' module.exports = diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index ee89f587b..a76497497 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -1,6 +1,6 @@ AtomPackage = require 'atom-package' -fs = require 'fs' -_ = nodeRequire 'underscore' +fs = require 'fs-utils' +_ = require 'underscore' SnippetExpansion = require './snippet-expansion' Snippet = require './snippet' LoadSnippetsTask = require './load-snippets-task' diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index b7150791c..9c6c323ac 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -1,10 +1,10 @@ Snippet = require 'snippets/lib/snippet' LoadSnippetsTask = require 'snippets/lib/load-snippets-task' RootView = require 'root-view' -Buffer = require 'buffer' +Buffer = require 'text-buffer' Editor = require 'editor' -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' Package = require 'package' describe "Snippets extension", -> diff --git a/src/packages/spell-check/lib/spell-check-view.coffee b/src/packages/spell-check/lib/spell-check-view.coffee index 37ad954ec..323d0e873 100644 --- a/src/packages/spell-check/lib/spell-check-view.coffee +++ b/src/packages/spell-check/lib/spell-check-view.coffee @@ -1,5 +1,5 @@ {View} = require 'space-pen' -_ = nodeRequire 'underscore' +_ = require 'underscore' SpellCheckTask = require './spell-check-task' MisspellingView = require './misspelling-view' diff --git a/src/packages/status-bar/lib/status-bar-view.coffee b/src/packages/status-bar/lib/status-bar-view.coffee index a3d6723c0..f58d4dba0 100644 --- a/src/packages/status-bar/lib/status-bar-view.coffee +++ b/src/packages/status-bar/lib/status-bar-view.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' {View, $$} = require 'space-pen' $ = require 'jquery' diff --git a/src/packages/status-bar/spec/status-bar-spec.coffee b/src/packages/status-bar/spec/status-bar-spec.coffee index 5d45a5097..92ee548ee 100644 --- a/src/packages/status-bar/spec/status-bar-spec.coffee +++ b/src/packages/status-bar/spec/status-bar-spec.coffee @@ -1,8 +1,8 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' RootView = require 'root-view' StatusBar = require 'status-bar/lib/status-bar-view' -fs = require 'fs' +fs = require 'fs-utils' describe "StatusBar", -> [editor, statusBar, buffer] = [] diff --git a/src/packages/strip-trailing-whitespace/spec/strip-trailing-whitespace-spec.coffee b/src/packages/strip-trailing-whitespace/spec/strip-trailing-whitespace-spec.coffee index 17277b059..9a405ddd2 100644 --- a/src/packages/strip-trailing-whitespace/spec/strip-trailing-whitespace-spec.coffee +++ b/src/packages/strip-trailing-whitespace/spec/strip-trailing-whitespace-spec.coffee @@ -1,5 +1,5 @@ RootView = require 'root-view' -fs = require 'fs' +fs = require 'fs-utils' describe "StripTrailingWhitespace", -> [editor, path] = [] diff --git a/src/packages/symbols-view/lib/load-tags-handler.coffee b/src/packages/symbols-view/lib/load-tags-handler.coffee index a002ee263..860d037f5 100644 --- a/src/packages/symbols-view/lib/load-tags-handler.coffee +++ b/src/packages/symbols-view/lib/load-tags-handler.coffee @@ -1,5 +1,5 @@ -ctags = nodeRequire 'ctags' -fs = require 'fs' +ctags = require 'ctags' +fs = require 'fs-utils' module.exports = getTagsFile: (path) -> diff --git a/src/packages/symbols-view/lib/symbols-view.coffee b/src/packages/symbols-view/lib/symbols-view.coffee index 4d5bbb5df..816be9739 100644 --- a/src/packages/symbols-view/lib/symbols-view.coffee +++ b/src/packages/symbols-view/lib/symbols-view.coffee @@ -3,7 +3,7 @@ SelectList = require 'select-list' TagGenerator = require './tag-generator' TagReader = require './tag-reader' Point = require 'point' -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' module.exports = diff --git a/src/packages/symbols-view/lib/tag-reader.coffee b/src/packages/symbols-view/lib/tag-reader.coffee index f03c3e332..91ce1787c 100644 --- a/src/packages/symbols-view/lib/tag-reader.coffee +++ b/src/packages/symbols-view/lib/tag-reader.coffee @@ -1,7 +1,7 @@ -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' LoadTagsTask = require './load-tags-task' -ctags = nodeRequire 'ctags' +ctags = require 'ctags' module.exports = diff --git a/src/packages/symbols-view/spec/symbols-view-spec.coffee b/src/packages/symbols-view/spec/symbols-view-spec.coffee index b988d61c8..db8876855 100644 --- a/src/packages/symbols-view/spec/symbols-view-spec.coffee +++ b/src/packages/symbols-view/spec/symbols-view-spec.coffee @@ -1,7 +1,7 @@ RootView = require 'root-view' SymbolsView = require 'symbols-view/lib/symbols-view' TagGenerator = require 'symbols-view/lib/tag-generator' -fs = require 'fs' +fs = require 'fs-utils' describe "SymbolsView", -> [symbolsView, setArraySpy] = [] diff --git a/src/packages/tabs/lib/tab-bar-view.coffee b/src/packages/tabs/lib/tab-bar-view.coffee index 37e830071..fbbab1330 100644 --- a/src/packages/tabs/lib/tab-bar-view.coffee +++ b/src/packages/tabs/lib/tab-bar-view.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' SortableList = require 'sortable-list' TabView = require './tab-view' diff --git a/src/packages/tabs/lib/tab-view.coffee b/src/packages/tabs/lib/tab-view.coffee index 9bfee397e..9e9594ef1 100644 --- a/src/packages/tabs/lib/tab-view.coffee +++ b/src/packages/tabs/lib/tab-view.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' {View} = require 'space-pen' -fs = require 'fs' +fs = require 'fs-utils' module.exports = class TabView extends View diff --git a/src/packages/tabs/spec/tabs-spec.coffee b/src/packages/tabs/spec/tabs-spec.coffee index 41c012c2e..014e0352d 100644 --- a/src/packages/tabs/spec/tabs-spec.coffee +++ b/src/packages/tabs/spec/tabs-spec.coffee @@ -1,10 +1,10 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' RootView = require 'root-view' Pane = require 'pane' PaneContainer = require 'pane-container' TabBarView = require 'tabs/lib/tab-bar-view' -fs = require 'fs' +fs = require 'fs-utils' {View} = require 'space-pen' describe "Tabs package main", -> diff --git a/src/packages/tree-view/lib/dialog.coffee b/src/packages/tree-view/lib/dialog.coffee index ddb71181a..858db818a 100644 --- a/src/packages/tree-view/lib/dialog.coffee +++ b/src/packages/tree-view/lib/dialog.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' Editor = require 'editor' -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' module.exports = diff --git a/src/packages/tree-view/lib/file-view.coffee b/src/packages/tree-view/lib/file-view.coffee index f8d7f5115..956e902f8 100644 --- a/src/packages/tree-view/lib/file-view.coffee +++ b/src/packages/tree-view/lib/file-view.coffee @@ -1,7 +1,7 @@ {View} = require 'space-pen' $ = require 'jquery' Git = require 'git' -fs = require 'fs' +fs = require 'fs-utils' module.exports = class FileView extends View diff --git a/src/packages/tree-view/lib/tree-view.coffee b/src/packages/tree-view/lib/tree-view.coffee index ae125b04c..6b531aa4e 100644 --- a/src/packages/tree-view/lib/tree-view.coffee +++ b/src/packages/tree-view/lib/tree-view.coffee @@ -4,9 +4,9 @@ Directory = require 'directory' DirectoryView = require './directory-view' FileView = require './file-view' Dialog = require './dialog' -fs = require 'fs' +fs = require 'fs-utils' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class TreeView extends ScrollView diff --git a/src/packages/tree-view/spec/tree-view-spec.coffee b/src/packages/tree-view/spec/tree-view-spec.coffee index 75b0ab070..7ea695d23 100644 --- a/src/packages/tree-view/spec/tree-view-spec.coffee +++ b/src/packages/tree-view/spec/tree-view-spec.coffee @@ -1,9 +1,9 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' TreeView = require 'tree-view/lib/tree-view' RootView = require 'root-view' Directory = require 'directory' -fs = require 'fs' +fs = require 'fs-utils' describe "TreeView", -> [treeView, sampleJs, sampleTxt] = [] diff --git a/src/packages/wrap-guide/lib/wrap-guide-view.coffee b/src/packages/wrap-guide/lib/wrap-guide-view.coffee index f3f79e978..491e19705 100644 --- a/src/packages/wrap-guide/lib/wrap-guide-view.coffee +++ b/src/packages/wrap-guide/lib/wrap-guide-view.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class WrapGuideView extends View diff --git a/src/stdlib/buffered-process.coffee b/src/stdlib/buffered-process.coffee index 1781662f0..04fcf3ce9 100644 --- a/src/stdlib/buffered-process.coffee +++ b/src/stdlib/buffered-process.coffee @@ -1,4 +1,4 @@ -ChildProcess = nodeRequire 'child_process' +ChildProcess = require 'child_process' module.exports = class BufferedProcess diff --git a/src/stdlib/cson.coffee b/src/stdlib/cson.coffee index c723a558b..f6ba3258d 100644 --- a/src/stdlib/cson.coffee +++ b/src/stdlib/cson.coffee @@ -1,5 +1,5 @@ -_ = nodeRequire 'underscore' -fs = require 'fs' +_ = require 'underscore' +fs = require 'fs-utils' module.exports = isObjectPath: (path) -> @@ -9,7 +9,7 @@ module.exports = readObject: (path) -> contents = fs.read(path) if fs.extension(path) is '.cson' - CoffeeScript = nodeRequire 'coffee-script' + CoffeeScript = require 'coffee-script' CoffeeScript.eval(contents, bare: true) else JSON.parse(contents) diff --git a/src/stdlib/event.coffee b/src/stdlib/event.coffee index 902eba4e9..adf761d97 100644 --- a/src/stdlib/event.coffee +++ b/src/stdlib/event.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = class Event diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs-utils.coffee similarity index 87% rename from src/stdlib/fs.coffee rename to src/stdlib/fs-utils.coffee index bebe835fe..10661b2b1 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs-utils.coffee @@ -1,9 +1,10 @@ # commonjs fs module # http://ringojs.org/api/v0.8/fs/ -_ = nodeRequire 'underscore' -nodeFs = nodeRequire 'fs' -mkdirp = nodeRequire 'mkdirp' +_ = require 'underscore' +fs = require 'fs' +mkdirp = require 'mkdirp' +Module = require 'module' module.exports = # Make the given path absolute by resolving it against the @@ -28,7 +29,7 @@ module.exports = # Returns true if the file specified by path exists exists: (path) -> - path? and nodeFs.existsSync(path) + path? and fs.existsSync(path) # Returns the extension of a file. The extension of a file is the # last dot (excluding any number of initial dots) followed by one or @@ -50,12 +51,12 @@ module.exports = # Returns true if the file specified by path exists and is a # directory. isDirectory: (path) -> - @exists(path) and nodeFs.statSync(path).isDirectory() + @exists(path) and fs.statSync(path).isDirectory() # Returns true if the file specified by path exists and is a # regular file. isFile: (path) -> - @exists(path) and nodeFs.statSync(path).isFile() + @exists(path) and fs.statSync(path).isFile() # Returns an array with all the names of files contained # in the directory path. @@ -81,28 +82,28 @@ module.exports = paths move: (source, target) -> - nodeFs.renameSync(source, target) + fs.renameSync(source, target) # Remove a file at the given path. Throws an error if path is not a # file or a symbolic link to a file. remove: (path) -> if @isFile(path) - nodeFs.unlinkSync(path) + fs.unlinkSync(path) else if @isDirectory(path) removeDirectory = (path) => - for entry in nodeFs.readdirSync(path) + for entry in fs.readdirSync(path) entryPath = @join(path, entry) - stats = nodeFs.statSync(entryPath) + stats = fs.statSync(entryPath) if stats.isDirectory() removeDirectory(entryPath) else if stats.isFile() - nodeFs.unlinkSync(entryPath) - nodeFs.rmdirSync(path) + fs.unlinkSync(entryPath) + fs.rmdirSync(path) removeDirectory(path) # Open, read, and close a file, returning the file's contents. read: (path) -> - String nodeFs.readFileSync(path) + String fs.readFileSync(path) # Returns an array of path components. If the path is absolute, the first # component will be an indicator of the root of the file system; for file @@ -116,10 +117,10 @@ module.exports = # Open, write, flush, and close a file, writing the given content. write: (path, content) -> mkdirp.sync(@directory(path)) - nodeFs.writeFileSync(path, content) + fs.writeFileSync(path, content) makeDirectory: (path) -> - nodeFs.mkdirSync(path) + fs.mkdirSync(path) # Creates the directory specified by "path" including any missing parent # directories. @@ -134,10 +135,10 @@ module.exports = traverse = (rootPath, prefix, onFile, onDirectory) => prefix = "#{prefix}/" if prefix - for file in nodeFs.readdirSync(rootPath) + for file in fs.readdirSync(rootPath) relativePath = "#{prefix}#{file}" absolutePath = @join(rootPath, file) - stats = nodeFs.statSync(absolutePath) + stats = fs.statSync(absolutePath) if stats.isDirectory() traverse(absolutePath, relativePath, onFile, onDirectory) if onDirectory(relativePath) else if stats.isFile() @@ -146,8 +147,8 @@ module.exports = traverse(rootPath, '', onFile, onDirectory) md5ForPath: (path) -> - contents = nodeFs.readFileSync(path) - nodeRequire('crypto').createHash('md5').update(contents).digest('hex') + contents = fs.readFileSync(path) + require('crypto').createHash('md5').update(contents).digest('hex') resolve: (args...) -> extensions = args.pop() if _.isArray(_.last(args)) @@ -163,6 +164,10 @@ module.exports = return candidatePath if @exists(candidatePath) undefined + resolveOnLoadPath: (args...) -> + loadPaths = Module.globalPaths.concat(module.paths) + @resolve(loadPaths..., args...) + resolveExtension: (path, extensions) -> for extension in extensions if extension == "" diff --git a/src/stdlib/jquery-extensions.coffee b/src/stdlib/jquery-extensions.coffee index 592d01b03..089363577 100644 --- a/src/stdlib/jquery-extensions.coffee +++ b/src/stdlib/jquery-extensions.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = nodeRequire 'underscore' +_ = require 'underscore' $.fn.scrollBottom = (newValue) -> if newValue? diff --git a/src/stdlib/path.coffee b/src/stdlib/path.coffee index 2d1d5c41d..337b60d6b 100644 --- a/src/stdlib/path.coffee +++ b/src/stdlib/path.coffee @@ -1,7 +1,7 @@ # node.js path module # http://nodejs.org/docs/v0.6.0/api/path.html -_ = nodeRequire 'underscore' +_ = require 'underscore' module.exports = # Return the last portion of a path. Similar to the Unix basename command. diff --git a/src/stdlib/require.coffee b/src/stdlib/require.coffee index b4fa85ea1..4d7f67690 100644 --- a/src/stdlib/require.coffee +++ b/src/stdlib/require.coffee @@ -1,4 +1,4 @@ -fs = nodeRequire 'fs' +fs = require 'fs-utils' paths = [ "#{window.resourcePath}/spec" @@ -61,7 +61,7 @@ exts = compiled = __read(cacheFilePath) writeToCache = false else - CoffeeScript = nodeRequire 'coffee-script' + CoffeeScript = require 'coffee-script' compiled = CoffeeScript.compile(__read(file), filename: file) writeToCache = true @@ -76,7 +76,7 @@ getPath = (path) -> cacheFilePath = getCacheFilePath(path) unless __exists(cacheFilePath) - CoffeeScript = nodeRequire 'coffee-script' + CoffeeScript = require 'coffee-script' compiled = CoffeeScript.compile(__read(path), filename: path) createCacheDirectory() fs.writeFileSync(cacheFilePath, compiled) diff --git a/src/stdlib/settings.coffee b/src/stdlib/settings.coffee index f067b44dc..e3eadea85 100644 --- a/src/stdlib/settings.coffee +++ b/src/stdlib/settings.coffee @@ -1,4 +1,4 @@ -fs = require 'fs' +fs = require 'fs-utils' CoffeeScript = require 'coffee-script' # Settings file looks like: diff --git a/src/stdlib/space-pen-extensions.coffee b/src/stdlib/space-pen-extensions.coffee index 819b4f15e..37443ab03 100644 --- a/src/stdlib/space-pen-extensions.coffee +++ b/src/stdlib/space-pen-extensions.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' {View} = require 'space-pen' jQuery = require 'jquery' ConfigObserver = require 'config-observer' diff --git a/src/stdlib/task-shell.coffee b/src/stdlib/task-shell.coffee index 5274f9c88..51966cec6 100644 --- a/src/stdlib/task-shell.coffee +++ b/src/stdlib/task-shell.coffee @@ -13,9 +13,6 @@ console = error: -> callTaskMethod 'error', arguments... self.__defineGetter__ 'console', -> console -self.nodeRequire = self.require -self.require = undefined - window.document = createElement: -> setAttribute: -> @@ -36,12 +33,11 @@ self.callTaskMethod = (method, args...) -> # The worker's initial handler replaces itself when `start` is invoked self.handler = - start: ({resourcePath, globals, requirePath, handlerPath}) -> + start: ({globals, handlerPath}) -> for key, value of globals self[key] = value window[key] = value - importScripts(requirePath) - require 'config' + require 'coffee-script' self.handler = require(handlerPath) callTaskMethod 'started' diff --git a/src/stdlib/task.coffee b/src/stdlib/task.coffee index 4e2873a0d..b46e2c7f8 100644 --- a/src/stdlib/task.coffee +++ b/src/stdlib/task.coffee @@ -1,5 +1,6 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' EventEmitter = require 'event-emitter' +fs = require 'fs-utils' module.exports = class Task @@ -10,7 +11,13 @@ class Task start: -> throw new Error("Task already started") if @worker? - @worker = new Worker(require.getPath('task-shell')) + taskShellPath = fs.resolveOnLoadPath('task-shell', ['js', 'coffee']) + contents = fs.read(taskShellPath) + if fs.extension(taskShellPath) is '.coffee' + CoffeeScript = require 'coffee-script' + contents = CoffeeScript.compile(contents, filename: taskShellPath) + blob = new Blob([contents], type: 'text/javascript') + @worker = new Worker(URL.createObjectURL(blob)) @worker.onmessage = ({data}) => if @aborted @done() @@ -29,10 +36,8 @@ class Task startWorker: -> @callWorkerMethod 'start', globals: - resourcePath: window.resourcePath navigator: userAgent: navigator.userAgent - requirePath: require.getPath('require') handlerPath: @path started: -> diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index cc23b3fe8..0a47fdfc1 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -1,4 +1,4 @@ -_ = nodeRequire 'underscore' +_ = require 'underscore' _.mixin remove: (array, element) -> diff --git a/static/index.html b/static/index.html index 960344d24..eb0b9cf59 100644 --- a/static/index.html +++ b/static/index.html @@ -16,6 +16,7 @@ window.onload = function() { try { + require('coffee-script'); if (bootstrapScript) require(bootstrapScript); } catch (error) { @@ -23,12 +24,7 @@ console.error(error.stack || error); } } - - window.nodeRequire = window.require; - window.require = undefined; - - From 5399fdb9394f6020cc602cff018146b8732c03c5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 12:17:12 -0700 Subject: [PATCH 057/281] Don't reassign to parameter --- src/packages/command-logger/lib/command-logger.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packages/command-logger/lib/command-logger.coffee b/src/packages/command-logger/lib/command-logger.coffee index 442fd1710..d5a0dc573 100644 --- a/src/packages/command-logger/lib/command-logger.coffee +++ b/src/packages/command-logger/lib/command-logger.coffee @@ -21,8 +21,8 @@ module.exports = eventNameLog.lastRun = new Date().getTime() trigger = $.fn.trigger @originalTrigger = trigger - $.fn.trigger = (eventName) -> - eventName = eventName.type if eventName.type + $.fn.trigger = (event) -> + eventName = event.type ? event registerTriggeredEvent(eventName) if $(this).events()[eventName] trigger.apply(this, arguments) From 82bfd83da1eb192b3a4bf426f9a416040cda4274 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 12:37:51 -0700 Subject: [PATCH 058/281] Require task shell path in blob snippet --- src/stdlib/task.coffee | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/stdlib/task.coffee b/src/stdlib/task.coffee index b46e2c7f8..764caeaf5 100644 --- a/src/stdlib/task.coffee +++ b/src/stdlib/task.coffee @@ -12,11 +12,7 @@ class Task throw new Error("Task already started") if @worker? taskShellPath = fs.resolveOnLoadPath('task-shell', ['js', 'coffee']) - contents = fs.read(taskShellPath) - if fs.extension(taskShellPath) is '.coffee' - CoffeeScript = require 'coffee-script' - contents = CoffeeScript.compile(contents, filename: taskShellPath) - blob = new Blob([contents], type: 'text/javascript') + blob = new Blob(["require('coffee-script'); require('#{taskShellPath}');"], type: 'text/javascript') @worker = new Worker(URL.createObjectURL(blob)) @worker.onmessage = ({data}) => if @aborted From 6699941da04b24e3d2517dabfa5efca3da15aa68 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:05:51 -0700 Subject: [PATCH 059/281] Remove unneeded resolved task shell path --- src/stdlib/task.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/stdlib/task.coffee b/src/stdlib/task.coffee index 764caeaf5..636be9e6f 100644 --- a/src/stdlib/task.coffee +++ b/src/stdlib/task.coffee @@ -11,8 +11,7 @@ class Task start: -> throw new Error("Task already started") if @worker? - taskShellPath = fs.resolveOnLoadPath('task-shell', ['js', 'coffee']) - blob = new Blob(["require('coffee-script'); require('#{taskShellPath}');"], type: 'text/javascript') + blob = new Blob(["require('coffee-script'); require('task-shell');"], type: 'text/javascript') @worker = new Worker(URL.createObjectURL(blob)) @worker.onmessage = ({data}) => if @aborted From eea02cb807671b26196c824a920433281b482684 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:06:23 -0700 Subject: [PATCH 060/281] Remove unneeded coffee-script require This is handled by the wrapper around task-shell to ensure coffee-script is required before the shell is. --- src/stdlib/task-shell.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stdlib/task-shell.coffee b/src/stdlib/task-shell.coffee index 51966cec6..bab99dc7c 100644 --- a/src/stdlib/task-shell.coffee +++ b/src/stdlib/task-shell.coffee @@ -37,7 +37,6 @@ self.handler = for key, value of globals self[key] = value window[key] = value - require 'coffee-script' self.handler = require(handlerPath) callTaskMethod 'started' From 8b82c06c6fcd63a48d498ccef402bea19652d78f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:32:21 -0700 Subject: [PATCH 061/281] Include fixtures/packages in resource paths when running specs --- native/atom_window_controller.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index b4f0fb2a3..bc10d0a76 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -59,6 +59,10 @@ @"vendor/packages", @"vendor", @"static", @"themes", @"node_modules", nil]; NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; + if (_runningSpecs) { + NSString *fixturePackagesDirectory = [NSString stringWithFormat:@"%@/fixtures/packages", _resourcePath]; + [resourcePaths addObject:fixturePackagesDirectory]; + } NSString *userPackagesDirectory = [@"~/.atom/packages" stringByStandardizingPath]; [resourcePaths addObject:userPackagesDirectory]; for (int i = 0; i < paths.count; i++) { From 96a949983c56a20fab39c63ceb522f7a3ec05b9f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:32:42 -0700 Subject: [PATCH 062/281] Use fs.resolveOnLoadPath() instead of require.resolve() --- spec/spec-helper.coffee | 3 +-- spec/spec-suite.coffee | 3 +-- vendor/jasmine-helper.coffee | 10 +++++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 9a48e0276..c4dbe999f 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -17,7 +17,6 @@ RootView = require 'root-view' Git = require 'git' requireStylesheet "jasmine.css" fixturePackagesPath = fs.resolveOnLoadPath('fixtures/packages') -require.paths.unshift(fixturePackagesPath) keymap.loadBundledKeymaps() [bindingSetsToRestore, bindingSetsByFirstKeystrokeToRestore] = [] @@ -30,7 +29,7 @@ jasmine.getEnv().defaultTimeoutInterval = 5000 beforeEach -> jQuery.fx.off = true - window.project = new Project(require.resolve('fixtures')) + window.project = new Project(fs.resolveOnLoadPath('fixtures')) window.git = Git.open(project.getPath()) window.project.on 'path-changed', -> window.git?.destroy() diff --git a/spec/spec-suite.coffee b/spec/spec-suite.coffee index e35c622e3..b2852b0cf 100644 --- a/spec/spec-suite.coffee +++ b/spec/spec-suite.coffee @@ -1,9 +1,8 @@ fs = require 'fs-utils' require 'spec-helper' - # Run core specs -for path in fs.listTree(require.resolve("spec")) when /-spec\.coffee$/.test path +for path in fs.listTree(fs.resolveOnLoadPath("spec")) when /-spec\.coffee$/.test path require path # Run extension specs diff --git a/vendor/jasmine-helper.coffee b/vendor/jasmine-helper.coffee index 40525da33..8e8ba19b0 100644 --- a/vendor/jasmine-helper.coffee +++ b/vendor/jasmine-helper.coffee @@ -1,3 +1,12 @@ +window.nakedLoad = (file) -> + fs = require 'fs-utils' + file = require.resolve(file) + code = fs.read(file) + if fs.extension(file) is '.coffee' + require('coffee-script').eval(code, filename: file) + else + window.eval("#{code}\n//@ sourceURL=#{file}") + module.exports.runSpecSuite = (specSuite, logErrors=true) -> {$$} = require 'space-pen' nakedLoad 'jasmine' @@ -14,7 +23,6 @@ module.exports.runSpecSuite = (specSuite, logErrors=true) -> else new AtomReporter() - require specSuite jasmineEnv = jasmine.getEnv() jasmineEnv.addReporter(reporter) From e601c6e2567407181682a814f96c4f1f7f73a3d9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:37:12 -0700 Subject: [PATCH 063/281] Use fs.resolveOnLoadPath() to find ctags executable --- src/packages/symbols-view/lib/tag-generator.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/packages/symbols-view/lib/tag-generator.coffee b/src/packages/symbols-view/lib/tag-generator.coffee index e2aca4995..5960ed6a2 100644 --- a/src/packages/symbols-view/lib/tag-generator.coffee +++ b/src/packages/symbols-view/lib/tag-generator.coffee @@ -1,6 +1,7 @@ Point = require 'point' $ = require 'jquery' BufferedProcess = require 'buffered-process' +fs = require 'fs-utils' module.exports = class TagGenerator @@ -17,7 +18,7 @@ class TagGenerator generate: -> deferred = $.Deferred() tags = [] - command = require.resolve('ctags') + command = fs.resolveOnLoadPath('ctags') args = ['--fields=+KS', '-nf', '-', @path] stdout = (lines) => for line in lines.split('\n') From c61bf804a4aaa3735597577efea1e4374c08c416 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:41:27 -0700 Subject: [PATCH 064/281] Add root resource path as last searched path --- native/atom_window_controller.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index bc10d0a76..ad7bcea56 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -69,6 +69,7 @@ NSString *fullPath = [NSString stringWithFormat:@"%@/%@", _resourcePath, [paths objectAtIndex:i]]; [resourcePaths addObject:fullPath]; } + [resourcePaths addObject:_resourcePath]; NSString *nodePath = [resourcePaths componentsJoinedByString:@":"]; setenv("NODE_PATH", [nodePath UTF8String], TRUE); From 4939b636da1c4e8f76d537096e1780ef2ae9c9f7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:48:43 -0700 Subject: [PATCH 065/281] Add missing spec segment to fixture packages path --- native/atom_window_controller.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index ad7bcea56..90e63d877 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -60,7 +60,7 @@ @"node_modules", nil]; NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; if (_runningSpecs) { - NSString *fixturePackagesDirectory = [NSString stringWithFormat:@"%@/fixtures/packages", _resourcePath]; + NSString *fixturePackagesDirectory = [NSString stringWithFormat:@"%@/spec/fixtures/packages", _resourcePath]; [resourcePaths addObject:fixturePackagesDirectory]; } NSString *userPackagesDirectory = [@"~/.atom/packages" stringByStandardizingPath]; From e461c4d94a03563a604fdc3296a2fdb905ca5cc6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 13:49:28 -0700 Subject: [PATCH 066/281] :lipstick: --- native/atom_window_controller.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 90e63d877..5dad7154a 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -59,17 +59,21 @@ @"vendor/packages", @"vendor", @"static", @"themes", @"node_modules", nil]; NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; + if (_runningSpecs) { NSString *fixturePackagesDirectory = [NSString stringWithFormat:@"%@/spec/fixtures/packages", _resourcePath]; [resourcePaths addObject:fixturePackagesDirectory]; } + NSString *userPackagesDirectory = [@"~/.atom/packages" stringByStandardizingPath]; [resourcePaths addObject:userPackagesDirectory]; + for (int i = 0; i < paths.count; i++) { NSString *fullPath = [NSString stringWithFormat:@"%@/%@", _resourcePath, [paths objectAtIndex:i]]; [resourcePaths addObject:fullPath]; } [resourcePaths addObject:_resourcePath]; + NSString *nodePath = [resourcePaths componentsJoinedByString:@":"]; setenv("NODE_PATH", [nodePath UTF8String], TRUE); From d8a3848c1ac22ae04cb93139a55e638f2eabd0f3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 14:40:22 -0700 Subject: [PATCH 067/281] Round top position before comparing to height --- spec/app/pane-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/app/pane-spec.coffee b/spec/app/pane-spec.coffee index 3c62fc797..bbe85e207 100644 --- a/spec/app/pane-spec.coffee +++ b/spec/app/pane-spec.coffee @@ -550,7 +550,7 @@ describe "Pane", -> expect(row2.height()).toBe 2/3 * container.height() expect(pane2.outerWidth()).toBe column1.outerWidth() expect(pane2.outerHeight()).toBe 1/3 * container.height() - expect(pane2.position().top).toBe row2.height() + expect(Math.round(pane2.position().top)).toBe row2.height() expect(row2.children().length).toBe 2 column3 = row2.children(':eq(0)').view() @@ -568,7 +568,7 @@ describe "Pane", -> expect(pane4.outerWidth()).toBe column3.width() expect(pane4.outerHeight()).toBe 1/3 * container.height() expect(pane5.outerWidth()).toBe column3.width() - expect(pane5.position().top).toBe pane4.outerHeight() + expect(Math.round(pane5.position().top)).toBe pane4.outerHeight() expect(pane5.outerHeight()).toBe 1/3 * container.height() pane5.remove() From 051decc08c2d813a9683a4d290c84f679da62d13 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 14:42:24 -0700 Subject: [PATCH 068/281] Use fs.resolveOnLoadPath() instead of require.resolve() --- spec/app/atom-spec.coffee | 5 +- spec/app/directory-spec.coffee | 5 +- spec/app/file-spec.coffee | 2 +- spec/app/git-spec.coffee | 46 +++++++++---------- spec/app/project-spec.coffee | 30 ++++++------ spec/app/root-view-spec.coffee | 2 +- spec/app/tex-buffer-spec.coffee | 2 +- spec/app/text-mate-theme-spec.coffee | 2 +- spec/app/theme-spec.coffee | 2 +- spec/stdlib/fs-utils-spec.coffee | 12 ++--- src/app/atom-package.coffee | 5 +- .../gfm.tmbundle/spec/gfm-spec.coffee | 3 +- .../lib/package-generator-view.coffee | 2 +- .../status-bar/spec/status-bar-spec.coffee | 4 +- .../toml.tmbundle/spec/toml-spec.coffee | 3 +- .../tree-view/spec/tree-view-spec.coffee | 22 ++++----- 16 files changed, 76 insertions(+), 71 deletions(-) diff --git a/spec/app/atom-spec.coffee b/spec/app/atom-spec.coffee index e614a2ff7..29f5dcc4d 100644 --- a/spec/app/atom-spec.coffee +++ b/spec/app/atom-spec.coffee @@ -1,5 +1,6 @@ RootView = require 'root-view' {$$} = require 'space-pen' +fs = require 'fs-utils' describe "the `atom` global", -> beforeEach -> @@ -10,7 +11,7 @@ describe "the `atom` global", -> beforeEach -> extension = require "package-with-module" - stylesheetPath = require.resolve("fixtures/packages/package-with-module/stylesheets/styles.css") + stylesheetPath = fs.resolveOnLoadPath("fixtures/packages/package-with-module/stylesheets/styles.css") afterEach -> removeStylesheet(stylesheetPath) @@ -57,7 +58,7 @@ describe "the `atom` global", -> expect(keymap.bindingsForElement(element3)['ctrl-y']).toBeUndefined() it "loads stylesheets associated with the package", -> - stylesheetPath = require.resolve("fixtures/packages/package-with-module/stylesheets/styles.css") + stylesheetPath = fs.resolveOnLoadPath("fixtures/packages/package-with-module/stylesheets/styles.css") expect(stylesheetElementForId(stylesheetPath).length).toBe 0 window.loadPackage("package-with-module") expect(stylesheetElementForId(stylesheetPath).length).toBe 1 diff --git a/spec/app/directory-spec.coffee b/spec/app/directory-spec.coffee index 3acdca5f9..af0ba5cea 100644 --- a/spec/app/directory-spec.coffee +++ b/spec/app/directory-spec.coffee @@ -5,7 +5,7 @@ describe "Directory", -> directory = null beforeEach -> - directory = new Directory(require.resolve('fixtures')) + directory = new Directory(fs.resolveOnLoadPath('fixtures')) afterEach -> directory.off() @@ -14,7 +14,7 @@ describe "Directory", -> temporaryFilePath = null beforeEach -> - temporaryFilePath = fs.join(require.resolve('fixtures'), 'temporary') + temporaryFilePath = fs.join(fs.resolveOnLoadPath('fixtures'), 'temporary') fs.remove(temporaryFilePath) if fs.exists(temporaryFilePath) afterEach -> @@ -64,4 +64,3 @@ describe "Directory", -> runs -> fs.remove(temporaryFilePath) waits 20 runs -> expect(changeHandler.callCount).toBe 0 - diff --git a/spec/app/file-spec.coffee b/spec/app/file-spec.coffee index 91220218e..21f57833f 100644 --- a/spec/app/file-spec.coffee +++ b/spec/app/file-spec.coffee @@ -5,7 +5,7 @@ describe 'File', -> [path, file] = [] beforeEach -> - path = fs.join(require.resolve('fixtures'), "atom-file-test.txt") # Don't put in /tmp because /tmp symlinks to /private/tmp and screws up the rename test + path = fs.join(fs.resolveOnLoadPath('fixtures'), "atom-file-test.txt") # Don't put in /tmp because /tmp symlinks to /private/tmp and screws up the rename test fs.remove(path) if fs.exists(path) fs.write(path, "this is old!") file = new File(path) diff --git a/spec/app/git-spec.coffee b/spec/app/git-spec.coffee index e37c18192..921d88cc5 100644 --- a/spec/app/git-spec.coffee +++ b/spec/app/git-spec.coffee @@ -21,39 +21,39 @@ describe "Git", -> describe ".getPath()", -> it "returns the repository path for a .git directory path", -> - repo = new Git(require.resolve('fixtures/git/master.git/HEAD')) - expect(repo.getPath()).toBe require.resolve('fixtures/git/master.git') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/master.git/HEAD')) + expect(repo.getPath()).toBe fs.resolveOnLoadPath('fixtures/git/master.git') it "returns the repository path for a repository path", -> - repo = new Git(require.resolve('fixtures/git/master.git')) - expect(repo.getPath()).toBe require.resolve('fixtures/git/master.git') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/master.git')) + expect(repo.getPath()).toBe fs.resolveOnLoadPath('fixtures/git/master.git') describe ".getHead()", -> it "returns a branch name for a non-empty repository", -> - repo = new Git(require.resolve('fixtures/git/master.git')) + repo = new Git(fs.resolveOnLoadPath('fixtures/git/master.git')) expect(repo.getHead()).toBe 'refs/heads/master' describe ".getShortHead()", -> it "returns a branch name for a non-empty repository", -> - repo = new Git(require.resolve('fixtures/git/master.git')) + repo = new Git(fs.resolveOnLoadPath('fixtures/git/master.git')) expect(repo.getShortHead()).toBe 'master' describe ".isPathIgnored(path)", -> it "returns true for an ignored path", -> - repo = new Git(require.resolve('fixtures/git/ignore.git')) + repo = new Git(fs.resolveOnLoadPath('fixtures/git/ignore.git')) expect(repo.isPathIgnored('a.txt')).toBeTruthy() it "returns false for a non-ignored path", -> - repo = new Git(require.resolve('fixtures/git/ignore.git')) + repo = new Git(fs.resolveOnLoadPath('fixtures/git/ignore.git')) expect(repo.isPathIgnored('b.txt')).toBeFalsy() describe ".isPathModified(path)", -> [repo, path, newPath, originalPathText] = [] beforeEach -> - repo = new Git(require.resolve('fixtures/git/working-dir')) - path = require.resolve('fixtures/git/working-dir/file.txt') - newPath = fs.join(require.resolve('fixtures/git/working-dir'), 'new-path.txt') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/working-dir')) + path = fs.resolveOnLoadPath('fixtures/git/working-dir/file.txt') + newPath = fs.join(fs.resolveOnLoadPath('fixtures/git/working-dir'), 'new-path.txt') originalPathText = fs.read(path) afterEach -> @@ -79,9 +79,9 @@ describe "Git", -> [path, newPath] = [] beforeEach -> - repo = new Git(require.resolve('fixtures/git/working-dir')) - path = require.resolve('fixtures/git/working-dir/file.txt') - newPath = fs.join(require.resolve('fixtures/git/working-dir'), 'new-path.txt') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/working-dir')) + path = fs.resolveOnLoadPath('fixtures/git/working-dir/file.txt') + newPath = fs.join(fs.resolveOnLoadPath('fixtures/git/working-dir'), 'new-path.txt') fs.write(newPath, "i'm new here") afterEach -> @@ -98,10 +98,10 @@ describe "Git", -> [path1, path2, originalPath1Text, originalPath2Text] = [] beforeEach -> - repo = new Git(require.resolve('fixtures/git/working-dir')) - path1 = require.resolve('fixtures/git/working-dir/file.txt') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/working-dir')) + path1 = fs.resolveOnLoadPath('fixtures/git/working-dir/file.txt') originalPath1Text = fs.read(path1) - path2 = require.resolve('fixtures/git/working-dir/other.txt') + path2 = fs.resolveOnLoadPath('fixtures/git/working-dir/other.txt') originalPath2Text = fs.read(path2) afterEach -> @@ -141,7 +141,7 @@ describe "Git", -> describe ".destroy()", -> it "throws an exception when any method is called after it is called", -> - repo = new Git(require.resolve('fixtures/git/master.git/HEAD')) + repo = new Git(fs.resolveOnLoadPath('fixtures/git/master.git/HEAD')) repo.destroy() expect(-> repo.getHead()).toThrow() @@ -149,8 +149,8 @@ describe "Git", -> [path, originalPathText] = [] beforeEach -> - repo = new Git(require.resolve('fixtures/git/working-dir')) - path = require.resolve('fixtures/git/working-dir/file.txt') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/working-dir')) + path = fs.resolveOnLoadPath('fixtures/git/working-dir/file.txt') originalPathText = fs.read(path) afterEach -> @@ -165,8 +165,8 @@ describe "Git", -> [path, originalPathText] = [] beforeEach -> - repo = new Git(require.resolve('fixtures/git/working-dir')) - path = require.resolve('fixtures/git/working-dir/file.txt') + repo = new Git(fs.resolveOnLoadPath('fixtures/git/working-dir')) + path = fs.resolveOnLoadPath('fixtures/git/working-dir/file.txt') originalPathText = fs.read(path) afterEach -> @@ -188,7 +188,7 @@ describe "Git", -> [newPath, modifiedPath, cleanPath, originalModifiedPathText] = [] beforeEach -> - repo = new Git(require.resolve('fixtures/git/working-dir')) + repo = new Git(fs.resolveOnLoadPath('fixtures/git/working-dir')) modifiedPath = project.resolve('git/working-dir/file.txt') originalModifiedPathText = fs.read(modifiedPath) newPath = project.resolve('git/working-dir/untracked.txt') diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index 3b277f778..78ca0db59 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -34,7 +34,7 @@ describe "Project", -> describe ".buildEditSession(path)", -> [absolutePath, newBufferHandler, newEditSessionHandler] = [] beforeEach -> - absolutePath = require.resolve('fixtures/dir/a') + absolutePath = fs.resolveOnLoadPath('fixtures/dir/a') newBufferHandler = jasmine.createSpy('newBufferHandler') project.on 'buffer-created', newBufferHandler newEditSessionHandler = jasmine.createSpy('newEditSessionHandler') @@ -86,14 +86,14 @@ describe "Project", -> describe ".resolve(path)", -> it "returns an absolute path based on the project's root", -> - absolutePath = require.resolve('fixtures/dir/a') + absolutePath = fs.resolveOnLoadPath('fixtures/dir/a') expect(project.resolve('a')).toBe absolutePath expect(project.resolve(absolutePath + '/../a')).toBe absolutePath expect(project.resolve('a/../a')).toBe absolutePath describe ".relativize(path)", -> it "returns an relative path based on the project's root", -> - absolutePath = require.resolve('fixtures/dir') + absolutePath = fs.resolveOnLoadPath('fixtures/dir') expect(project.relativize(fs.join(absolutePath, "b"))).toBe "b" expect(project.relativize(fs.join(absolutePath, "b/file.coffee"))).toBe "b/file.coffee" expect(project.relativize(fs.join(absolutePath, "file.coffee"))).toBe "file.coffee" @@ -101,15 +101,15 @@ describe "Project", -> describe ".setPath(path)", -> describe "when path is a file", -> it "sets its path to the files parent directory and updates the root directory", -> - project.setPath(require.resolve('fixtures/dir/a')) - expect(project.getPath()).toEqual require.resolve('fixtures/dir') - expect(project.getRootDirectory().path).toEqual require.resolve('fixtures/dir') + project.setPath(fs.resolveOnLoadPath('fixtures/dir/a')) + expect(project.getPath()).toEqual fs.resolveOnLoadPath('fixtures/dir') + expect(project.getRootDirectory().path).toEqual fs.resolveOnLoadPath('fixtures/dir') describe "when path is a directory", -> it "sets its path to the directory and updates the root directory", -> - project.setPath(require.resolve('fixtures/dir/a-dir')) - expect(project.getPath()).toEqual require.resolve('fixtures/dir/a-dir') - expect(project.getRootDirectory().path).toEqual require.resolve('fixtures/dir/a-dir') + project.setPath(fs.resolveOnLoadPath('fixtures/dir/a-dir')) + expect(project.getPath()).toEqual fs.resolveOnLoadPath('fixtures/dir/a-dir') + expect(project.getRootDirectory().path).toEqual fs.resolveOnLoadPath('fixtures/dir/a-dir') describe "when path is null", -> it "sets its path and root directory to null", -> @@ -140,19 +140,19 @@ describe "Project", -> describe "when config.core.hideGitIgnoredFiles is true", -> it "ignores files that are present in .gitignore if the project is a git repo", -> config.set "core.hideGitIgnoredFiles", true - project.setPath(require.resolve('fixtures/git/working-dir')) + project.setPath(fs.resolveOnLoadPath('fixtures/git/working-dir')) paths = null waitsForPromise -> project.getFilePaths().done (foundPaths) -> paths = foundPaths - runs -> + runs -> expect(paths).not.toContain('ignored.txt') describe "ignored file name", -> ignoredFile = null beforeEach -> - ignoredFile = fs.join(require.resolve('fixtures/dir'), 'ignored.txt') + ignoredFile = fs.join(fs.resolveOnLoadPath('fixtures/dir'), 'ignored.txt') fs.write(ignoredFile, "") afterEach -> @@ -172,7 +172,7 @@ describe "Project", -> ignoredFile = null beforeEach -> - ignoredFile = fs.join(require.resolve('fixtures/dir'), 'ignored/ignored.txt') + ignoredFile = fs.join(fs.resolveOnLoadPath('fixtures/dir'), 'ignored/ignored.txt') fs.write(ignoredFile, "") afterEach -> @@ -222,7 +222,7 @@ describe "Project", -> range: [[2, 6], [2, 11]] it "works on evil filenames", -> - project.setPath(require.resolve('fixtures/evil-files')) + project.setPath(fs.resolveOnLoadPath('fixtures/evil-files')) paths = [] matches = [] waitsForPromise -> @@ -246,7 +246,7 @@ describe "Project", -> project.scan /a+/, iterator stdout = BufferedProcess.prototype.bufferStream.argsForCall[0][1] - stdout ":#{require.resolve('fixtures/dir/a')}\n" + stdout ":#{fs.resolveOnLoadPath('fixtures/dir/a')}\n" stdout "1;0 3:aaa bbb\n2;3 2:cc aa cc\n" expect(iterator.argsForCall[0][0]).toEqual diff --git a/spec/app/root-view-spec.coffee b/spec/app/root-view-spec.coffee index 7a48b84ae..b1f28e9b5 100644 --- a/spec/app/root-view-spec.coffee +++ b/spec/app/root-view-spec.coffee @@ -223,7 +223,7 @@ describe "RootView", -> it "creates an edit session for the given path as an item on a new pane, and focuses the pane", -> editSession = rootView.open('b') expect(rootView.getActivePane().activeItem).toBe editSession - expect(editSession.getPath()).toBe require.resolve('fixtures/dir/b') + expect(editSession.getPath()).toBe fs.resolveOnLoadPath('fixtures/dir/b') expect(rootView.getActivePane().focus).toHaveBeenCalled() describe "when the changeFocus option is false", -> diff --git a/spec/app/tex-buffer-spec.coffee b/spec/app/tex-buffer-spec.coffee index d4ecbe1bf..63d50b797 100644 --- a/spec/app/tex-buffer-spec.coffee +++ b/spec/app/tex-buffer-spec.coffee @@ -46,7 +46,7 @@ describe 'Buffer', -> [path, newPath, bufferToChange, eventHandler] = [] beforeEach -> - path = fs.join(require.resolve("fixtures/"), "atom-manipulate-me") + path = fs.join(fs.resolveOnLoadPath("fixtures"), "atom-manipulate-me") newPath = "#{path}-i-moved" fs.write(path, "") bufferToChange = new Buffer(path) diff --git a/spec/app/text-mate-theme-spec.coffee b/spec/app/text-mate-theme-spec.coffee index ff6c5cb16..16588606c 100644 --- a/spec/app/text-mate-theme-spec.coffee +++ b/spec/app/text-mate-theme-spec.coffee @@ -7,7 +7,7 @@ describe "TextMateTheme", -> [theme, themePath] = [] beforeEach -> - themePath = require.resolve(fs.join('fixtures', 'test.tmTheme')) + themePath = fs.resolveOnLoadPath(fs.join('fixtures', 'test.tmTheme')) theme = Theme.load(themePath) afterEach -> diff --git a/spec/app/theme-spec.coffee b/spec/app/theme-spec.coffee index c5b588f0b..abaaf977f 100644 --- a/spec/app/theme-spec.coffee +++ b/spec/app/theme-spec.coffee @@ -15,7 +15,7 @@ describe "@load(name)", -> it "applies the theme's stylesheet to the current window", -> expect($(".editor").css("background-color")).not.toBe("rgb(20, 20, 20)") - themePath = require.resolve(fs.join('fixtures', 'test.tmTheme')) + themePath = fs.resolveOnLoadPath(fs.join('fixtures', 'test.tmTheme')) theme = Theme.load(themePath) expect($(".editor").css("background-color")).toBe("rgb(20, 20, 20)") diff --git a/spec/stdlib/fs-utils-spec.coffee b/spec/stdlib/fs-utils-spec.coffee index 85a52a903..4a4330069 100644 --- a/spec/stdlib/fs-utils-spec.coffee +++ b/spec/stdlib/fs-utils-spec.coffee @@ -9,7 +9,7 @@ describe "fs", -> expect(-> fs.read(require.resolve("fixtures/binary-file.png"))).not.toThrow() describe ".isFile(path)", -> - fixturesDir = require.resolve('fixtures') + fixturesDir = fs.resolveOnLoadPath('fixtures') it "returns true with a file path", -> expect(fs.isFile(fs.join(fixturesDir, 'sample.js'))).toBe true @@ -24,7 +24,7 @@ describe "fs", -> describe ".directory(path)", -> describe "when called with a file path", -> it "returns the path to the directory", -> - expect(fs.directory(require.resolve('fixtures/dir/a'))).toBe require.resolve('fixtures/dir') + expect(fs.directory(fs.resolveOnLoadPath('fixtures/dir/a'))).toBe fs.resolveOnLoadPath('fixtures/dir') describe "when called with a directory path", -> it "return the path it was given", -> @@ -42,10 +42,10 @@ describe "fs", -> describe ".exists(path)", -> it "returns true when path exsits", -> - expect(fs.exists(require.resolve('fixtures'))).toBe true + expect(fs.exists(fs.resolveOnLoadPath('fixtures'))).toBe true it "returns false when path doesn't exsit", -> - expect(fs.exists(require.resolve("fixtures") + "/-nope-does-not-exist")).toBe false + expect(fs.exists(fs.resolveOnLoadPath("fixtures") + "/-nope-does-not-exist")).toBe false expect(fs.exists("")).toBe false expect(fs.exists(null)).toBe false @@ -81,7 +81,7 @@ describe "fs", -> fixturesDir = null beforeEach -> - fixturesDir = require.resolve('fixtures') + fixturesDir = fs.resolveOnLoadPath('fixtures') it "calls fn for every path in the tree at the given path", -> paths = [] @@ -124,4 +124,4 @@ describe "fs", -> describe ".list(path, extensions)", -> it "returns the paths with the specified extensions", -> path = require.resolve('fixtures/css.css') - expect(fs.list(require.resolve('fixtures'), ['.css'])).toEqual [path] + expect(fs.list(fs.resolveOnLoadPath('fixtures'), ['.css'])).toEqual [path] diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index b88d7d0a0..d528acde1 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -62,7 +62,10 @@ class AtomPackage extends Package activatePackageMain: -> mainPath = @path mainPath = fs.join(mainPath, @metadata.main) if @metadata.main - mainPath = require.resolve(mainPath) + try + mainPath = require.resolve(mainPath) + catch e + return if fs.isFile(mainPath) @packageMain = require(mainPath) config.setDefaults(@name, @packageMain.configDefaults) diff --git a/src/packages/gfm.tmbundle/spec/gfm-spec.coffee b/src/packages/gfm.tmbundle/spec/gfm-spec.coffee index 97bc98300..a31b04360 100644 --- a/src/packages/gfm.tmbundle/spec/gfm-spec.coffee +++ b/src/packages/gfm.tmbundle/spec/gfm-spec.coffee @@ -1,3 +1,4 @@ +fs = require 'fs-utils' TextMatePackage = require 'text-mate-package' describe "GitHub Flavored Markdown grammar", -> @@ -5,7 +6,7 @@ describe "GitHub Flavored Markdown grammar", -> beforeEach -> spyOn(syntax, "addGrammar") - pack = new TextMatePackage(require.resolve("gfm.tmbundle")) + pack = new TextMatePackage(fs.resolveOnLoadPath("gfm.tmbundle")) pack.load() grammar = pack.grammars[0] diff --git a/src/packages/package-generator/lib/package-generator-view.coffee b/src/packages/package-generator/lib/package-generator-view.coffee index b8f123ecd..1e6f957e9 100644 --- a/src/packages/package-generator/lib/package-generator-view.coffee +++ b/src/packages/package-generator/lib/package-generator-view.coffee @@ -56,7 +56,7 @@ class PackageGeneratorView extends View true createPackageFiles: -> - templatePath = require.resolve(fs.join("package-generator", "template")) + templatePath = fs.resolveOnLoadPath(fs.join("package-generator", "template")) packageName = fs.base(@getPackagePath()) for path in fs.listTree(templatePath) diff --git a/src/packages/status-bar/spec/status-bar-spec.coffee b/src/packages/status-bar/spec/status-bar-spec.coffee index 92ee548ee..006885331 100644 --- a/src/packages/status-bar/spec/status-bar-spec.coffee +++ b/src/packages/status-bar/spec/status-bar-spec.coffee @@ -112,7 +112,7 @@ describe "StatusBar", -> it "displays the current branch for files in repositories", -> path = require.resolve('fixtures/git/master.git/HEAD') - project.setPath(require.resolve('fixtures/git/master.git')) + project.setPath(fs.resolveOnLoadPath('fixtures/git/master.git')) rootView.open(path) expect(statusBar.branchArea).toBeVisible() expect(statusBar.branchLabel.text()).toBe 'master' @@ -128,7 +128,7 @@ describe "StatusBar", -> beforeEach -> path = require.resolve('fixtures/git/working-dir/file.txt') - newPath = fs.join(require.resolve('fixtures/git/working-dir'), 'new.txt') + newPath = fs.join(fs.resolveOnLoadPath('fixtures/git/working-dir'), 'new.txt') fs.write(newPath, "I'm new here") git.getPathStatus(path) git.getPathStatus(newPath) diff --git a/src/packages/toml.tmbundle/spec/toml-spec.coffee b/src/packages/toml.tmbundle/spec/toml-spec.coffee index 576879912..41eaeec55 100644 --- a/src/packages/toml.tmbundle/spec/toml-spec.coffee +++ b/src/packages/toml.tmbundle/spec/toml-spec.coffee @@ -1,3 +1,4 @@ +fs = require 'fs-utils' TextMatePackage = require 'text-mate-package' describe "TOML grammar", -> @@ -5,7 +6,7 @@ describe "TOML grammar", -> beforeEach -> spyOn(syntax, "addGrammar") - pack = new TextMatePackage(require.resolve("toml.tmbundle")) + pack = new TextMatePackage(fs.resolveOnLoadPath("toml.tmbundle")) pack.load() grammar = pack.grammars[0] diff --git a/src/packages/tree-view/spec/tree-view-spec.coffee b/src/packages/tree-view/spec/tree-view-spec.coffee index 7ea695d23..2b91c9630 100644 --- a/src/packages/tree-view/spec/tree-view-spec.coffee +++ b/src/packages/tree-view/spec/tree-view-spec.coffee @@ -67,7 +67,7 @@ describe "TreeView", -> it "creates a root directory view but does not attach to the root view", -> rootView.getActivePaneItem().saveAs("/tmp/test.txt") expect(treeView.hasParent()).toBeFalsy() - expect(treeView.root.getPath()).toBe require.resolve('/tmp') + expect(treeView.root.getPath()).toBe '/tmp' expect(treeView.root.parent()).toMatchSelector(".tree-view") describe "when the root view is opened to a file path", -> @@ -266,20 +266,20 @@ describe "TreeView", -> sampleJs.trigger clickEvent(originalEvent: { detail: 1 }) expect(sampleJs).toHaveClass 'selected' - expect(rootView.getActiveView().getPath()).toBe require.resolve('fixtures/tree-view/tree-view.js') + expect(rootView.getActiveView().getPath()).toBe fs.resolveOnLoadPath('fixtures/tree-view/tree-view.js') expect(rootView.getActiveView().isFocused).toBeFalsy() sampleTxt.trigger clickEvent(originalEvent: { detail: 1 }) expect(sampleTxt).toHaveClass 'selected' expect(treeView.find('.selected').length).toBe 1 - expect(rootView.getActiveView().getPath()).toBe require.resolve('fixtures/tree-view/tree-view.txt') + expect(rootView.getActiveView().getPath()).toBe fs.resolveOnLoadPath('fixtures/tree-view/tree-view.txt') expect(rootView.getActiveView().isFocused).toBeFalsy() describe "when a file is double-clicked", -> it "selects the file and opens it in the active editor on the first click, then changes focus to the active editor on the second", -> sampleJs.trigger clickEvent(originalEvent: { detail: 1 }) expect(sampleJs).toHaveClass 'selected' - expect(rootView.getActiveView().getPath()).toBe require.resolve('fixtures/tree-view/tree-view.js') + expect(rootView.getActiveView().getPath()).toBe fs.resolveOnLoadPath('fixtures/tree-view/tree-view.js') expect(rootView.getActiveView().isFocused).toBeFalsy() sampleJs.trigger clickEvent(originalEvent: { detail: 2 }) @@ -304,7 +304,7 @@ describe "TreeView", -> describe "when a new file is opened in the active editor", -> it "selects the file in the tree view if the file's entry visible", -> sampleJs.click() - rootView.open(require.resolve('fixtures/tree-view/tree-view.txt')) + rootView.open(fs.resolveOnLoadPath('fixtures/tree-view/tree-view.txt')) expect(sampleTxt).toHaveClass 'selected' expect(treeView.find('.selected').length).toBe 1 @@ -568,7 +568,7 @@ describe "TreeView", -> it "opens the file in the editor and focuses it", -> treeView.root.find('.file:contains(tree-view.js)').click() treeView.root.trigger 'tree-view:open-selected-entry' - expect(rootView.getActiveView().getPath()).toBe require.resolve('fixtures/tree-view/tree-view.js') + expect(rootView.getActiveView().getPath()).toBe fs.resolveOnLoadPath('fixtures/tree-view/tree-view.js') expect(rootView.getActiveView().isFocused).toBeTruthy() describe "when a directory is selected", -> @@ -875,7 +875,7 @@ describe "TreeView", -> temporaryFilePath = null beforeEach -> - temporaryFilePath = fs.join(require.resolve('fixtures/tree-view'), 'temporary') + temporaryFilePath = fs.join(fs.resolveOnLoadPath('fixtures/tree-view'), 'temporary') if fs.exists(temporaryFilePath) fs.remove(temporaryFilePath) waits(20) @@ -907,7 +907,7 @@ describe "TreeView", -> [ignoreFile] = [] beforeEach -> - ignoreFile = fs.join(require.resolve('fixtures/tree-view'), '.gitignore') + ignoreFile = fs.join(fs.resolveOnLoadPath('fixtures/tree-view'), '.gitignore') fs.write(ignoreFile, 'tree-view.js') config.set "core.hideGitIgnoredFiles", false @@ -930,15 +930,15 @@ describe "TreeView", -> beforeEach -> config.set "core.hideGitIgnoredFiles", false - ignoreFile = fs.join(require.resolve('fixtures/tree-view'), '.gitignore') + ignoreFile = fs.join(fs.resolveOnLoadPath('fixtures/tree-view'), '.gitignore') fs.write(ignoreFile, 'tree-view.js') git.getPathStatus(ignoreFile) - newFile = fs.join(require.resolve('fixtures/tree-view/dir2'), 'new2') + newFile = fs.join(fs.resolveOnLoadPath('fixtures/tree-view/dir2'), 'new2') fs.write(newFile, '') git.getPathStatus(newFile) - modifiedFile = fs.join(require.resolve('fixtures/tree-view/dir1'), 'file1') + modifiedFile = fs.join(fs.resolveOnLoadPath('fixtures/tree-view/dir1'), 'file1') originalFileContent = fs.read(modifiedFile) fs.write modifiedFile, 'ch ch changes' git.getPathStatus(modifiedFile) From aaf0d48edf86ddc9626ba7d02252733a47f9a7bc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 14:59:21 -0700 Subject: [PATCH 069/281] Use coffee-cache module --- package.json | 3 ++- static/index.html | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e6f588686..e721f124d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "mkdirp": "0.3.5", "git-utils": "0.3.0", "underscore": "1.4.4", - "d3": "3.0.8" + "d3": "3.0.8", + "coffee-cache": "0.1.0" }, "scripts": { diff --git a/static/index.html b/static/index.html index eb0b9cf59..9ef2362ab 100644 --- a/static/index.html +++ b/static/index.html @@ -17,6 +17,7 @@ window.onload = function() { try { require('coffee-script'); + require('coffee-cache').setCacheDir('/tmp/atom-coffee-cache'); if (bootstrapScript) require(bootstrapScript); } catch (error) { From 879f4e92a6e7e66aedd2c80bf6e335cb9d848788 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Tue, 12 Mar 2013 14:59:42 -0700 Subject: [PATCH 070/281] Remove require.coffee --- src/stdlib/require.coffee | 186 -------------------------------------- 1 file changed, 186 deletions(-) delete mode 100644 src/stdlib/require.coffee diff --git a/src/stdlib/require.coffee b/src/stdlib/require.coffee deleted file mode 100644 index 4d7f67690..000000000 --- a/src/stdlib/require.coffee +++ /dev/null @@ -1,186 +0,0 @@ -fs = require 'fs-utils' - -paths = [ - "#{window.resourcePath}/spec" - "#{window.resourcePath}/benchmark" - "#{window.resourcePath}/src/stdlib" - "#{window.resourcePath}/src/app" - "#{window.resourcePath}/src/packages" - "#{window.resourcePath}/src" - "#{window.resourcePath}/vendor/packages" - "#{window.resourcePath}/vendor" - "#{window.resourcePath}/static" - "#{window.resourcePath}/themes" - "#{window.resourcePath}" -] - -window.__filename = null - -nakedLoad = (file) -> - file = resolve file - code = __read file - window.eval(code + "\n//@ sourceURL=" + file) - -require = (path, cb) -> - return cb require path if cb? - - unless file = resolve(path) - throw new Error("Require can't find file at path '#{path}'") - - ext = file.split('.').pop() - - if __moduleExists file - if not __modules.loaded[file.toLowerCase()]? - console.warn "Circular require: #{window.__filename} required #{file}" - return __modules[file] - else if __modules.loaded[file.toLowerCase()] - console.warn "Multiple requires (different cases) for #{file}" - - [ previousFilename, window.__filename ] = [ window.__filename, file ] - __modules[file] = {} # Fix for circular references - __modules[file] = (exts[ext] or (file) -> __read file) file - window.__filename = previousFilename - __modules[file] - -define = (cb) -> - __defines.push -> - exports = __modules[window.__filename] or {} - module = exports: exports - cb.call exports, require, exports, module - __modules.loaded[window.__filename.toLowerCase()] = true - module.exports or exports - -exts = - js: (file, code) -> - code or= __read file - eval("define(function(require, exports, module) { 'use strict';#{code}})\n//@ sourceURL=#{file}") - __defines.pop()?.call() - coffee: (file) -> - cacheFilePath = getCacheFilePath(file) - if __exists(cacheFilePath) - compiled = __read(cacheFilePath) - writeToCache = false - else - CoffeeScript = require 'coffee-script' - compiled = CoffeeScript.compile(__read(file), filename: file) - writeToCache = true - - evaluated = exts.js(file, compiled) - createCacheDirectory() - fs.writeFileSync(cacheFilePath, compiled) if writeToCache - evaluated - -getPath = (path) -> - path = resolve(path) - return path unless path.split('.').pop() is 'coffee' - - cacheFilePath = getCacheFilePath(path) - unless __exists(cacheFilePath) - CoffeeScript = require 'coffee-script' - compiled = CoffeeScript.compile(__read(path), filename: path) - createCacheDirectory() - fs.writeFileSync(cacheFilePath, compiled) - cacheFilePath - -createCacheDirectory = -> - fs.mkdirSync('/tmp/atom-compiled-scripts') unless __exists('/tmp/atom-compiled-scripts') - -getCacheFilePath = (path) -> - "/tmp/atom-compiled-scripts/#{$native.md5ForPath(path)}" - -resolve = (name, {verifyExistence}={}) -> - verifyExistence ?= true - file = name - if /!/.test file - file = file.split('!').pop() - - if file[0..1] is './' - prefix = window.__filename.split('/')[0..-2].join '/' - file = file.replace './', "#{prefix}/" - - if file[0..2] is '../' - prefix = window.__filename.split('/')[0..-3].join '/' - file = file.replace '../', "#{prefix}/" - - if file[0] isnt '/' - moduleAlreadyLoaded = paths.some (path) -> - if __moduleExists "#{path}/#{file}" - file = "#{path}/#{file}" - else if __moduleExists "#{path}/#{file}.js" - file = "#{path}/#{file}.js" - else if expanded = __moduleExpand "#{path}/#{file}" - file = expanded - - if not moduleAlreadyLoaded - hasExtension = /\.(.+)$/.test(file) - paths.some (path) -> - fileExists = hasExtension and __exists "#{path}/#{file}" - jsFileExists = not hasExtension and __exists "#{path}/#{file}.js" - - if jsFileExists - file = "#{path}/#{file}.js" - else if fileExists - file = "#{path}/#{file}" - else if expanded = __expand "#{path}/#{file}" - file = expanded - else - file = __expand(file) or file - - if file[0] == '/' - file - else - console.warn("Failed to resolve '#{name}'") if verifyExistence - null - -__moduleExists = (path) -> - __modules[path]? - -__moduleExpand = (path) -> - return path if __moduleExists path - for ext, handler of exts - return "#{path}.#{ext}" if __moduleExists "#{path}.#{ext}" - return "#{path}/index.#{ext}" if __moduleExists "#{path}/index.#{ext}" - null - -__expand = (path) -> - modulePath = __moduleExpand path - return modulePath if modulePath - - return path if __isFile path - for ext, handler of exts - return "#{path}.#{ext}" if __exists "#{path}.#{ext}" - return "#{path}/index.#{ext}" if __exists "#{path}/index.#{ext}" - - return path if __exists path - null - -__exists = (path) -> - fs.existsSync path - -__isFile = (path) -> - __exists(path) && fs.statSync(path).isFile() - -__read = (path) -> - try - fs.readFileSync(path, 'utf8') - catch e - console.error "Failed to read `#{path}`" - throw e - -__modules = { loaded : {} } -__defines = [] - -this.require = require -this.nakedLoad = nakedLoad -this.define = define - -this.require.paths = paths -this.require.getPath = getPath -this.require.exts = exts - -this.require.resolve = resolve -this.require.nameToUrl = (path) -> "#{path}.js" -this.require.__modules = __modules - -# issue #17 -this.require.noWorker = true From e091f48b812ecdd6b91a0284c3d3dd955633b13e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 17:33:21 -0700 Subject: [PATCH 071/281] Only search in benchmark and spec when running specs --- native/atom_window_controller.mm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 5dad7154a..72ad79d9d 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -54,13 +54,22 @@ _resourcePath = [_resourcePath stringByStandardizingPath]; [_resourcePath retain]; - NSArray *paths = [NSArray arrayWithObjects:@"spec", @"benchmark", - @"src/stdlib", @"src/app", @"src/packages", @"src", - @"vendor/packages", @"vendor", @"static", @"themes", - @"node_modules", nil]; + NSMutableArray *paths = [NSMutableArray arrayWithObjects: + @"src/stdlib", + @"src/app", + @"src/packages", + @"src", + @"vendor/packages", + @"vendor", + @"static", + @"themes", + @"node_modules", + nil]; NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; if (_runningSpecs) { + [paths insertObject:@"benchmark" atIndex:0]; + [paths insertObject:@"spec" atIndex:0]; NSString *fixturePackagesDirectory = [NSString stringWithFormat:@"%@/spec/fixtures/packages", _resourcePath]; [resourcePaths addObject:fixturePackagesDirectory]; } From 3a3f4e2ce6e1a1ca1f90214a641f94643c27468e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 17:41:18 -0700 Subject: [PATCH 072/281] Use pegjs node module --- package.json | 3 +- vendor/pegjs.js | 4528 ----------------------------------------------- 2 files changed, 2 insertions(+), 4529 deletions(-) delete mode 100644 vendor/pegjs.js diff --git a/package.json b/package.json index e721f124d..5274f8000 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "git-utils": "0.3.0", "underscore": "1.4.4", "d3": "3.0.8", - "coffee-cache": "0.1.0" + "coffee-cache": "0.1.0", + "pegjs": "0.7.0" }, "scripts": { diff --git a/vendor/pegjs.js b/vendor/pegjs.js deleted file mode 100644 index 42e67b359..000000000 --- a/vendor/pegjs.js +++ /dev/null @@ -1,4528 +0,0 @@ -/* - * PEG.js 0.7.0 - * - * http://pegjs.majda.cz/ - * - * Copyright (c) 2010-2012 David Majda - * Licensend under the MIT license. - */ -var PEG = (function(undefined) { - -var PEG = { - /* PEG.js version (uses semantic versioning). */ - VERSION: "0.7.0", - - /* - * Generates a parser from a specified grammar and returns it. - * - * The grammar must be a string in the format described by the metagramar in - * the parser.pegjs file. - * - * Throws |PEG.parser.SyntaxError| if the grammar contains a syntax error or - * |PEG.GrammarError| if it contains a semantic error. Note that not all - * errors are detected during the generation and some may protrude to the - * generated parser and cause its malfunction. - */ - buildParser: function(grammar, options) { - return PEG.compiler.compile(PEG.parser.parse(grammar), options); - } -}; - -/* Thrown when the grammar contains an error. */ - -PEG.GrammarError = function(message) { - this.name = "PEG.GrammarError"; - this.message = message; -}; - -PEG.GrammarError.prototype = Error.prototype; - -/* Like Python's |range|, but without |step|. */ -function range(start, stop) { - if (stop === undefined) { - stop = start; - start = 0; - } - - var result = new Array(Math.max(0, stop - start)); - for (var i = 0, j = start; j < stop; i++, j++) { - result[i] = j; - } - return result; -} - -function find(array, callback) { - var length = array.length; - for (var i = 0; i < length; i++) { - if (callback(array[i])) { - return array[i]; - } - } -} - -function contains(array, value) { - /* - * Stupid IE does not have Array.prototype.indexOf, otherwise this function - * would be a one-liner. - */ - var length = array.length; - for (var i = 0; i < length; i++) { - if (array[i] === value) { - return true; - } - } - return false; -} - -function each(array, callback) { - var length = array.length; - for (var i = 0; i < length; i++) { - callback(array[i], i); - } -} - -function map(array, callback) { - var result = []; - var length = array.length; - for (var i = 0; i < length; i++) { - result[i] = callback(array[i], i); - } - return result; -} - -function pluck(array, key) { - return map(array, function (e) { return e[key]; }); -} - -function keys(object) { - var result = []; - for (var key in object) { - result.push(key); - } - return result; -} - -function values(object) { - var result = []; - for (var key in object) { - result.push(object[key]); - } - return result; -} - -/* - * Returns a string padded on the left to a desired length with a character. - * - * The code needs to be in sync with the code template in the compilation - * function for "action" nodes. - */ -function padLeft(input, padding, length) { - var result = input; - - var padLength = length - input.length; - for (var i = 0; i < padLength; i++) { - result = padding + result; - } - - return result; -} - -/* - * Returns an escape sequence for given character. Uses \x for characters <= - * 0xFF to save space, \u for the rest. - * - * The code needs to be in sync with the code template in the compilation - * function for "action" nodes. - */ -function escape(ch) { - var charCode = ch.charCodeAt(0); - var escapeChar; - var length; - - if (charCode <= 0xFF) { - escapeChar = 'x'; - length = 2; - } else { - escapeChar = 'u'; - length = 4; - } - - return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); -} - -/* - * Surrounds the string with quotes and escapes characters inside so that the - * result is a valid JavaScript string. - * - * The code needs to be in sync with the code template in the compilation - * function for "action" nodes. - */ -function quote(s) { - /* - * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string - * literal except for the closing quote character, backslash, carriage return, - * line separator, paragraph separator, and line feed. Any character may - * appear in the form of an escape sequence. - * - * For portability, we also escape escape all control and non-ASCII - * characters. Note that "\0" and "\v" escape sequences are not used because - * JSHint does not like the first and IE the second. - */ - return '"' + s - .replace(/\\/g, '\\\\') // backslash - .replace(/"/g, '\\"') // closing quote character - .replace(/\x08/g, '\\b') // backspace - .replace(/\t/g, '\\t') // horizontal tab - .replace(/\n/g, '\\n') // line feed - .replace(/\f/g, '\\f') // form feed - .replace(/\r/g, '\\r') // carriage return - .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) - + '"'; -} - -/* - * Escapes characters inside the string so that it can be used as a list of - * characters in a character class of a regular expression. - */ -function quoteForRegexpClass(s) { - /* - * Based on ECMA-262, 5th ed., 7.8.5 & 15.10.1. - * - * For portability, we also escape escape all control and non-ASCII - * characters. - */ - return s - .replace(/\\/g, '\\\\') // backslash - .replace(/\//g, '\\/') // closing slash - .replace(/\]/g, '\\]') // closing bracket - .replace(/-/g, '\\-') // dash - .replace(/\0/g, '\\0') // null - .replace(/\t/g, '\\t') // horizontal tab - .replace(/\n/g, '\\n') // line feed - .replace(/\v/g, '\\x0B') // vertical tab - .replace(/\f/g, '\\f') // form feed - .replace(/\r/g, '\\r') // carriage return - .replace(/[\x01-\x08\x0E-\x1F\x80-\uFFFF]/g, escape); -} - -/* - * Builds a node visitor -- a function which takes a node and any number of - * other parameters, calls an appropriate function according to the node type, - * passes it all its parameters and returns its value. The functions for various - * node types are passed in a parameter to |buildNodeVisitor| as a hash. - */ -function buildNodeVisitor(functions) { - return function(node) { - return functions[node.type].apply(null, arguments); - }; -} - -function findRuleByName(ast, name) { - return find(ast.rules, function(r) { return r.name === name; }); -} -PEG.parser = (function(){ - /* - * Generated by PEG.js 0.7.0. - * - * http://pegjs.majda.cz/ - */ - - function quote(s) { - /* - * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a - * string literal except for the closing quote character, backslash, - * carriage return, line separator, paragraph separator, and line feed. - * Any character may appear in the form of an escape sequence. - * - * For portability, we also escape escape all control and non-ASCII - * characters. Note that "\0" and "\v" escape sequences are not used - * because JSHint does not like the first and IE the second. - */ - return '"' + s - .replace(/\\/g, '\\\\') // backslash - .replace(/"/g, '\\"') // closing quote character - .replace(/\x08/g, '\\b') // backspace - .replace(/\t/g, '\\t') // horizontal tab - .replace(/\n/g, '\\n') // line feed - .replace(/\f/g, '\\f') // form feed - .replace(/\r/g, '\\r') // carriage return - .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) - + '"'; - } - - var result = { - /* - * Parses the input with a generated parser. If the parsing is successfull, - * returns a value explicitly or implicitly specified by the grammar from - * which the parser was generated (see |PEG.buildParser|). If the parsing is - * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. - */ - parse: function(input, startRule) { - var parseFunctions = { - "grammar": parse_grammar, - "initializer": parse_initializer, - "rule": parse_rule, - "choice": parse_choice, - "sequence": parse_sequence, - "labeled": parse_labeled, - "prefixed": parse_prefixed, - "suffixed": parse_suffixed, - "primary": parse_primary, - "action": parse_action, - "braced": parse_braced, - "nonBraceCharacters": parse_nonBraceCharacters, - "nonBraceCharacter": parse_nonBraceCharacter, - "equals": parse_equals, - "colon": parse_colon, - "semicolon": parse_semicolon, - "slash": parse_slash, - "and": parse_and, - "not": parse_not, - "question": parse_question, - "star": parse_star, - "plus": parse_plus, - "lparen": parse_lparen, - "rparen": parse_rparen, - "dot": parse_dot, - "identifier": parse_identifier, - "literal": parse_literal, - "string": parse_string, - "doubleQuotedString": parse_doubleQuotedString, - "doubleQuotedCharacter": parse_doubleQuotedCharacter, - "simpleDoubleQuotedCharacter": parse_simpleDoubleQuotedCharacter, - "singleQuotedString": parse_singleQuotedString, - "singleQuotedCharacter": parse_singleQuotedCharacter, - "simpleSingleQuotedCharacter": parse_simpleSingleQuotedCharacter, - "class": parse_class, - "classCharacterRange": parse_classCharacterRange, - "classCharacter": parse_classCharacter, - "bracketDelimitedCharacter": parse_bracketDelimitedCharacter, - "simpleBracketDelimitedCharacter": parse_simpleBracketDelimitedCharacter, - "simpleEscapeSequence": parse_simpleEscapeSequence, - "zeroEscapeSequence": parse_zeroEscapeSequence, - "hexEscapeSequence": parse_hexEscapeSequence, - "unicodeEscapeSequence": parse_unicodeEscapeSequence, - "eolEscapeSequence": parse_eolEscapeSequence, - "digit": parse_digit, - "hexDigit": parse_hexDigit, - "letter": parse_letter, - "lowerCaseLetter": parse_lowerCaseLetter, - "upperCaseLetter": parse_upperCaseLetter, - "__": parse___, - "comment": parse_comment, - "singleLineComment": parse_singleLineComment, - "multiLineComment": parse_multiLineComment, - "eol": parse_eol, - "eolChar": parse_eolChar, - "whitespace": parse_whitespace - }; - - if (startRule !== undefined) { - if (parseFunctions[startRule] === undefined) { - throw new Error("Invalid rule name: " + quote(startRule) + "."); - } - } else { - startRule = "grammar"; - } - - var pos = 0; - var reportFailures = 0; - var rightmostFailuresPos = 0; - var rightmostFailuresExpected = []; - - function padLeft(input, padding, length) { - var result = input; - - var padLength = length - input.length; - for (var i = 0; i < padLength; i++) { - result = padding + result; - } - - return result; - } - - function escape(ch) { - var charCode = ch.charCodeAt(0); - var escapeChar; - var length; - - if (charCode <= 0xFF) { - escapeChar = 'x'; - length = 2; - } else { - escapeChar = 'u'; - length = 4; - } - - return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); - } - - function matchFailed(failure) { - if (pos < rightmostFailuresPos) { - return; - } - - if (pos > rightmostFailuresPos) { - rightmostFailuresPos = pos; - rightmostFailuresExpected = []; - } - - rightmostFailuresExpected.push(failure); - } - - function parse_grammar() { - var result0, result1, result2, result3; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse___(); - if (result0 !== null) { - result1 = parse_initializer(); - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result3 = parse_rule(); - if (result3 !== null) { - result2 = []; - while (result3 !== null) { - result2.push(result3); - result3 = parse_rule(); - } - } else { - result2 = null; - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, initializer, rules) { - return { - type: "grammar", - initializer: initializer !== "" ? initializer : null, - rules: rules, - startRule: rules[0].name - }; - })(pos0, result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_initializer() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_action(); - if (result0 !== null) { - result1 = parse_semicolon(); - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, code) { - return { - type: "initializer", - code: code - }; - })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_rule() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_identifier(); - if (result0 !== null) { - result1 = parse_string(); - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result2 = parse_equals(); - if (result2 !== null) { - result3 = parse_choice(); - if (result3 !== null) { - result4 = parse_semicolon(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, name, displayName, expression) { - return { - type: "rule", - name: name, - displayName: displayName !== "" ? displayName : null, - expression: expression - }; - })(pos0, result0[0], result0[1], result0[3]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_choice() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_sequence(); - if (result0 !== null) { - result1 = []; - pos2 = pos; - result2 = parse_slash(); - if (result2 !== null) { - result3 = parse_sequence(); - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - result2 = parse_slash(); - if (result2 !== null) { - result3 = parse_sequence(); - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, head, tail) { - if (tail.length > 0) { - var alternatives = [head].concat(map( - tail, - function(element) { return element[1]; } - )); - return { - type: "choice", - alternatives: alternatives - }; - } else { - return head; - } - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_sequence() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = []; - result1 = parse_labeled(); - while (result1 !== null) { - result0.push(result1); - result1 = parse_labeled(); - } - if (result0 !== null) { - result1 = parse_action(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, elements, code) { - var expression = elements.length !== 1 - ? { - type: "sequence", - elements: elements - } - : elements[0]; - return { - type: "action", - expression: expression, - code: code - }; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - result0 = []; - result1 = parse_labeled(); - while (result1 !== null) { - result0.push(result1); - result1 = parse_labeled(); - } - if (result0 !== null) { - result0 = (function(offset, elements) { - return elements.length !== 1 - ? { - type: "sequence", - elements: elements - } - : elements[0]; - })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - - function parse_labeled() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_identifier(); - if (result0 !== null) { - result1 = parse_colon(); - if (result1 !== null) { - result2 = parse_prefixed(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, label, expression) { - return { - type: "labeled", - label: label, - expression: expression - }; - })(pos0, result0[0], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - result0 = parse_prefixed(); - } - return result0; - } - - function parse_prefixed() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_and(); - if (result0 !== null) { - result1 = parse_action(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, code) { - return { - type: "semantic_and", - code: code - }; - })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_and(); - if (result0 !== null) { - result1 = parse_suffixed(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, expression) { - return { - type: "simple_and", - expression: expression - }; - })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_not(); - if (result0 !== null) { - result1 = parse_action(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, code) { - return { - type: "semantic_not", - code: code - }; - })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_not(); - if (result0 !== null) { - result1 = parse_suffixed(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, expression) { - return { - type: "simple_not", - expression: expression - }; - })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - result0 = parse_suffixed(); - } - } - } - } - return result0; - } - - function parse_suffixed() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_primary(); - if (result0 !== null) { - result1 = parse_question(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, expression) { - return { - type: "optional", - expression: expression - }; - })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_primary(); - if (result0 !== null) { - result1 = parse_star(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, expression) { - return { - type: "zero_or_more", - expression: expression - }; - })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_primary(); - if (result0 !== null) { - result1 = parse_plus(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, expression) { - return { - type: "one_or_more", - expression: expression - }; - })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - result0 = parse_primary(); - } - } - } - return result0; - } - - function parse_primary() { - var result0, result1, result2; - var pos0, pos1, pos2, pos3; - - pos0 = pos; - pos1 = pos; - result0 = parse_identifier(); - if (result0 !== null) { - pos2 = pos; - reportFailures++; - pos3 = pos; - result1 = parse_string(); - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result2 = parse_equals(); - if (result2 !== null) { - result1 = [result1, result2]; - } else { - result1 = null; - pos = pos3; - } - } else { - result1 = null; - pos = pos3; - } - reportFailures--; - if (result1 === null) { - result1 = ""; - } else { - result1 = null; - pos = pos2; - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, name) { - return { - type: "rule_ref", - name: name - }; - })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - result0 = parse_literal(); - if (result0 === null) { - pos0 = pos; - result0 = parse_dot(); - if (result0 !== null) { - result0 = (function(offset) { return { type: "any" }; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - result0 = parse_class(); - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_lparen(); - if (result0 !== null) { - result1 = parse_choice(); - if (result1 !== null) { - result2 = parse_rparen(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, expression) { return expression; })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - } - } - } - } - return result0; - } - - function parse_action() { - var result0, result1; - var pos0, pos1; - - reportFailures++; - pos0 = pos; - pos1 = pos; - result0 = parse_braced(); - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, braced) { return braced.substr(1, braced.length - 2); })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("action"); - } - return result0; - } - - function parse_braced() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 123) { - result0 = "{"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"{\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse_braced(); - if (result2 === null) { - result2 = parse_nonBraceCharacter(); - } - while (result2 !== null) { - result1.push(result2); - result2 = parse_braced(); - if (result2 === null) { - result2 = parse_nonBraceCharacter(); - } - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 125) { - result2 = "}"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"}\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, parts) { - return "{" + parts.join("") + "}"; - })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_nonBraceCharacters() { - var result0, result1; - var pos0; - - pos0 = pos; - result1 = parse_nonBraceCharacter(); - if (result1 !== null) { - result0 = []; - while (result1 !== null) { - result0.push(result1); - result1 = parse_nonBraceCharacter(); - } - } else { - result0 = null; - } - if (result0 !== null) { - result0 = (function(offset, chars) { return chars.join(""); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_nonBraceCharacter() { - var result0; - - if (/^[^{}]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[^{}]"); - } - } - return result0; - } - - function parse_equals() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 61) { - result0 = "="; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "="; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_colon() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 58) { - result0 = ":"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\":\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return ":"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_semicolon() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 59) { - result0 = ";"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return ";"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_slash() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 47) { - result0 = "/"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"/\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "/"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_and() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 38) { - result0 = "&"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"&\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "&"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_not() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 33) { - result0 = "!"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"!\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "!"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_question() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 63) { - result0 = "?"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"?\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "?"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_star() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 42) { - result0 = "*"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"*\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "*"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_plus() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 43) { - result0 = "+"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"+\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "+"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_lparen() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 40) { - result0 = "("; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"(\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "("; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_rparen() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 41) { - result0 = ")"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\")\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return ")"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_dot() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 46) { - result0 = "."; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\".\""); - } - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "."; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_identifier() { - var result0, result1, result2; - var pos0, pos1; - - reportFailures++; - pos0 = pos; - pos1 = pos; - result0 = parse_letter(); - if (result0 === null) { - if (input.charCodeAt(pos) === 95) { - result0 = "_"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"_\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 36) { - result0 = "$"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"$\""); - } - } - } - } - if (result0 !== null) { - result1 = []; - result2 = parse_letter(); - if (result2 === null) { - result2 = parse_digit(); - if (result2 === null) { - if (input.charCodeAt(pos) === 95) { - result2 = "_"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"_\""); - } - } - if (result2 === null) { - if (input.charCodeAt(pos) === 36) { - result2 = "$"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"$\""); - } - } - } - } - } - while (result2 !== null) { - result1.push(result2); - result2 = parse_letter(); - if (result2 === null) { - result2 = parse_digit(); - if (result2 === null) { - if (input.charCodeAt(pos) === 95) { - result2 = "_"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"_\""); - } - } - if (result2 === null) { - if (input.charCodeAt(pos) === 36) { - result2 = "$"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"$\""); - } - } - } - } - } - } - if (result1 !== null) { - result2 = parse___(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, head, tail) { - return head + tail.join(""); - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("identifier"); - } - return result0; - } - - function parse_literal() { - var result0, result1, result2; - var pos0, pos1; - - reportFailures++; - pos0 = pos; - pos1 = pos; - result0 = parse_doubleQuotedString(); - if (result0 === null) { - result0 = parse_singleQuotedString(); - } - if (result0 !== null) { - if (input.charCodeAt(pos) === 105) { - result1 = "i"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"i\""); - } - } - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result2 = parse___(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, value, flags) { - return { - type: "literal", - value: value, - ignoreCase: flags === "i" - }; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("literal"); - } - return result0; - } - - function parse_string() { - var result0, result1; - var pos0, pos1; - - reportFailures++; - pos0 = pos; - pos1 = pos; - result0 = parse_doubleQuotedString(); - if (result0 === null) { - result0 = parse_singleQuotedString(); - } - if (result0 !== null) { - result1 = parse___(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, string) { return string; })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("string"); - } - return result0; - } - - function parse_doubleQuotedString() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { - result0 = "\""; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse_doubleQuotedCharacter(); - while (result2 !== null) { - result1.push(result2); - result2 = parse_doubleQuotedCharacter(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 34) { - result2 = "\""; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, chars) { return chars.join(""); })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_doubleQuotedCharacter() { - var result0; - - result0 = parse_simpleDoubleQuotedCharacter(); - if (result0 === null) { - result0 = parse_simpleEscapeSequence(); - if (result0 === null) { - result0 = parse_zeroEscapeSequence(); - if (result0 === null) { - result0 = parse_hexEscapeSequence(); - if (result0 === null) { - result0 = parse_unicodeEscapeSequence(); - if (result0 === null) { - result0 = parse_eolEscapeSequence(); - } - } - } - } - } - return result0; - } - - function parse_simpleDoubleQuotedCharacter() { - var result0, result1; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.charCodeAt(pos) === 34) { - result0 = "\""; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 92) { - result0 = "\\"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result0 === null) { - result0 = parse_eolChar(); - } - } - reportFailures--; - if (result0 === null) { - result0 = ""; - } else { - result0 = null; - pos = pos2; - } - if (result0 !== null) { - if (input.length > pos) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, char_) { return char_; })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_singleQuotedString() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 39) { - result0 = "'"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"'\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse_singleQuotedCharacter(); - while (result2 !== null) { - result1.push(result2); - result2 = parse_singleQuotedCharacter(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 39) { - result2 = "'"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"'\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, chars) { return chars.join(""); })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_singleQuotedCharacter() { - var result0; - - result0 = parse_simpleSingleQuotedCharacter(); - if (result0 === null) { - result0 = parse_simpleEscapeSequence(); - if (result0 === null) { - result0 = parse_zeroEscapeSequence(); - if (result0 === null) { - result0 = parse_hexEscapeSequence(); - if (result0 === null) { - result0 = parse_unicodeEscapeSequence(); - if (result0 === null) { - result0 = parse_eolEscapeSequence(); - } - } - } - } - } - return result0; - } - - function parse_simpleSingleQuotedCharacter() { - var result0, result1; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.charCodeAt(pos) === 39) { - result0 = "'"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"'\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 92) { - result0 = "\\"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result0 === null) { - result0 = parse_eolChar(); - } - } - reportFailures--; - if (result0 === null) { - result0 = ""; - } else { - result0 = null; - pos = pos2; - } - if (result0 !== null) { - if (input.length > pos) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, char_) { return char_; })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_class() { - var result0, result1, result2, result3, result4, result5; - var pos0, pos1; - - reportFailures++; - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 91) { - result0 = "["; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"[\""); - } - } - if (result0 !== null) { - if (input.charCodeAt(pos) === 94) { - result1 = "^"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"^\""); - } - } - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result2 = []; - result3 = parse_classCharacterRange(); - if (result3 === null) { - result3 = parse_classCharacter(); - } - while (result3 !== null) { - result2.push(result3); - result3 = parse_classCharacterRange(); - if (result3 === null) { - result3 = parse_classCharacter(); - } - } - if (result2 !== null) { - if (input.charCodeAt(pos) === 93) { - result3 = "]"; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\"]\""); - } - } - if (result3 !== null) { - if (input.charCodeAt(pos) === 105) { - result4 = "i"; - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\"i\""); - } - } - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result5 = parse___(); - if (result5 !== null) { - result0 = [result0, result1, result2, result3, result4, result5]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, inverted, parts, flags) { - var partsConverted = map(parts, function(part) { return part.data; }); - var rawText = "[" - + inverted - + map(parts, function(part) { return part.rawText; }).join("") - + "]" - + flags; - - return { - type: "class", - inverted: inverted === "^", - ignoreCase: flags === "i", - parts: partsConverted, - // FIXME: Get the raw text from the input directly. - rawText: rawText - }; - })(pos0, result0[1], result0[2], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("character class"); - } - return result0; - } - - function parse_classCharacterRange() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_classCharacter(); - if (result0 !== null) { - if (input.charCodeAt(pos) === 45) { - result1 = "-"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"-\""); - } - } - if (result1 !== null) { - result2 = parse_classCharacter(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, begin, end) { - if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) { - throw new this.SyntaxError( - "Invalid character range: " + begin.rawText + "-" + end.rawText + "." - ); - } - - return { - data: [begin.data, end.data], - // FIXME: Get the raw text from the input directly. - rawText: begin.rawText + "-" + end.rawText - }; - })(pos0, result0[0], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_classCharacter() { - var result0; - var pos0; - - pos0 = pos; - result0 = parse_bracketDelimitedCharacter(); - if (result0 !== null) { - result0 = (function(offset, char_) { - return { - data: char_, - // FIXME: Get the raw text from the input directly. - rawText: quoteForRegexpClass(char_) - }; - })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_bracketDelimitedCharacter() { - var result0; - - result0 = parse_simpleBracketDelimitedCharacter(); - if (result0 === null) { - result0 = parse_simpleEscapeSequence(); - if (result0 === null) { - result0 = parse_zeroEscapeSequence(); - if (result0 === null) { - result0 = parse_hexEscapeSequence(); - if (result0 === null) { - result0 = parse_unicodeEscapeSequence(); - if (result0 === null) { - result0 = parse_eolEscapeSequence(); - } - } - } - } - } - return result0; - } - - function parse_simpleBracketDelimitedCharacter() { - var result0, result1; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.charCodeAt(pos) === 93) { - result0 = "]"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"]\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 92) { - result0 = "\\"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result0 === null) { - result0 = parse_eolChar(); - } - } - reportFailures--; - if (result0 === null) { - result0 = ""; - } else { - result0 = null; - pos = pos2; - } - if (result0 !== null) { - if (input.length > pos) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, char_) { return char_; })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_simpleEscapeSequence() { - var result0, result1, result2; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 92) { - result0 = "\\"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result0 !== null) { - pos2 = pos; - reportFailures++; - result1 = parse_digit(); - if (result1 === null) { - if (input.charCodeAt(pos) === 120) { - result1 = "x"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"x\""); - } - } - if (result1 === null) { - if (input.charCodeAt(pos) === 117) { - result1 = "u"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"u\""); - } - } - if (result1 === null) { - result1 = parse_eolChar(); - } - } - } - reportFailures--; - if (result1 === null) { - result1 = ""; - } else { - result1 = null; - pos = pos2; - } - if (result1 !== null) { - if (input.length > pos) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, char_) { - return char_ - .replace("b", "\b") - .replace("f", "\f") - .replace("n", "\n") - .replace("r", "\r") - .replace("t", "\t") - .replace("v", "\x0B"); // IE does not recognize "\v". - })(pos0, result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_zeroEscapeSequence() { - var result0, result1; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - if (input.substr(pos, 2) === "\\0") { - result0 = "\\0"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\0\""); - } - } - if (result0 !== null) { - pos2 = pos; - reportFailures++; - result1 = parse_digit(); - reportFailures--; - if (result1 === null) { - result1 = ""; - } else { - result1 = null; - pos = pos2; - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset) { return "\x00"; })(pos0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_hexEscapeSequence() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.substr(pos, 2) === "\\x") { - result0 = "\\x"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\x\""); - } - } - if (result0 !== null) { - result1 = parse_hexDigit(); - if (result1 !== null) { - result2 = parse_hexDigit(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, h1, h2) { - return String.fromCharCode(parseInt(h1 + h2, 16)); - })(pos0, result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_unicodeEscapeSequence() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.substr(pos, 2) === "\\u") { - result0 = "\\u"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\u\""); - } - } - if (result0 !== null) { - result1 = parse_hexDigit(); - if (result1 !== null) { - result2 = parse_hexDigit(); - if (result2 !== null) { - result3 = parse_hexDigit(); - if (result3 !== null) { - result4 = parse_hexDigit(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, h1, h2, h3, h4) { - return String.fromCharCode(parseInt(h1 + h2 + h3 + h4, 16)); - })(pos0, result0[1], result0[2], result0[3], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_eolEscapeSequence() { - var result0, result1; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 92) { - result0 = "\\"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result0 !== null) { - result1 = parse_eol(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, eol) { return eol; })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_digit() { - var result0; - - if (/^[0-9]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - return result0; - } - - function parse_hexDigit() { - var result0; - - if (/^[0-9a-fA-F]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[0-9a-fA-F]"); - } - } - return result0; - } - - function parse_letter() { - var result0; - - result0 = parse_lowerCaseLetter(); - if (result0 === null) { - result0 = parse_upperCaseLetter(); - } - return result0; - } - - function parse_lowerCaseLetter() { - var result0; - - if (/^[a-z]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[a-z]"); - } - } - return result0; - } - - function parse_upperCaseLetter() { - var result0; - - if (/^[A-Z]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[A-Z]"); - } - } - return result0; - } - - function parse___() { - var result0, result1; - - result0 = []; - result1 = parse_whitespace(); - if (result1 === null) { - result1 = parse_eol(); - if (result1 === null) { - result1 = parse_comment(); - } - } - while (result1 !== null) { - result0.push(result1); - result1 = parse_whitespace(); - if (result1 === null) { - result1 = parse_eol(); - if (result1 === null) { - result1 = parse_comment(); - } - } - } - return result0; - } - - function parse_comment() { - var result0; - - reportFailures++; - result0 = parse_singleLineComment(); - if (result0 === null) { - result0 = parse_multiLineComment(); - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("comment"); - } - return result0; - } - - function parse_singleLineComment() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - pos0 = pos; - if (input.substr(pos, 2) === "//") { - result0 = "//"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"//\""); - } - } - if (result0 !== null) { - result1 = []; - pos1 = pos; - pos2 = pos; - reportFailures++; - result2 = parse_eolChar(); - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - while (result2 !== null) { - result1.push(result2); - pos1 = pos; - pos2 = pos; - reportFailures++; - result2 = parse_eolChar(); - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - return result0; - } - - function parse_multiLineComment() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - pos0 = pos; - if (input.substr(pos, 2) === "/*") { - result0 = "/*"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"/*\""); - } - } - if (result0 !== null) { - result1 = []; - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - while (result2 !== null) { - result1.push(result2); - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - } - if (result1 !== null) { - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - return result0; - } - - function parse_eol() { - var result0; - - reportFailures++; - if (input.charCodeAt(pos) === 10) { - result0 = "\n"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\n\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "\r\n") { - result0 = "\r\n"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\r\\n\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 13) { - result0 = "\r"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\r\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 8232) { - result0 = "\u2028"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\u2028\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 8233) { - result0 = "\u2029"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\u2029\""); - } - } - } - } - } - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("end of line"); - } - return result0; - } - - function parse_eolChar() { - var result0; - - if (/^[\n\r\u2028\u2029]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[\\n\\r\\u2028\\u2029]"); - } - } - return result0; - } - - function parse_whitespace() { - var result0; - - reportFailures++; - if (/^[ \t\x0B\f\xA0\uFEFF\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\x0B\\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]"); - } - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("whitespace"); - } - return result0; - } - - - function cleanupExpected(expected) { - expected.sort(); - - var lastExpected = null; - var cleanExpected = []; - for (var i = 0; i < expected.length; i++) { - if (expected[i] !== lastExpected) { - cleanExpected.push(expected[i]); - lastExpected = expected[i]; - } - } - return cleanExpected; - } - - function computeErrorPosition() { - /* - * The first idea was to use |String.split| to break the input up to the - * error position along newlines and derive the line and column from - * there. However IE's |split| implementation is so broken that it was - * enough to prevent it. - */ - - var line = 1; - var column = 1; - var seenCR = false; - - for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { - var ch = input.charAt(i); - if (ch === "\n") { - if (!seenCR) { line++; } - column = 1; - seenCR = false; - } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { - line++; - column = 1; - seenCR = true; - } else { - column++; - seenCR = false; - } - } - - return { line: line, column: column }; - } - - - var result = parseFunctions[startRule](); - - /* - * The parser is now in one of the following three states: - * - * 1. The parser successfully parsed the whole input. - * - * - |result !== null| - * - |pos === input.length| - * - |rightmostFailuresExpected| may or may not contain something - * - * 2. The parser successfully parsed only a part of the input. - * - * - |result !== null| - * - |pos < input.length| - * - |rightmostFailuresExpected| may or may not contain something - * - * 3. The parser did not successfully parse any part of the input. - * - * - |result === null| - * - |pos === 0| - * - |rightmostFailuresExpected| contains at least one failure - * - * All code following this comment (including called functions) must - * handle these states. - */ - if (result === null || pos !== input.length) { - var offset = Math.max(pos, rightmostFailuresPos); - var found = offset < input.length ? input.charAt(offset) : null; - var errorPosition = computeErrorPosition(); - - throw new this.SyntaxError( - cleanupExpected(rightmostFailuresExpected), - found, - offset, - errorPosition.line, - errorPosition.column - ); - } - - return result; - }, - - /* Returns the parser source code. */ - toSource: function() { return this._source; } - }; - - /* Thrown when a parser encounters a syntax error. */ - - result.SyntaxError = function(expected, found, offset, line, column) { - function buildMessage(expected, found) { - var expectedHumanized, foundHumanized; - - switch (expected.length) { - case 0: - expectedHumanized = "end of input"; - break; - case 1: - expectedHumanized = expected[0]; - break; - default: - expectedHumanized = expected.slice(0, expected.length - 1).join(", ") - + " or " - + expected[expected.length - 1]; - } - - foundHumanized = found ? quote(found) : "end of input"; - - return "Expected " + expectedHumanized + " but " + foundHumanized + " found."; - } - - this.name = "SyntaxError"; - this.expected = expected; - this.found = found; - this.message = buildMessage(expected, found); - this.offset = offset; - this.line = line; - this.column = column; - }; - - result.SyntaxError.prototype = Error.prototype; - - return result; -})(); -PEG.compiler = { - /* - * Names of passes that will get run during the compilation (in the specified - * order). - */ - appliedPassNames: [ - "reportMissingRules", - "reportLeftRecursion", - "removeProxyRules", - "computeVarNames", - "computeParams" - ], - - /* - * Generates a parser from a specified grammar AST. Throws |PEG.GrammarError| - * if the AST contains a semantic error. Note that not all errors are detected - * during the generation and some may protrude to the generated parser and - * cause its malfunction. - */ - compile: function(ast, options) { - var that = this; - - each(this.appliedPassNames, function(passName) { - that.passes[passName](ast); - }); - - var source = this.emitter(ast, options); - var result = eval(source); - result._source = source; - - return result; - } -}; - -/* - * Compiler passes. - * - * Each pass is a function that is passed the AST. It can perform checks on it - * or modify it as needed. If the pass encounters a semantic error, it throws - * |PEG.GrammarError|. - */ -PEG.compiler.passes = { - /* Checks that all referenced rules exist. */ - reportMissingRules: function(ast) { - function nop() {} - - function checkExpression(node) { check(node.expression); } - - function checkSubnodes(propertyName) { - return function(node) { each(node[propertyName], check); }; - } - - var check = buildNodeVisitor({ - grammar: checkSubnodes("rules"), - rule: checkExpression, - choice: checkSubnodes("alternatives"), - sequence: checkSubnodes("elements"), - labeled: checkExpression, - simple_and: checkExpression, - simple_not: checkExpression, - semantic_and: nop, - semantic_not: nop, - optional: checkExpression, - zero_or_more: checkExpression, - one_or_more: checkExpression, - action: checkExpression, - - rule_ref: - function(node) { - if (!findRuleByName(ast, node.name)) { - throw new PEG.GrammarError( - "Referenced rule \"" + node.name + "\" does not exist." - ); - } - }, - - literal: nop, - any: nop, - "class": nop - }); - - check(ast); - }, - - /* Checks that no left recursion is present. */ - reportLeftRecursion: function(ast) { - function nop() {} - - function checkExpression(node, appliedRules) { - check(node.expression, appliedRules); - } - - function checkSubnodes(propertyName) { - return function(node, appliedRules) { - each(node[propertyName], function(subnode) { - check(subnode, appliedRules); - }); - }; - } - - var check = buildNodeVisitor({ - grammar: checkSubnodes("rules"), - - rule: - function(node, appliedRules) { - check(node.expression, appliedRules.concat(node.name)); - }, - - choice: checkSubnodes("alternatives"), - - sequence: - function(node, appliedRules) { - if (node.elements.length > 0) { - check(node.elements[0], appliedRules); - } - }, - - labeled: checkExpression, - simple_and: checkExpression, - simple_not: checkExpression, - semantic_and: nop, - semantic_not: nop, - optional: checkExpression, - zero_or_more: checkExpression, - one_or_more: checkExpression, - action: checkExpression, - - rule_ref: - function(node, appliedRules) { - if (contains(appliedRules, node.name)) { - throw new PEG.GrammarError( - "Left recursion detected for rule \"" + node.name + "\"." - ); - } - check(findRuleByName(ast, node.name), appliedRules); - }, - - literal: nop, - any: nop, - "class": nop - }); - - check(ast, []); - }, - - /* - * Removes proxy rules -- that is, rules that only delegate to other rule. - */ - removeProxyRules: function(ast) { - function isProxyRule(node) { - return node.type === "rule" && node.expression.type === "rule_ref"; - } - - function replaceRuleRefs(ast, from, to) { - function nop() {} - - function replaceInExpression(node, from, to) { - replace(node.expression, from, to); - } - - function replaceInSubnodes(propertyName) { - return function(node, from, to) { - each(node[propertyName], function(subnode) { - replace(subnode, from, to); - }); - }; - } - - var replace = buildNodeVisitor({ - grammar: replaceInSubnodes("rules"), - rule: replaceInExpression, - choice: replaceInSubnodes("alternatives"), - sequence: replaceInSubnodes("elements"), - labeled: replaceInExpression, - simple_and: replaceInExpression, - simple_not: replaceInExpression, - semantic_and: nop, - semantic_not: nop, - optional: replaceInExpression, - zero_or_more: replaceInExpression, - one_or_more: replaceInExpression, - action: replaceInExpression, - - rule_ref: - function(node, from, to) { - if (node.name === from) { - node.name = to; - } - }, - - literal: nop, - any: nop, - "class": nop - }); - - replace(ast, from, to); - } - - var indices = []; - - each(ast.rules, function(rule, i) { - if (isProxyRule(rule)) { - replaceRuleRefs(ast, rule.name, rule.expression.name); - if (rule.name === ast.startRule) { - ast.startRule = rule.expression.name; - } - indices.push(i); - } - }); - - indices.reverse(); - - each(indices, function(index) { - ast.rules.splice(index, 1); - }); - }, - - /* - * Computes names of variables used for storing match results and parse - * positions in generated code. These variables are organized as two stacks. - * The following will hold after running this pass: - * - * * All nodes except "grammar" and "rule" nodes will have a |resultVar| - * property. It will contain a name of the variable that will store a - * match result of the expression represented by the node in generated - * code. - * - * * Some nodes will have a |posVar| property. It will contain a name of the - * variable that will store a parse position in generated code. - * - * * All "rule" nodes will contain |resultVars| and |posVars| properties. - * They will contain a list of values of |resultVar| and |posVar| - * properties used in rule's subnodes. (This is useful to declare - * variables in generated code.) - */ - computeVarNames: function(ast) { - function resultVar(index) { return "result" + index; } - function posVar(index) { return "pos" + index; } - - function computeLeaf(node, index) { - node.resultVar = resultVar(index.result); - - return { result: 0, pos: 0 }; - } - - function computeFromExpression(delta) { - return function(node, index) { - var depth = compute( - node.expression, - { - result: index.result + delta.result, - pos: index.pos + delta.pos - } - ); - - node.resultVar = resultVar(index.result); - if (delta.pos !== 0) { - node.posVar = posVar(index.pos); - } - - return { - result: depth.result + delta.result, - pos: depth.pos + delta.pos - }; - }; - } - - var compute = buildNodeVisitor({ - grammar: - function(node, index) { - each(node.rules, function(node) { - compute(node, index); - }); - }, - - rule: - function(node, index) { - var depth = compute(node.expression, index); - - node.resultVar = resultVar(index.result); - node.resultVars = map(range(depth.result + 1), resultVar); - node.posVars = map(range(depth.pos), posVar); - }, - - choice: - function(node, index) { - var depths = map(node.alternatives, function(alternative) { - return compute(alternative, index); - }); - - node.resultVar = resultVar(index.result); - - return { - result: Math.max.apply(null, pluck(depths, "result")), - pos: Math.max.apply(null, pluck(depths, "pos")) - }; - }, - - sequence: - function(node, index) { - var depths = map(node.elements, function(element, i) { - return compute( - element, - { result: index.result + i, pos: index.pos + 1 } - ); - }); - - node.resultVar = resultVar(index.result); - node.posVar = posVar(index.pos); - - return { - result: - node.elements.length > 0 - ? Math.max.apply( - null, - map(depths, function(d, i) { return i + d.result; }) - ) - : 0, - - pos: - node.elements.length > 0 - ? 1 + Math.max.apply(null, pluck(depths, "pos")) - : 1 - }; - }, - - labeled: computeFromExpression({ result: 0, pos: 0 }), - simple_and: computeFromExpression({ result: 0, pos: 1 }), - simple_not: computeFromExpression({ result: 0, pos: 1 }), - semantic_and: computeLeaf, - semantic_not: computeLeaf, - optional: computeFromExpression({ result: 0, pos: 0 }), - zero_or_more: computeFromExpression({ result: 1, pos: 0 }), - one_or_more: computeFromExpression({ result: 1, pos: 0 }), - action: computeFromExpression({ result: 0, pos: 1 }), - rule_ref: computeLeaf, - literal: computeLeaf, - any: computeLeaf, - "class": computeLeaf - }); - - compute(ast, { result: 0, pos: 0 }); - }, - - /* - * This pass walks through the AST and tracks what labels are visible at each - * point. For "action", "semantic_and" and "semantic_or" nodes it computes - * parameter names and values for the function used in generated code. (In the - * emitter, user's code is wrapped into a function that is immediately - * executed. Its parameter names correspond to visible labels and its - * parameter values to their captured values). Implicitly, this pass defines - * scoping rules for labels. - * - * After running this pass, all "action", "semantic_and" and "semantic_or" - * nodes will have a |params| property containing an object mapping parameter - * names to the expressions that will be used as their values. - */ - computeParams: function(ast) { - var envs = []; - - function scoped(f) { - envs.push({}); - f(); - envs.pop(); - } - - function nop() {} - - function computeForScopedExpression(node) { - scoped(function() { compute(node.expression); }); - } - - function computeParams(node) { - var env = envs[envs.length - 1], params = {}, name; - - for (name in env) { - params[name] = env[name]; - } - node.params = params; - } - - var compute = buildNodeVisitor({ - grammar: - function(node) { - each(node.rules, compute); - }, - - rule: computeForScopedExpression, - - choice: - function(node) { - scoped(function() { each(node.alternatives, compute); }); - }, - - sequence: - function(node) { - var env = envs[envs.length - 1], name; - - function fixup(name) { - each(pluck(node.elements, "resultVar"), function(resultVar, i) { - if ((new RegExp("^" + resultVar + "(\\[\\d+\\])*$")).test(env[name])) { - env[name] = node.resultVar + "[" + i + "]" - + env[name].substr(resultVar.length); - } - }); - } - - each(node.elements, compute); - - for (name in env) { - fixup(name); - } - }, - - labeled: - function(node) { - envs[envs.length - 1][node.label] = node.resultVar; - - scoped(function() { compute(node.expression); }); - }, - - simple_and: computeForScopedExpression, - simple_not: computeForScopedExpression, - semantic_and: computeParams, - semantic_not: computeParams, - optional: computeForScopedExpression, - zero_or_more: computeForScopedExpression, - one_or_more: computeForScopedExpression, - - action: - function(node) { - scoped(function() { - compute(node.expression); - computeParams(node); - }); - }, - - rule_ref: nop, - literal: nop, - any: nop, - "class": nop - }); - - compute(ast); - } -}; -/* Emits the generated code for the AST. */ -PEG.compiler.emitter = function(ast, options) { - options = options || {}; - if (options.cache === undefined) { - options.cache = false; - } - if (options.trackLineAndColumn === undefined) { - options.trackLineAndColumn = false; - } - - /* - * Codie 1.1.0 - * - * https://github.com/dmajda/codie - * - * Copyright (c) 2011-2012 David Majda - * Licensend under the MIT license. - */ - var Codie = (function(undefined) { - - function stringEscape(s) { - function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); } - - /* - * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a - * string literal except for the closing quote character, backslash, - * carriage return, line separator, paragraph separator, and line feed. - * Any character may appear in the form of an escape sequence. - * - * For portability, we also escape escape all control and non-ASCII - * characters. Note that "\0" and "\v" escape sequences are not used - * because JSHint does not like the first and IE the second. - */ - return s - .replace(/\\/g, '\\\\') // backslash - .replace(/"/g, '\\"') // closing double quote - .replace(/\x08/g, '\\b') // backspace - .replace(/\t/g, '\\t') // horizontal tab - .replace(/\n/g, '\\n') // line feed - .replace(/\f/g, '\\f') // form feed - .replace(/\r/g, '\\r') // carriage return - .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x80-\xFF]/g, function(ch) { return '\\x' + hex(ch); }) - .replace(/[\u0180-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); }) - .replace(/[\u1080-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); }); - } - - function push(s) { return '__p.push(' + s + ');'; } - - function pushRaw(template, length, state) { - function unindent(code, level, unindentFirst) { - return code.replace( - new RegExp('^.{' + level +'}', "gm"), - function(str, offset) { - if (offset === 0) { - return unindentFirst ? '' : str; - } else { - return ""; - } - } - ); - } - - var escaped = stringEscape(unindent( - template.substring(0, length), - state.indentLevel(), - state.atBOL - )); - - return escaped.length > 0 ? push('"' + escaped + '"') : ''; - } - - - var Codie = { - /* Codie version (uses semantic versioning). */ - VERSION: "1.1.0", - - /* - * Specifies by how many characters do #if/#else and #for unindent their - * content in the generated code. - */ - indentStep: 2, - - /* Description of #-commands. Extend to define your own commands. */ - commands: { - "if": { - params: /^(.*)$/, - compile: function(state, prefix, params) { - return ['if(' + params[0] + '){', []]; - }, - stackOp: "push" - }, - "else": { - params: /^$/, - compile: function(state) { - var stack = state.commandStack, - insideElse = stack[stack.length - 1] === "else", - insideIf = stack[stack.length - 1] === "if"; - - if (insideElse) { throw new Error("Multiple #elses."); } - if (!insideIf) { throw new Error("Using #else outside of #if."); } - - return ['}else{', []]; - }, - stackOp: "replace" - }, - "for": { - params: /^([a-zA-Z_][a-zA-Z0-9_]*)[ \t]+in[ \t]+(.*)$/, - init: function(state) { - state.forCurrLevel = 0; // current level of #for loop nesting - state.forMaxLevel = 0; // maximum level of #for loop nesting - }, - compile: function(state, prefix, params) { - var c = '__c' + state.forCurrLevel, // __c for "collection" - l = '__l' + state.forCurrLevel, // __l for "length" - i = '__i' + state.forCurrLevel; // __i for "index" - - state.forCurrLevel++; - if (state.forMaxLevel < state.forCurrLevel) { - state.forMaxLevel = state.forCurrLevel; - } - - return [ - c + '=' + params[1] + ';' - + l + '=' + c + '.length;' - + 'for(' + i + '=0;' + i + '<' + l + ';' + i + '++){' - + params[0] + '=' + c + '[' + i + '];', - [params[0], c, l, i] - ]; - }, - exit: function(state) { state.forCurrLevel--; }, - stackOp: "push" - }, - "end": { - params: /^$/, - compile: function(state) { - var stack = state.commandStack, exit; - - if (stack.length === 0) { throw new Error("Too many #ends."); } - - exit = Codie.commands[stack[stack.length - 1]].exit; - if (exit) { exit(state); } - - return ['}', []]; - }, - stackOp: "pop" - }, - "block": { - params: /^(.*)$/, - compile: function(state, prefix, params) { - var x = '__x', // __x for "prefix", - n = '__n', // __n for "lines" - l = '__l', // __l for "length" - i = '__i'; // __i for "index" - - /* - * Originally, the generated code used |String.prototype.replace|, but - * it is buggy in certain versions of V8 so it was rewritten. See the - * tests for details. - */ - return [ - x + '="' + stringEscape(prefix.substring(state.indentLevel())) + '";' - + n + '=(' + params[0] + ').toString().split("\\n");' - + l + '=' + n + '.length;' - + 'for(' + i + '=0;' + i + '<' + l + ';' + i + '++){' - + n + '[' + i +']=' + x + '+' + n + '[' + i + ']+"\\n";' - + '}' - + push(n + '.join("")'), - [x, n, l, i] - ]; - }, - stackOp: "nop" - } - }, - - /* - * Compiles a template into a function. When called, this function will - * execute the template in the context of an object passed in a parameter and - * return the result. - */ - template: function(template) { - var stackOps = { - push: function(stack, name) { stack.push(name); }, - replace: function(stack, name) { stack[stack.length - 1] = name; }, - pop: function(stack) { stack.pop(); }, - nop: function() { } - }; - - function compileExpr(state, expr) { - state.atBOL = false; - return [push(expr), []]; - } - - function compileCommand(state, prefix, name, params) { - var command, match, result; - - command = Codie.commands[name]; - if (!command) { throw new Error("Unknown command: #" + name + "."); } - - match = command.params.exec(params); - if (match === null) { - throw new Error( - "Invalid params for command #" + name + ": " + params + "." - ); - } - - result = command.compile(state, prefix, match.slice(1)); - stackOps[command.stackOp](state.commandStack, name); - state.atBOL = true; - return result; - } - - var state = { // compilation state - commandStack: [], // stack of commands as they were nested - atBOL: true, // is the next character to process at BOL? - indentLevel: function() { - return Codie.indentStep * this.commandStack.length; - } - }, - code = '', // generated template function code - vars = ['__p=[]'], // variables used by generated code - name, match, result, i; - - /* Initialize state. */ - for (name in Codie.commands) { - if (Codie.commands[name].init) { Codie.commands[name].init(state); } - } - - /* Compile the template. */ - while ((match = /^([ \t]*)#([a-zA-Z_][a-zA-Z0-9_]*)(?:[ \t]+([^ \t\n][^\n]*))?[ \t]*(?:\n|$)|#\{([^}]*)\}/m.exec(template)) !== null) { - code += pushRaw(template, match.index, state); - result = match[2] !== undefined && match[2] !== "" - ? compileCommand(state, match[1], match[2], match[3] || "") // #-command - : compileExpr(state, match[4]); // #{...} - code += result[0]; - vars = vars.concat(result[1]); - template = template.substring(match.index + match[0].length); - } - code += pushRaw(template, template.length, state); - - /* Check the final state. */ - if (state.commandStack.length > 0) { throw new Error("Missing #end."); } - - /* Sanitize the list of variables used by commands. */ - vars.sort(); - for (i = 0; i < vars.length; i++) { - if (vars[i] === vars[i - 1]) { vars.splice(i--, 1); } - } - - /* Create the resulting function. */ - return new Function("__v", [ - '__v=__v||{};', - 'var ' + vars.join(',') + ';', - 'with(__v){', - code, - 'return __p.join("").replace(/^\\n+|\\n+$/g,"");};' - ].join('')); - } - }; - - return Codie; - - })(); - - var templates = (function() { - var name, - templates = {}, - sources = { - grammar: [ - '(function(){', - ' /*', - ' * Generated by PEG.js 0.7.0.', - ' *', - ' * http://pegjs.majda.cz/', - ' */', - ' ', - /* This needs to be in sync with |quote| in utils.js. */ - ' function quote(s) {', - ' /*', - ' * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a', - ' * string literal except for the closing quote character, backslash,', - ' * carriage return, line separator, paragraph separator, and line feed.', - ' * Any character may appear in the form of an escape sequence.', - ' *', - ' * For portability, we also escape escape all control and non-ASCII', - ' * characters. Note that "\\0" and "\\v" escape sequences are not used', - ' * because JSHint does not like the first and IE the second.', - ' */', - ' return \'"\' + s', - ' .replace(/\\\\/g, \'\\\\\\\\\') // backslash', - ' .replace(/"/g, \'\\\\"\') // closing quote character', - ' .replace(/\\x08/g, \'\\\\b\') // backspace', - ' .replace(/\\t/g, \'\\\\t\') // horizontal tab', - ' .replace(/\\n/g, \'\\\\n\') // line feed', - ' .replace(/\\f/g, \'\\\\f\') // form feed', - ' .replace(/\\r/g, \'\\\\r\') // carriage return', - ' .replace(/[\\x00-\\x07\\x0B\\x0E-\\x1F\\x80-\\uFFFF]/g, escape)', - ' + \'"\';', - ' }', - ' ', - ' var result = {', - ' /*', - ' * Parses the input with a generated parser. If the parsing is successfull,', - ' * returns a value explicitly or implicitly specified by the grammar from', - ' * which the parser was generated (see |PEG.buildParser|). If the parsing is', - ' * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.', - ' */', - ' parse: function(input, startRule) {', - ' var parseFunctions = {', - ' #for rule in node.rules', - ' #{string(rule.name) + ": parse_" + rule.name + (rule !== node.rules[node.rules.length - 1] ? "," : "")}', - ' #end', - ' };', - ' ', - ' if (startRule !== undefined) {', - ' if (parseFunctions[startRule] === undefined) {', - ' throw new Error("Invalid rule name: " + quote(startRule) + ".");', - ' }', - ' } else {', - ' startRule = #{string(node.startRule)};', - ' }', - ' ', - ' #{posInit("pos")};', - ' var reportFailures = 0;', // 0 = report, anything > 0 = do not report - ' #{posInit("rightmostFailuresPos")};', - ' var rightmostFailuresExpected = [];', - ' #if options.cache', - ' var cache = {};', - ' #end', - ' ', - /* This needs to be in sync with |padLeft| in utils.js. */ - ' function padLeft(input, padding, length) {', - ' var result = input;', - ' ', - ' var padLength = length - input.length;', - ' for (var i = 0; i < padLength; i++) {', - ' result = padding + result;', - ' }', - ' ', - ' return result;', - ' }', - ' ', - /* This needs to be in sync with |escape| in utils.js. */ - ' function escape(ch) {', - ' var charCode = ch.charCodeAt(0);', - ' var escapeChar;', - ' var length;', - ' ', - ' if (charCode <= 0xFF) {', - ' escapeChar = \'x\';', - ' length = 2;', - ' } else {', - ' escapeChar = \'u\';', - ' length = 4;', - ' }', - ' ', - ' return \'\\\\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), \'0\', length);', - ' }', - ' ', - ' #if options.trackLineAndColumn', - ' function clone(object) {', - ' var result = {};', - ' for (var key in object) {', - ' result[key] = object[key];', - ' }', - ' return result;', - ' }', - ' ', - ' function advance(pos, n) {', - ' var endOffset = pos.offset + n;', - ' ', - ' for (var offset = pos.offset; offset < endOffset; offset++) {', - ' var ch = input.charAt(offset);', - ' if (ch === "\\n") {', - ' if (!pos.seenCR) { pos.line++; }', - ' pos.column = 1;', - ' pos.seenCR = false;', - ' } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {', - ' pos.line++;', - ' pos.column = 1;', - ' pos.seenCR = true;', - ' } else {', - ' pos.column++;', - ' pos.seenCR = false;', - ' }', - ' }', - ' ', - ' pos.offset += n;', - ' }', - ' ', - ' #end', - ' function matchFailed(failure) {', - ' if (#{posOffset("pos")} < #{posOffset("rightmostFailuresPos")}) {', - ' return;', - ' }', - ' ', - ' if (#{posOffset("pos")} > #{posOffset("rightmostFailuresPos")}) {', - ' rightmostFailuresPos = #{posClone("pos")};', - ' rightmostFailuresExpected = [];', - ' }', - ' ', - ' rightmostFailuresExpected.push(failure);', - ' }', - ' ', - ' #for rule in node.rules', - ' #block emit(rule)', - ' ', - ' #end', - ' ', - ' function cleanupExpected(expected) {', - ' expected.sort();', - ' ', - ' var lastExpected = null;', - ' var cleanExpected = [];', - ' for (var i = 0; i < expected.length; i++) {', - ' if (expected[i] !== lastExpected) {', - ' cleanExpected.push(expected[i]);', - ' lastExpected = expected[i];', - ' }', - ' }', - ' return cleanExpected;', - ' }', - ' ', - ' #if !options.trackLineAndColumn', - ' function computeErrorPosition() {', - ' /*', - ' * The first idea was to use |String.split| to break the input up to the', - ' * error position along newlines and derive the line and column from', - ' * there. However IE\'s |split| implementation is so broken that it was', - ' * enough to prevent it.', - ' */', - ' ', - ' var line = 1;', - ' var column = 1;', - ' var seenCR = false;', - ' ', - ' for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) {', - ' var ch = input.charAt(i);', - ' if (ch === "\\n") {', - ' if (!seenCR) { line++; }', - ' column = 1;', - ' seenCR = false;', - ' } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {', - ' line++;', - ' column = 1;', - ' seenCR = true;', - ' } else {', - ' column++;', - ' seenCR = false;', - ' }', - ' }', - ' ', - ' return { line: line, column: column };', - ' }', - ' #end', - ' ', - ' #if node.initializer', - ' #block emit(node.initializer)', - ' #end', - ' ', - ' var result = parseFunctions[startRule]();', - ' ', - ' /*', - ' * The parser is now in one of the following three states:', - ' *', - ' * 1. The parser successfully parsed the whole input.', - ' *', - ' * - |result !== null|', - ' * - |#{posOffset("pos")} === input.length|', - ' * - |rightmostFailuresExpected| may or may not contain something', - ' *', - ' * 2. The parser successfully parsed only a part of the input.', - ' *', - ' * - |result !== null|', - ' * - |#{posOffset("pos")} < input.length|', - ' * - |rightmostFailuresExpected| may or may not contain something', - ' *', - ' * 3. The parser did not successfully parse any part of the input.', - ' *', - ' * - |result === null|', - ' * - |#{posOffset("pos")} === 0|', - ' * - |rightmostFailuresExpected| contains at least one failure', - ' *', - ' * All code following this comment (including called functions) must', - ' * handle these states.', - ' */', - ' if (result === null || #{posOffset("pos")} !== input.length) {', - ' var offset = Math.max(#{posOffset("pos")}, #{posOffset("rightmostFailuresPos")});', - ' var found = offset < input.length ? input.charAt(offset) : null;', - ' #if options.trackLineAndColumn', - ' var errorPosition = #{posOffset("pos")} > #{posOffset("rightmostFailuresPos")} ? pos : rightmostFailuresPos;', - ' #else', - ' var errorPosition = computeErrorPosition();', - ' #end', - ' ', - ' throw new this.SyntaxError(', - ' cleanupExpected(rightmostFailuresExpected),', - ' found,', - ' offset,', - ' errorPosition.line,', - ' errorPosition.column', - ' );', - ' }', - ' ', - ' return result;', - ' },', - ' ', - ' /* Returns the parser source code. */', - ' toSource: function() { return this._source; }', - ' };', - ' ', - ' /* Thrown when a parser encounters a syntax error. */', - ' ', - ' result.SyntaxError = function(expected, found, offset, line, column) {', - ' function buildMessage(expected, found) {', - ' var expectedHumanized, foundHumanized;', - ' ', - ' switch (expected.length) {', - ' case 0:', - ' expectedHumanized = "end of input";', - ' break;', - ' case 1:', - ' expectedHumanized = expected[0];', - ' break;', - ' default:', - ' expectedHumanized = expected.slice(0, expected.length - 1).join(", ")', - ' + " or "', - ' + expected[expected.length - 1];', - ' }', - ' ', - ' foundHumanized = found ? quote(found) : "end of input";', - ' ', - ' return "Expected " + expectedHumanized + " but " + foundHumanized + " found.";', - ' }', - ' ', - ' this.name = "SyntaxError";', - ' this.expected = expected;', - ' this.found = found;', - ' this.message = buildMessage(expected, found);', - ' this.offset = offset;', - ' this.line = line;', - ' this.column = column;', - ' };', - ' ', - ' result.SyntaxError.prototype = Error.prototype;', - ' ', - ' return result;', - '})()' - ], - rule: [ - 'function parse_#{node.name}() {', - ' #if options.cache', - ' var cacheKey = "#{node.name}@" + #{posOffset("pos")};', - ' var cachedResult = cache[cacheKey];', - ' if (cachedResult) {', - ' pos = #{posClone("cachedResult.nextPos")};', - ' return cachedResult.result;', - ' }', - ' ', - ' #end', - ' #if node.resultVars.length > 0', - ' var #{node.resultVars.join(", ")};', - ' #end', - ' #if node.posVars.length > 0', - ' var #{node.posVars.join(", ")};', - ' #end', - ' ', - ' #if node.displayName !== null', - ' reportFailures++;', - ' #end', - ' #block emit(node.expression)', - ' #if node.displayName !== null', - ' reportFailures--;', - ' if (reportFailures === 0 && #{node.resultVar} === null) {', - ' matchFailed(#{string(node.displayName)});', - ' }', - ' #end', - ' #if options.cache', - ' ', - ' cache[cacheKey] = {', - ' nextPos: #{posClone("pos")},', - ' result: #{node.resultVar}', - ' };', - ' #end', - ' return #{node.resultVar};', - '}' - ], - choice: [ - '#block emit(alternative)', - '#block nextAlternativesCode' - ], - "choice.next": [ - 'if (#{node.resultVar} === null) {', - ' #block code', - '}' - ], - sequence: [ - '#{posSave(node)};', - '#block code' - ], - "sequence.iteration": [ - '#block emit(element)', - 'if (#{element.resultVar} !== null) {', - ' #block code', - '} else {', - ' #{node.resultVar} = null;', - ' #{posRestore(node)};', - '}' - ], - "sequence.inner": [ - '#{node.resultVar} = [#{pluck(node.elements, "resultVar").join(", ")}];' - ], - simple_and: [ - '#{posSave(node)};', - 'reportFailures++;', - '#block emit(node.expression)', - 'reportFailures--;', - 'if (#{node.resultVar} !== null) {', - ' #{node.resultVar} = "";', - ' #{posRestore(node)};', - '} else {', - ' #{node.resultVar} = null;', - '}' - ], - simple_not: [ - '#{posSave(node)};', - 'reportFailures++;', - '#block emit(node.expression)', - 'reportFailures--;', - 'if (#{node.resultVar} === null) {', - ' #{node.resultVar} = "";', - '} else {', - ' #{node.resultVar} = null;', - ' #{posRestore(node)};', - '}' - ], - semantic_and: [ - '#{node.resultVar} = (function(#{(options.trackLineAndColumn ? ["offset", "line", "column"] : ["offset"]).concat(keys(node.params)).join(", ")}) {#{node.code}})(#{(options.trackLineAndColumn ? ["pos.offset", "pos.line", "pos.column"] : ["pos"]).concat(values(node.params)).join(", ")}) ? "" : null;' - ], - semantic_not: [ - '#{node.resultVar} = (function(#{(options.trackLineAndColumn ? ["offset", "line", "column"] : ["offset"]).concat(keys(node.params)).join(", ")}) {#{node.code}})(#{(options.trackLineAndColumn ? ["pos.offset", "pos.line", "pos.column"] : ["pos"]).concat(values(node.params)).join(", ")}) ? null : "";' - ], - optional: [ - '#block emit(node.expression)', - '#{node.resultVar} = #{node.resultVar} !== null ? #{node.resultVar} : "";' - ], - zero_or_more: [ - '#{node.resultVar} = [];', - '#block emit(node.expression)', - 'while (#{node.expression.resultVar} !== null) {', - ' #{node.resultVar}.push(#{node.expression.resultVar});', - ' #block emit(node.expression)', - '}' - ], - one_or_more: [ - '#block emit(node.expression)', - 'if (#{node.expression.resultVar} !== null) {', - ' #{node.resultVar} = [];', - ' while (#{node.expression.resultVar} !== null) {', - ' #{node.resultVar}.push(#{node.expression.resultVar});', - ' #block emit(node.expression)', - ' }', - '} else {', - ' #{node.resultVar} = null;', - '}' - ], - action: [ - '#{posSave(node)};', - '#block emit(node.expression)', - 'if (#{node.resultVar} !== null) {', - ' #{node.resultVar} = (function(#{(options.trackLineAndColumn ? ["offset", "line", "column"] : ["offset"]).concat(keys(node.params)).join(", ")}) {#{node.code}})(#{(options.trackLineAndColumn ? [node.posVar + ".offset", node.posVar + ".line", node.posVar + ".column"] : [node.posVar]).concat(values(node.params)).join(", ")});', - '}', - 'if (#{node.resultVar} === null) {', - ' #{posRestore(node)};', - '}' - ], - rule_ref: [ - '#{node.resultVar} = parse_#{node.name}();' - ], - literal: [ - '#if node.value.length === 0', - ' #{node.resultVar} = "";', - '#else', - ' #if !node.ignoreCase', - ' #if node.value.length === 1', - ' if (input.charCodeAt(#{posOffset("pos")}) === #{node.value.charCodeAt(0)}) {', - ' #else', - ' if (input.substr(#{posOffset("pos")}, #{node.value.length}) === #{string(node.value)}) {', - ' #end', - ' #else', - /* - * One-char literals are not optimized when case-insensitive - * matching is enabled. This is because there is no simple way to - * lowercase a character code that works for character outside ASCII - * letters. Moreover, |toLowerCase| can change string length, - * meaning the result of lowercasing a character can be more - * characters. - */ - ' if (input.substr(#{posOffset("pos")}, #{node.value.length}).toLowerCase() === #{string(node.value.toLowerCase())}) {', - ' #end', - ' #if !node.ignoreCase', - ' #{node.resultVar} = #{string(node.value)};', - ' #else', - ' #{node.resultVar} = input.substr(#{posOffset("pos")}, #{node.value.length});', - ' #end', - ' #{posAdvance(node.value.length)};', - ' } else {', - ' #{node.resultVar} = null;', - ' if (reportFailures === 0) {', - ' matchFailed(#{string(string(node.value))});', - ' }', - ' }', - '#end' - ], - any: [ - 'if (input.length > #{posOffset("pos")}) {', - ' #{node.resultVar} = input.charAt(#{posOffset("pos")});', - ' #{posAdvance(1)};', - '} else {', - ' #{node.resultVar} = null;', - ' if (reportFailures === 0) {', - ' matchFailed("any character");', - ' }', - '}' - ], - "class": [ - 'if (#{regexp}.test(input.charAt(#{posOffset("pos")}))) {', - ' #{node.resultVar} = input.charAt(#{posOffset("pos")});', - ' #{posAdvance(1)};', - '} else {', - ' #{node.resultVar} = null;', - ' if (reportFailures === 0) {', - ' matchFailed(#{string(node.rawText)});', - ' }', - '}' - ] - }; - - for (name in sources) { - templates[name] = Codie.template(sources[name].join('\n')); - } - - return templates; - })(); - - function fill(name, vars) { - vars.string = quote; - vars.pluck = pluck; - vars.keys = keys; - vars.values = values; - vars.emit = emit; - vars.options = options; - - /* Position-handling macros */ - if (options.trackLineAndColumn) { - vars.posInit = function(name) { - return "var " - + name - + " = " - + "{ offset: 0, line: 1, column: 1, seenCR: false }"; - }; - vars.posClone = function(name) { return "clone(" + name + ")"; }; - vars.posOffset = function(name) { return name + ".offset"; }; - - vars.posAdvance = function(n) { return "advance(pos, " + n + ")"; }; - } else { - vars.posInit = function(name) { return "var " + name + " = 0"; }; - vars.posClone = function(name) { return name; }; - vars.posOffset = function(name) { return name; }; - - vars.posAdvance = function(n) { - return n === 1 ? "pos++" : "pos += " + n; - }; - } - vars.posSave = function(node) { - return node.posVar + " = " + vars.posClone("pos"); - }; - vars.posRestore = function(node) { - return "pos" + " = " + vars.posClone(node.posVar); - }; - - return templates[name](vars); - } - - function emitSimple(name) { - return function(node) { return fill(name, { node: node }); }; - } - - var emit = buildNodeVisitor({ - grammar: emitSimple("grammar"), - - initializer: function(node) { return node.code; }, - - rule: emitSimple("rule"), - - /* - * The contract for all code fragments generated by the following functions - * is as follows. - * - * The code fragment tries to match a part of the input starting with the - * position indicated in |pos|. That position may point past the end of the - * input. - * - * * If the code fragment matches the input, it advances |pos| to point to - * the first chracter following the matched part of the input and sets - * variable with a name stored in |node.resultVar| to an appropriate - * value. This value is always non-|null|. - * - * * If the code fragment does not match the input, it returns with |pos| - * set to the original value and it sets a variable with a name stored in - * |node.resultVar| to |null|. - * - * The code can use variables with names stored in |resultVar| and |posVar| - * properties of the current node's subnodes. It can't use any other - * variables. - */ - - choice: function(node) { - var code, nextAlternativesCode; - - for (var i = node.alternatives.length - 1; i >= 0; i--) { - nextAlternativesCode = i !== node.alternatives.length - 1 - ? fill("choice.next", { node: node, code: code }) - : ''; - code = fill("choice", { - alternative: node.alternatives[i], - nextAlternativesCode: nextAlternativesCode - }); - } - - return code; - }, - - sequence: function(node) { - var code = fill("sequence.inner", { node: node }); - - for (var i = node.elements.length - 1; i >= 0; i--) { - code = fill("sequence.iteration", { - node: node, - element: node.elements[i], - code: code - }); - } - - return fill("sequence", { node: node, code: code }); - }, - - labeled: function(node) { return emit(node.expression); }, - - simple_and: emitSimple("simple_and"), - simple_not: emitSimple("simple_not"), - semantic_and: emitSimple("semantic_and"), - semantic_not: emitSimple("semantic_not"), - optional: emitSimple("optional"), - zero_or_more: emitSimple("zero_or_more"), - one_or_more: emitSimple("one_or_more"), - action: emitSimple("action"), - rule_ref: emitSimple("rule_ref"), - literal: emitSimple("literal"), - any: emitSimple("any"), - - "class": function(node) { - var regexp; - - if (node.parts.length > 0) { - regexp = '/^[' - + (node.inverted ? '^' : '') - + map(node.parts, function(part) { - return part instanceof Array - ? quoteForRegexpClass(part[0]) - + '-' - + quoteForRegexpClass(part[1]) - : quoteForRegexpClass(part); - }).join('') - + ']/' + (node.ignoreCase ? 'i' : ''); - } else { - /* - * Stupid IE considers regexps /[]/ and /[^]/ syntactically invalid, so - * we translate them into euqivalents it can handle. - */ - regexp = node.inverted ? '/^[\\S\\s]/' : '/^(?!)/'; - } - - return fill("class", { node: node, regexp: regexp }); - } - }); - - return emit(ast); -}; - -return PEG; - -})(); - -if (typeof module !== "undefined") { - module.exports = PEG; -} From 8f177c3835598d2d5919eea08a0f269d3a95f58b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 17:43:33 -0700 Subject: [PATCH 073/281] Remove unused $native.md5ForPath() --- native/v8_extensions/native.mm | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index 8d7705a79..ee8ef0112 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -25,7 +25,7 @@ namespace v8_extensions { const char* methodNames[] = { "absolute", "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", - "moveToTrash", "reload", "md5ForPath", "getPlatform", "setWindowState", + "moveToTrash", "reload", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" }; @@ -159,23 +159,6 @@ namespace v8_extensions { else if (name == "reload") { CefV8Context::GetCurrentContext()->GetBrowser()->ReloadIgnoreCache(); } - else if (name == "md5ForPath") { - NSString *path = stringFromCefV8Value(arguments[0]); - unsigned char outputData[CC_MD5_DIGEST_LENGTH]; - - NSData *inputData = [[NSData alloc] initWithContentsOfFile:path]; - CC_MD5([inputData bytes], [inputData length], outputData); - [inputData release]; - - NSMutableString *hash = [[NSMutableString alloc] init]; - - for (NSUInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { - [hash appendFormat:@"%02x", outputData[i]]; - } - - retval = CefV8Value::CreateString([hash UTF8String]); - return true; - } else if (name == "getPlatform") { retval = CefV8Value::CreateString("mac"); return true; From c64d07d506e98d31921572263ca8c021b652aea2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 17:49:05 -0700 Subject: [PATCH 074/281] Return false if stat exception is thrown Calling exists() and then statSync() ends up stat'ing the file twice so removing the exists() check saves a stat call. --- src/stdlib/fs-utils.coffee | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/stdlib/fs-utils.coffee b/src/stdlib/fs-utils.coffee index 10661b2b1..1b3d8a46f 100644 --- a/src/stdlib/fs-utils.coffee +++ b/src/stdlib/fs-utils.coffee @@ -51,12 +51,20 @@ module.exports = # Returns true if the file specified by path exists and is a # directory. isDirectory: (path) -> - @exists(path) and fs.statSync(path).isDirectory() + return false unless path?.length > 0 + try + fs.statSync(path).isDirectory() + catch e + false # Returns true if the file specified by path exists and is a # regular file. isFile: (path) -> - @exists(path) and fs.statSync(path).isFile() + return false unless path?.length > 0 + try + path? and fs.statSync(path).isFile() + catch e + false # Returns an array with all the names of files contained # in the directory path. From 990f5a92ced25454c82d6dc61e3014038cd86410 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 17:58:32 -0700 Subject: [PATCH 075/281] Remove vendor/packages from search paths This folder only contains text mate bundles which can't be directly required. --- native/atom_window_controller.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 72ad79d9d..0663ad2fa 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -59,7 +59,6 @@ @"src/app", @"src/packages", @"src", - @"vendor/packages", @"vendor", @"static", @"themes", From 426fc7ffc8ed162ca68edd9bf5fd7ee11f83f83e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 18:03:47 -0700 Subject: [PATCH 076/281] Remove themes from node search path --- native/atom_window_controller.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index 0663ad2fa..b9fdf7cd7 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -61,7 +61,6 @@ @"src", @"vendor", @"static", - @"themes", @"node_modules", nil]; NSMutableArray *resourcePaths = [[NSMutableArray alloc] init]; From 65d5e631f8c663e0aed44fc61dbd8af6a55a64ca Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 Mar 2013 19:41:42 -0700 Subject: [PATCH 077/281] Remove $native.absolute() fs-utils.absolute() now recreates the same behavior but instead using fs.readpathSync(). This brings over the same behavior for special handling the /private directory for now. --- native/v8_extensions/native.mm | 14 ++------------ src/stdlib/fs-utils.coffee | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/native/v8_extensions/native.mm b/native/v8_extensions/native.mm index ee8ef0112..4fdd43888 100644 --- a/native/v8_extensions/native.mm +++ b/native/v8_extensions/native.mm @@ -23,7 +23,7 @@ namespace v8_extensions { void Native::CreateContextBinding(CefRefPtr context) { const char* methodNames[] = { - "absolute", "writeToPasteboard", "readFromPasteboard", "quit", + "writeToPasteboard", "readFromPasteboard", "quit", "watchPath", "unwatchPath", "getWatchedPaths", "unwatchAllPaths", "moveToTrash", "reload", "getPlatform", "setWindowState", "getWindowState", "isMisspelled", "getCorrectionsForMisspelling" @@ -47,17 +47,7 @@ namespace v8_extensions { CefRefPtr& retval, CefString& exception) { @autoreleasepool { - if (name == "absolute") { - NSString *path = stringFromCefV8Value(arguments[0]); - - path = [path stringByStandardizingPath]; - if ([path characterAtIndex:0] == '/') { - retval = CefV8Value::CreateString([path UTF8String]); - } - - return true; - } - else if (name == "writeToPasteboard") { + if (name == "writeToPasteboard") { NSString *text = stringFromCefV8Value(arguments[0]); NSPasteboard *pb = [NSPasteboard generalPasteboard]; diff --git a/src/stdlib/fs-utils.coffee b/src/stdlib/fs-utils.coffee index 1b3d8a46f..ad1260e83 100644 --- a/src/stdlib/fs-utils.coffee +++ b/src/stdlib/fs-utils.coffee @@ -10,7 +10,21 @@ module.exports = # Make the given path absolute by resolving it against the # current working directory. absolute: (path) -> - $native.absolute(path) + return null unless path? + + if path.indexOf('~/') is 0 + if process.platform is 'win32' + home = process.env.USERPROFILE + else + home = process.env.HOME + path = "#{home}#{path.substring(1)}" + try + path = fs.realpathSync(path) + if process.platform is 'darwin' and path.indexOf('/private/') is 0 + path = path.substring(8) + path + catch e + path # Return the basename of the given path. That is the path with # any leading directory components removed. If specified, also From 347ba6c7eeb2f590f95c3346d7db6d0a741b7f8a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 13 Mar 2013 20:15:41 +0800 Subject: [PATCH 078/281] Bundle offical node binary with Atom. This is required for using child_process.fork. --- .gitignore | 1 + Rakefile | 7 ++++++- atom.gyp | 7 +++++++ script/update-node | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100755 script/update-node diff --git a/.gitignore b/.gitignore index 678779b26..225a18f7d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ npm-debug.log /tags /cef/ /sources.gypi +/node/node diff --git a/Rakefile b/Rakefile index a45f7d722..88da1f573 100644 --- a/Rakefile +++ b/Rakefile @@ -12,7 +12,7 @@ task :build => "create-xcode-project" do end desc "Create xcode project from gyp file" -task "create-xcode-project" => "update-cef" do +task "create-xcode-project" => ["update-cef", "update-node"] do `rm -rf atom.xcodeproj` `script/generate-sources-gypi` `gyp --depth=. -D CODE_SIGN="#{ENV['CODE_SIGN']}" atom.gyp` @@ -26,6 +26,11 @@ task "update-cef" => "bootstrap" do end end +desc "Download node binary" +task "update-node" do + `script/update-node` +end + desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do sh %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} diff --git a/atom.gyp b/atom.gyp index c736e886f..8118ea271 100644 --- a/atom.gyp +++ b/atom.gyp @@ -144,6 +144,13 @@ 'cef/Resources', ], }, + { + # Copy node binary for worker process support. + 'destination': '<(PRODUCT_DIR)/Atom.app/Contents/Resources', + 'files': [ + 'node/node', + ], + }, ], 'postbuilds': [ { diff --git a/script/update-node b/script/update-node new file mode 100755 index 000000000..0de03ffdf --- /dev/null +++ b/script/update-node @@ -0,0 +1,43 @@ +#!/bin/bash + +set -e + +cd "$(dirname $0)/.." + +# Test whether we need update. +if [ -d "node/node" ]; then + exit 0 +fi + +if ! DOWNLOAD_PAGE=$(curl -fsSkL http://nodejs.org/download/); then + exit 1; +fi + +NODE_VERSION=$(echo "$DOWNLOAD_PAGE" \ + | awk '/Current version:/ { print }' \ + | awk -F"[<>]" '{ print $5 }') + +case $OSTYPE in + darwin*) NODE_PLATFORM=darwin ;; + linux*) NODE_PLATFORM=linux ;; + *) echo "Unsupported platform $OSTYPE" && exit 1 ;; +esac + +if uname -a | grep 'x86_64' > /dev/null ; then + NODE_ARCH=x64 +else + NODE_ARCH=x86 +fi + +NODE_DIST_NAME="node-$NODE_VERSION-$NODE_PLATFORM-$NODE_ARCH" + +# Download node and untar +NODE_TARBALL_URL="http://nodejs.org/dist/$NODE_VERSION/$NODE_DIST_NAME.tar.gz" +TARGET_DIR='node' +[ -d "$TARGET_DIR" ] || mkdir "$TARGET_DIR" +cd "$TARGET_DIR" +curl -fsSkL $NODE_TARBALL_URL | tar -zx || exit 1 + +cp "$NODE_DIST_NAME/bin/node" . +rm -rf "$NODE_DIST_NAME" + From c393a0677ef56a54643bc9bef89524b68d5ac55e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 13 Mar 2013 21:57:12 +0800 Subject: [PATCH 079/281] Update cefode for child_process.fork. --- Rakefile | 4 ++-- script/update-node | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index 88da1f573..581ea4167 100644 --- a/Rakefile +++ b/Rakefile @@ -20,7 +20,7 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - exit 1 unless system %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{prebuilt-cef/script/download -b 1424 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -33,7 +33,7 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - sh %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{prebuilt-cef/script/download -b 1424 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do diff --git a/script/update-node b/script/update-node index 0de03ffdf..e3a249707 100755 --- a/script/update-node +++ b/script/update-node @@ -5,7 +5,7 @@ set -e cd "$(dirname $0)/.." # Test whether we need update. -if [ -d "node/node" ]; then +if [ -f "node/node" ]; then exit 0 fi From 2b35eaa41404da6e19c9efdcd7c8360506bfb91a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 Mar 2013 08:39:52 -0700 Subject: [PATCH 080/281] Update python bundle to 70dd4be Adds .gypi to file types --- vendor/packages/python.tmbundle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/packages/python.tmbundle b/vendor/packages/python.tmbundle index df88cd66d..70dd4be1f 160000 --- a/vendor/packages/python.tmbundle +++ b/vendor/packages/python.tmbundle @@ -1 +1 @@ -Subproject commit df88cd66d00ed44b1d1a212a347334bb8308299c +Subproject commit 70dd4be1f12d6e5b2f9238f04e38567f7cebfe4c From 0df07a8c29762f35b2031edef1305f00e1b5ef10 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 Mar 2013 09:07:22 -0700 Subject: [PATCH 081/281] Upgrade to git-utils 0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5274f8000..33c61a66c 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "ctags": "0.1.0", "oniguruma": "0.5.0", "mkdirp": "0.3.5", - "git-utils": "0.3.0", + "git-utils": "0.5.0", "underscore": "1.4.4", "d3": "3.0.8", "coffee-cache": "0.1.0", From 20e2f2bb7ca47348b7745b12023c79b4e16e666c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 14 Mar 2013 01:14:42 +0800 Subject: [PATCH 082/281] Update cefode. This fixed two crashes: 1. (message loop) Crash occurred from micro webkit supression. 2. (cef) Random startup crash caused by proxy service initialization. --- .gitignore | 2 +- Rakefile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 225a18f7d..60a6a3e25 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ npm-debug.log /tags /cef/ /sources.gypi -/node/node +/node/ diff --git a/Rakefile b/Rakefile index 581ea4167..e96eb72e7 100644 --- a/Rakefile +++ b/Rakefile @@ -20,7 +20,7 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - exit 1 unless system %{prebuilt-cef/script/download -b 1424 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{prebuilt-cef/script/download -b 1426 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -33,7 +33,7 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - sh %{prebuilt-cef/script/download -b 1424 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{prebuilt-cef/script/download -b 1426 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do From 8fe9e31c08df5e82e1878b90640cfb1bdfc4b9f4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 Mar 2013 11:27:54 -0700 Subject: [PATCH 083/281] Don't use a web worker for loading all paths Instead use fs.realpath() and fs.stat() to walk the project tree asynchronously. --- .../lib/load-paths-handler.coffee | 23 ----------- .../fuzzy-finder/lib/load-paths-task.coffee | 38 +++++++++++++------ src/stdlib/fs-utils.coffee | 27 +++++++++++++ 3 files changed, 54 insertions(+), 34 deletions(-) delete mode 100644 src/packages/fuzzy-finder/lib/load-paths-handler.coffee diff --git a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee deleted file mode 100644 index 12ac60605..000000000 --- a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee +++ /dev/null @@ -1,23 +0,0 @@ -fs = require 'fs-utils' -_ = require 'underscore' - -module.exports = - loadPaths: (rootPath, ignoredNames, excludeGitIgnoredPaths) -> - if excludeGitIgnoredPaths - Git = require 'git' - repo = Git.open(rootPath, refreshOnWindowFocus: false) - - paths = [] - isIgnored = (path) -> - for segment in path.split('/') - return true if _.contains(ignoredNames, segment) - repo?.isPathIgnored(fs.join(rootPath, path)) - onFile = (path) -> - paths.push(path) unless isIgnored(path) - onDirectory = (path) -> - not isIgnored(path) - fs.traverseTree(rootPath, onFile, onDirectory) - - repo?.destroy() - - callTaskMethod('pathsLoaded', paths) diff --git a/src/packages/fuzzy-finder/lib/load-paths-task.coffee b/src/packages/fuzzy-finder/lib/load-paths-task.coffee index f2ff851b6..a674e958f 100644 --- a/src/packages/fuzzy-finder/lib/load-paths-task.coffee +++ b/src/packages/fuzzy-finder/lib/load-paths-task.coffee @@ -1,17 +1,33 @@ -Task = require 'task' +_ = require 'underscore' +fs = require 'fs-utils' module.exports = -class LoadPathsTask extends Task - constructor: (@callback) -> - super('fuzzy-finder/lib/load-paths-handler') +class LoadPathsTask + aborted: false - started: -> + constructor: (@callback) -> + + start: -> + rootPath = project.getPath() ignoredNames = config.get('fuzzyFinder.ignoredNames') ? [] ignoredNames = ignoredNames.concat(config.get('core.ignoredNames') ? []) - excludeGitIgnoredPaths = config.get('core.hideGitIgnoredFiles') - rootPath = project.getPath() - @callWorkerMethod('loadPaths', rootPath, ignoredNames, excludeGitIgnoredPaths) + ignoreGitIgnoredFiles = config.get('core.hideGitIgnoredFiles') - pathsLoaded: (paths) -> - @done() - @callback(paths) + paths = [] + isIgnored = (path) -> + for segment in path.split('/') + return true if _.contains(ignoredNames, segment) + ignoreGitIgnoredFiles and git?.isPathIgnored(fs.join(rootPath, path)) + onFile = (path) -> + return if @aborted + path = path.substring(rootPath.length + 1) + paths.push(path) unless isIgnored(path) + onDirectory = (path) => + not @aborted and not isIgnored(path.substring(rootPath.length + 1)) + onDone = => + @callback(paths) unless @aborted + + fs.traverseTreeAsync(rootPath, onFile, onDirectory, onDone) + + abort: -> + @aborted = true diff --git a/src/stdlib/fs-utils.coffee b/src/stdlib/fs-utils.coffee index ad1260e83..f129027a0 100644 --- a/src/stdlib/fs-utils.coffee +++ b/src/stdlib/fs-utils.coffee @@ -168,6 +168,33 @@ module.exports = traverse(rootPath, '', onFile, onDirectory) + traverseTreeAsync: (rootPath, onFile, onDirectory, onDone) -> + pathCounter = 0 + startPath = -> pathCounter++ + endPath = -> onDone() if --pathCounter is 0 + + traverse = (rootPath, onFile, onDirectory) => + startPath() + fs.readdir rootPath, (error, files) => + if error or files.length is 0 + endPath() + return + + for file in files + path = @join(rootPath, file) + do (path) => + startPath() + fs.stat path, (error, stats) => + unless error + if stats.isFile() + onFile(path) + else if stats.isDirectory() + traverse(path, onFile, onDirectory) if onDirectory(path) + endPath() + endPath() + + traverse(rootPath, onFile, onDirectory) + md5ForPath: (path) -> contents = fs.readFileSync(path) require('crypto').createHash('md5').update(contents).digest('hex') From 8dbcb44d06ca51975fe419e8ecef551bc186ad32 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 Mar 2013 14:39:19 -0700 Subject: [PATCH 084/281] Rename traverseTree to traverseTreeSync Also rename traverseTreeAsync to traverseTree --- spec/stdlib/fs-utils-spec.coffee | 10 +++++----- src/app/config.coffee | 4 ++-- src/app/project.coffee | 2 +- src/packages/fuzzy-finder/lib/load-paths-task.coffee | 2 +- src/stdlib/fs-utils.coffee | 8 ++++---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/spec/stdlib/fs-utils-spec.coffee b/spec/stdlib/fs-utils-spec.coffee index 4a4330069..ddd1f2e63 100644 --- a/spec/stdlib/fs-utils-spec.coffee +++ b/spec/stdlib/fs-utils-spec.coffee @@ -77,7 +77,7 @@ describe "fs", -> fs.makeTree("/tmp/a/b/c") expect(fs.exists("/tmp/a/b/c")).toBeTruthy() - describe ".traverseTree(path, onFile, onDirectory)", -> + describe ".traverseTreeSync(path, onFile, onDirectory)", -> fixturesDir = null beforeEach -> @@ -88,7 +88,7 @@ describe "fs", -> onPath = (path) -> paths.push(fs.join(fixturesDir, path)) true - fs.traverseTree fixturesDir, onPath, onPath + fs.traverseTreeSync fixturesDir, onPath, onPath expect(paths).toEqual fs.listTree(fixturesDir) it "does not recurse into a directory if it is pruned", -> @@ -99,7 +99,7 @@ describe "fs", -> else paths.push(path) true - fs.traverseTree fixturesDir, onPath, onPath + fs.traverseTreeSync fixturesDir, onPath, onPath expect(paths.length).toBeGreaterThan 0 for path in paths @@ -112,8 +112,8 @@ describe "fs", -> paths = [] onPath = (path) -> paths.push(path) - fs.traverseTree(fs.join(fixturesDir, 'symlink-to-dir'), onSymlinkPath, onSymlinkPath) - fs.traverseTree(fs.join(fixturesDir, 'dir'), onPath, onPath) + fs.traverseTreeSync(fs.join(fixturesDir, 'symlink-to-dir'), onSymlinkPath, onSymlinkPath) + fs.traverseTreeSync(fs.join(fixturesDir, 'dir'), onPath, onPath) expect(symlinkPaths).toEqual(paths) diff --git a/src/app/config.coffee b/src/app/config.coffee index ec54870c0..e816dc6de 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -39,14 +39,14 @@ class Config templatePath = fs.join(templateConfigDirPath, path) configPath = fs.join(@configDirPath, path) fs.write(configPath, fs.read(templatePath)) - fs.traverseTree(templateConfigDirPath, onConfigDirFile, (path) -> true) + fs.traverseTreeSync(templateConfigDirPath, onConfigDirFile, (path) -> true) configThemeDirPath = fs.join(@configDirPath, 'themes') onThemeDirFile = (path) -> templatePath = fs.join(bundledThemesDirPath, path) configPath = fs.join(configThemeDirPath, path) fs.write(configPath, fs.read(templatePath)) - fs.traverseTree(bundledThemesDirPath, onThemeDirFile, (path) -> true) + fs.traverseTreeSync(bundledThemesDirPath, onThemeDirFile, (path) -> true) load: -> @initializeConfigDirectory() diff --git a/src/app/project.coffee b/src/app/project.coffee index a0bee7fb2..678a4f2e7 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -70,7 +70,7 @@ class Project paths = [] onFile = (path) => paths.push(path) unless @isPathIgnored(path) onDirectory = -> true - fs.traverseTree(@getPath(), onFile, onDirectory) + fs.traverseTreeSync(@getPath(), onFile, onDirectory) deferred.resolve(paths) deferred.promise() diff --git a/src/packages/fuzzy-finder/lib/load-paths-task.coffee b/src/packages/fuzzy-finder/lib/load-paths-task.coffee index a674e958f..60a716688 100644 --- a/src/packages/fuzzy-finder/lib/load-paths-task.coffee +++ b/src/packages/fuzzy-finder/lib/load-paths-task.coffee @@ -27,7 +27,7 @@ class LoadPathsTask onDone = => @callback(paths) unless @aborted - fs.traverseTreeAsync(rootPath, onFile, onDirectory, onDone) + fs.traverseTree(rootPath, onFile, onDirectory, onDone) abort: -> @aborted = true diff --git a/src/stdlib/fs-utils.coffee b/src/stdlib/fs-utils.coffee index f129027a0..d024ae4df 100644 --- a/src/stdlib/fs-utils.coffee +++ b/src/stdlib/fs-utils.coffee @@ -92,7 +92,7 @@ module.exports = onPath = (path) => paths.push(@join(rootPath, path)) false - @traverseTree(rootPath, onPath, onPath) + @traverseTreeSync(rootPath, onPath, onPath) paths listTree: (rootPath) -> @@ -100,7 +100,7 @@ module.exports = onPath = (path) => paths.push(@join(rootPath, path)) true - @traverseTree(rootPath, onPath, onPath) + @traverseTreeSync(rootPath, onPath, onPath) paths move: (source, target) -> @@ -152,7 +152,7 @@ module.exports = @makeTree(@directory(path)) @makeDirectory(path) - traverseTree: (rootPath, onFile, onDirectory) -> + traverseTreeSync: (rootPath, onFile, onDirectory) -> return unless @isDirectory(rootPath) traverse = (rootPath, prefix, onFile, onDirectory) => @@ -168,7 +168,7 @@ module.exports = traverse(rootPath, '', onFile, onDirectory) - traverseTreeAsync: (rootPath, onFile, onDirectory, onDone) -> + traverseTree: (rootPath, onFile, onDirectory, onDone) -> pathCounter = 0 startPath = -> pathCounter++ endPath = -> onDone() if --pathCounter is 0 From aba0f8e3623258dbe0c15be4e187b3d9b1f9a7f7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 13 Mar 2013 18:58:22 -0600 Subject: [PATCH 085/281] Change condition for installing a local node-gyp --- script/bootstrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/bootstrap b/script/bootstrap index 7717ca80b..10f299940 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -21,7 +21,7 @@ exit_unless_npm_exists NODE_DIR="$HOME/.cefode-gyp" NODE_VERSION="0.8.21" NODE_URL="https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/dist" -if [ ! -d "$NODE_DIR" ]; then +if [ ! -d "node_modules/node-gyp" ]; then npm install node-gyp HOME="$NODE_DIR" node-gyp install --target="$NODE_VERSION" --dist-url="$NODE_URL" --arch=ia32 fi From 460577d9ae0a71bd65eb7ad327ea6b2d12c0bc4f Mon Sep 17 00:00:00 2001 From: John Barnette Date: Wed, 13 Mar 2013 19:40:35 -0700 Subject: [PATCH 086/281] Spike optional doc: key for command This isn't working yet. --- src/stdlib/jquery-extensions.coffee | 33 +++++++++++++++++++------ src/stdlib/underscore-extensions.coffee | 8 ++++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/stdlib/jquery-extensions.coffee b/src/stdlib/jquery-extensions.coffee index fe403c2a9..95c882471 100644 --- a/src/stdlib/jquery-extensions.coffee +++ b/src/stdlib/jquery-extensions.coffee @@ -59,7 +59,12 @@ $.fn.trueHeight = -> $.fn.trueWidth = -> this[0].getBoundingClientRect().width -$.fn.document = (eventDescriptions) -> +$.fn.document = (eventDescriptions, optionalDoc) -> + if optionalDoc + eventName = eventDescriptions + eventDescriptions = {} + eventDescriptions[eventName] = optionalDoc + @data('documentation', {}) unless @data('documentation') _.extend(@data('documentation'), eventDescriptions) @@ -75,12 +80,26 @@ $.fn.events = -> else events -$.fn.command = (args...) -> - eventName = args[0] - documentation = {} - documentation[eventName] = _.humanizeEventName(eventName) - @document(documentation) - @on(args...) +# Valid calling styles: +# command(eventName, handler) +# command(eventName, selector, handler) +# command(eventName, options, handler) +# command(eventName, selector, options, handler) +$.fn.command = (eventName, selector, options, handler) -> + if not options? and not handler? + handler = selector + selector = null + else if not handler? + handler = options + options = null + + if selector? and typeof(selector) is 'object' + handler = options + options = selector + selector = null + + @document(eventName, _.humanizeEventName(eventName, options?["xxx"])) + @on(eventName, selector, options?['data'], handler) $.fn.iconSize = (size) -> @width(size).height(size).css('font-size', size) diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index df5865b24..824424099 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -52,10 +52,14 @@ _.mixin regex = RegExp('[' + specials.join('\\') + ']', 'g') string.replace(regex, "\\$&"); - humanizeEventName: (eventName) -> + humanizeEventName: (eventName, optionalDocString) -> + return "GitHub" if eventName.toLowerCase() is "github" + if /:/.test(eventName) [namespace, name] = eventName.split(':') - return "#{@humanizeEventName(namespace)}: #{@humanizeEventName(name)}" + return "#{@humanizeEventName(namespace)}: #{@humanizeEventName(name, optionalDocString)}" + + return optionalDocString if not _.isEmpty(optionalDocString) words = eventName.split('-') words.map(_.capitalize).join(' ') From eb5d0fe3f5bbb774aaee1c9fc5d6528b90adb466 Mon Sep 17 00:00:00 2001 From: John Barnette Date: Wed, 13 Mar 2013 21:30:00 -0700 Subject: [PATCH 087/281] Actually make doc: work --- src/stdlib/jquery-extensions.coffee | 10 ++-------- src/stdlib/underscore-extensions.coffee | 16 +++++++++------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/stdlib/jquery-extensions.coffee b/src/stdlib/jquery-extensions.coffee index 95c882471..80397f975 100644 --- a/src/stdlib/jquery-extensions.coffee +++ b/src/stdlib/jquery-extensions.coffee @@ -80,13 +80,8 @@ $.fn.events = -> else events -# Valid calling styles: -# command(eventName, handler) -# command(eventName, selector, handler) -# command(eventName, options, handler) -# command(eventName, selector, options, handler) $.fn.command = (eventName, selector, options, handler) -> - if not options? and not handler? + if not options? handler = selector selector = null else if not handler? @@ -94,11 +89,10 @@ $.fn.command = (eventName, selector, options, handler) -> options = null if selector? and typeof(selector) is 'object' - handler = options options = selector selector = null - @document(eventName, _.humanizeEventName(eventName, options?["xxx"])) + @document(eventName, _.humanizeEventName(eventName, options?["doc"])) @on(eventName, selector, options?['data'], handler) $.fn.iconSize = (size) -> diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index 824424099..f490b7715 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -52,17 +52,16 @@ _.mixin regex = RegExp('[' + specials.join('\\') + ']', 'g') string.replace(regex, "\\$&"); - humanizeEventName: (eventName, optionalDocString) -> + humanizeEventName: (eventName, eventDoc) -> return "GitHub" if eventName.toLowerCase() is "github" - if /:/.test(eventName) - [namespace, name] = eventName.split(':') - return "#{@humanizeEventName(namespace)}: #{@humanizeEventName(name, optionalDocString)}" + [namespace, event] = eventName.split(':') + return _.capitalize(namespace) unless event? - return optionalDocString if not _.isEmpty(optionalDocString) + namespaceDoc = _.undasherize(namespace) + eventDoc ||= _.undasherize(event) - words = eventName.split('-') - words.map(_.capitalize).join(' ') + "#{namespaceDoc}: #{eventDoc}" capitalize: (word) -> word[0].toUpperCase() + word[1..] @@ -84,6 +83,9 @@ _.mixin else "-" + undasherize: (string) -> + string.split('-').map(_.capitalize).join(' ') + underscore: (string) -> string = string[0].toLowerCase() + string[1..] string.replace /([A-Z])|(-)/g, (m, letter, dash) -> From 12d3686cb627065efb9fe6999b63dfbb835a7720 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 14 Mar 2013 19:24:30 +0800 Subject: [PATCH 088/281] Update cefode: fix crash when throw error from node module's callback. --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index e96eb72e7..dedb3643f 100644 --- a/Rakefile +++ b/Rakefile @@ -20,7 +20,7 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - exit 1 unless system %{prebuilt-cef/script/download -b 1426 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{prebuilt-cef/script/download -b 1427 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -33,7 +33,7 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - sh %{prebuilt-cef/script/download -b 1426 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{prebuilt-cef/script/download -b 1427 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do From 25839c5cf52bf3092dad99441c249441f23c8e5a Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 14 Mar 2013 11:15:55 -0600 Subject: [PATCH 089/281] Add spec coverage for `$.fn.command` --- spec/stdlib/jquery-extensions-spec.coffee | 41 +++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/spec/stdlib/jquery-extensions-spec.coffee b/spec/stdlib/jquery-extensions-spec.coffee index 4bdd8fd11..f0962a200 100644 --- a/spec/stdlib/jquery-extensions-spec.coffee +++ b/spec/stdlib/jquery-extensions-spec.coffee @@ -77,6 +77,47 @@ describe 'jQuery extensions', -> 'a1': "A1: Waste perfectly-good steak" 'a2': null + describe "$.fn.command(eventName, [selector, options,] handler)", -> + [view, handler] = [] + + beforeEach -> + view = $$ -> + @div class: 'a', => + @div class: 'b' + @div class: 'c' + handler = jasmine.createSpy("commandHandler") + + it "binds the handler to the given event / selector for all argument combinations", -> + view.command 'test:foo', handler + view.trigger 'test:foo' + expect(handler).toHaveBeenCalled() + handler.reset() + + view.command 'test:bar', '.b', handler + view.find('.b').trigger 'test:bar' + view.find('.c').trigger 'test:bar' + expect(handler.callCount).toBe 1 + handler.reset() + + view.command 'test:baz', doc: 'Spaz', handler + view.trigger 'test:baz' + expect(handler).toHaveBeenCalled() + handler.reset() + + view.command 'test:quux', '.c', doc: 'Lorem', handler + view.find('.b').trigger 'test:quux' + view.find('.c').trigger 'test:quux' + expect(handler.callCount).toBe 1 + + it "passes the 'data' option through when binding the event handler", -> + view.command 'test:foo', data: "bar", handler + view.trigger 'test:foo' + expect(handler.argsForCall[0][0].data).toBe 'bar' + + it "sets a custom docstring if the 'doc' option is specified", -> + view.command 'test:foo', doc: "Foo!", handler + expect(view.events()).toEqual 'test:foo': 'Test: Foo!' + describe "$.fn.scrollUp/Down/ToTop/ToBottom", -> it "scrolls the element in the specified way if possible", -> view = $$ -> @div => _.times 20, => @div('A') From 634117ed66edd0be5ab4001c58732b17cd36dc34 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 14 Mar 2013 11:34:28 -0600 Subject: [PATCH 090/281] Make `$.fn.document` always take event name / doc string args It's simpler and we don't use the other syntax right now. --- spec/stdlib/jquery-extensions-spec.coffee | 14 ++++++-------- src/stdlib/jquery-extensions.coffee | 9 +++------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/spec/stdlib/jquery-extensions-spec.coffee b/spec/stdlib/jquery-extensions-spec.coffee index f0962a200..3b7ce522c 100644 --- a/spec/stdlib/jquery-extensions-spec.coffee +++ b/spec/stdlib/jquery-extensions-spec.coffee @@ -42,7 +42,7 @@ describe 'jQuery extensions', -> element.trigger 'foo' expect(events).toEqual [2,1,3] - describe "$.fn.events() and $.fn.document", -> + describe "$.fn.events() and $.fn.document(...)", -> it "returns a list of all events being listened for on the target node or its ancestors, along with their documentation string", -> view = $$ -> @div id: 'a', => @@ -50,20 +50,18 @@ describe 'jQuery extensions', -> @div id: 'c' @div id: 'd' - view.document - 'a1': "This is event A2" - 'b2': "This is event b2" + view.document 'a1', "This is event A2" + view.document 'b2', "This is event b2" - view.document 'a1': "A1: Waste perfectly-good steak" + view.document 'a1', "A1: Waste perfectly-good steak" view.on 'a1', -> view.on 'a2', -> view.on 'b1', -> # should not appear as a duplicate divB = view.find('#b') - divB.document - 'b1': "B1: Super-sonic bomber" - 'b2': "B2: Looks evil. Kinda is." + divB.document 'b1', "B1: Super-sonic bomber" + divB.document 'b2', "B2: Looks evil. Kinda is." divB.on 'b1', -> divB.on 'b2', -> diff --git a/src/stdlib/jquery-extensions.coffee b/src/stdlib/jquery-extensions.coffee index 80397f975..70d24fc3a 100644 --- a/src/stdlib/jquery-extensions.coffee +++ b/src/stdlib/jquery-extensions.coffee @@ -59,12 +59,9 @@ $.fn.trueHeight = -> $.fn.trueWidth = -> this[0].getBoundingClientRect().width -$.fn.document = (eventDescriptions, optionalDoc) -> - if optionalDoc - eventName = eventDescriptions - eventDescriptions = {} - eventDescriptions[eventName] = optionalDoc - +$.fn.document = (eventName, docString) -> + eventDescriptions = {} + eventDescriptions[eventName] = docString @data('documentation', {}) unless @data('documentation') _.extend(@data('documentation'), eventDescriptions) From a1882ffd1f1cc2b1cfb66cb5d7f03c898a1264bf Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 14 Mar 2013 11:35:06 -0600 Subject: [PATCH 091/281] Move "GitHub" special-case to `_.capitalize`. Add specs. --- spec/stdlib/jquery-extensions-spec.coffee | 4 ++++ src/stdlib/underscore-extensions.coffee | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/spec/stdlib/jquery-extensions-spec.coffee b/spec/stdlib/jquery-extensions-spec.coffee index 3b7ce522c..b803de4f1 100644 --- a/spec/stdlib/jquery-extensions-spec.coffee +++ b/spec/stdlib/jquery-extensions-spec.coffee @@ -116,6 +116,10 @@ describe 'jQuery extensions', -> view.command 'test:foo', doc: "Foo!", handler expect(view.events()).toEqual 'test:foo': 'Test: Foo!' + it "capitalizes the 'github' prefix how we like it", -> + view.command 'github:spelling', handler + expect(view.events()).toEqual 'github:spelling': 'GitHub: Spelling' + describe "$.fn.scrollUp/Down/ToTop/ToBottom", -> it "scrolls the element in the specified way if possible", -> view = $$ -> @div => _.times 20, => @div('A') diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index f490b7715..09c79c4f5 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -53,18 +53,19 @@ _.mixin string.replace(regex, "\\$&"); humanizeEventName: (eventName, eventDoc) -> - return "GitHub" if eventName.toLowerCase() is "github" - [namespace, event] = eventName.split(':') return _.capitalize(namespace) unless event? - namespaceDoc = _.undasherize(namespace) - eventDoc ||= _.undasherize(event) + namespaceDoc = _.undasherize(namespace) + eventDoc ?= _.undasherize(event) "#{namespaceDoc}: #{eventDoc}" capitalize: (word) -> - word[0].toUpperCase() + word[1..] + if word.toLowerCase() is 'github' + 'GitHub' + else + word[0].toUpperCase() + word[1..] pluralize: (count=0, singular, plural=singular+'s') -> if count is 1 From 836ff53ef3ff4715b4aedf7f7831a0c563ede472 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 14 Mar 2013 17:46:25 -0600 Subject: [PATCH 092/281] Load index.html based on the resource path Node uses the location of index as a starting point when looking for node_modules. Previously, we always loaded index.html out of the app bundle, which caused us to always load node_modules from the app bundle as well, which is not what we want in dev mode. Since we no longer depend on a compiled require.js, it's just as easy to load index.html from the repository path when in dev mode. --- native/atom_window_controller.mm | 47 ++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/native/atom_window_controller.mm b/native/atom_window_controller.mm index b9fdf7cd7..15788e534 100644 --- a/native/atom_window_controller.mm +++ b/native/atom_window_controller.mm @@ -26,26 +26,31 @@ [super dealloc]; } -- (id)initWithBootstrapScript:(NSString *)bootstrapScript background:(BOOL)background alwaysUseBundleResourcePath:(BOOL)alwaysUseBundleResourcePath { +- (id)initWithBootstrapScript:(NSString *)bootstrapScript background:(BOOL)background useBundleResourcePath:(BOOL)useBundleResourcePath { self = [super initWithWindowNibName:@"AtomWindow"]; _bootstrapScript = [bootstrapScript retain]; AtomApplication *atomApplication = (AtomApplication *)[AtomApplication sharedApplication]; - _resourcePath = [atomApplication.arguments objectForKey:@"resource-path"]; - if (!alwaysUseBundleResourcePath && !_resourcePath) { - NSString *defaultRepositoryPath = [@"~/github/atom" stringByStandardizingPath]; - if ([defaultRepositoryPath characterAtIndex:0] == '/') { - BOOL isDir = false; - BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:defaultRepositoryPath isDirectory:&isDir]; - if (isDir && exists) - _resourcePath = defaultRepositoryPath; - } - } - - if (alwaysUseBundleResourcePath || !_resourcePath) { + if (useBundleResourcePath) { _resourcePath = [[NSBundle bundleForClass:self.class] resourcePath]; } + else { + _resourcePath = [[atomApplication.arguments objectForKey:@"resource-path"] stringByStandardizingPath]; + if (!_resourcePath) { + NSString *defaultRepositoryPath = [@"~/github/atom" stringByStandardizingPath]; + if ([defaultRepositoryPath characterAtIndex:0] == '/') { + BOOL isDir = false; + BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:defaultRepositoryPath isDirectory:&isDir]; + if (isDir && exists) { + _resourcePath = defaultRepositoryPath; + } + else { + NSLog(@"Warning: No resource path specified and no directory exists at ~/github/atom"); + } + } + } + } if ([self isDevMode]) { [self displayDevIcon]; @@ -99,19 +104,19 @@ _pathToOpen = [path retain]; AtomApplication *atomApplication = (AtomApplication *)[AtomApplication sharedApplication]; BOOL useBundleResourcePath = [atomApplication.arguments objectForKey:@"dev"] == nil; - return [self initWithBootstrapScript:@"window-bootstrap" background:NO alwaysUseBundleResourcePath:useBundleResourcePath]; + return [self initWithBootstrapScript:@"window-bootstrap" background:NO useBundleResourcePath:useBundleResourcePath]; } - (id)initDevWithPath:(NSString *)path { _pathToOpen = [path retain]; - return [self initWithBootstrapScript:@"window-bootstrap" background:NO alwaysUseBundleResourcePath:false]; + return [self initWithBootstrapScript:@"window-bootstrap" background:NO useBundleResourcePath:false]; } - (id)initInBackground { AtomApplication *atomApplication = (AtomApplication *)[AtomApplication sharedApplication]; BOOL useBundleResourcePath = [atomApplication.arguments objectForKey:@"dev"] == nil; - [self initWithBootstrapScript:@"window-bootstrap" background:YES alwaysUseBundleResourcePath:useBundleResourcePath]; + [self initWithBootstrapScript:@"window-bootstrap" background:YES useBundleResourcePath:useBundleResourcePath]; [self.window setFrame:NSMakeRect(0, 0, 0, 0) display:NO]; [self.window setExcludedFromWindowsMenu:YES]; [self.window setCollectionBehavior:NSWindowCollectionBehaviorStationary]; @@ -121,13 +126,13 @@ - (id)initSpecsThenExit:(BOOL)exitWhenDone { _runningSpecs = true; _exitWhenDone = exitWhenDone; - return [self initWithBootstrapScript:@"spec-bootstrap" background:NO alwaysUseBundleResourcePath:NO]; + return [self initWithBootstrapScript:@"spec-bootstrap" background:NO useBundleResourcePath:NO]; } - (id)initBenchmarksThenExit:(BOOL)exitWhenDone { _runningSpecs = true; _exitWhenDone = exitWhenDone; - return [self initWithBootstrapScript:@"benchmark-bootstrap" background:NO alwaysUseBundleResourcePath:NO]; + return [self initWithBootstrapScript:@"benchmark-bootstrap" background:NO useBundleResourcePath:NO]; } - (void)addBrowserToView:(NSView *)view url:(const char *)url cefHandler:(CefRefPtr)cefClient { @@ -153,9 +158,11 @@ // have the correct initial size based on the frame's last stored size. // HACK: I hate this and want to place this code directly in windowDidLoad - (void)attachWebView { - NSURL *url = [[NSBundle bundleForClass:self.class] resourceURL]; NSMutableString *urlString = [NSMutableString string]; - [urlString appendString:[[url URLByAppendingPathComponent:@"static/index.html"] absoluteString]]; + + NSURL *indexUrl = [[NSURL alloc] initFileURLWithPath:[_resourcePath stringByAppendingPathComponent:@"static/index.html"]]; + NSLog(@"%@", [indexUrl absoluteString]); + [urlString appendString:[indexUrl absoluteString]]; [urlString appendFormat:@"?bootstrapScript=%@", [self encodeUrlParam:_bootstrapScript]]; [urlString appendFormat:@"&resourcePath=%@", [self encodeUrlParam:_resourcePath]]; if ([self isDevMode]) From fc7eaf57fcabe1ced46719db2bc9b9a988746339 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 14 Mar 2013 17:47:07 -0600 Subject: [PATCH 093/281] Add window.profile, which is like measure but also records a profile --- src/app/window.coffee | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/window.coffee b/src/app/window.coffee index e1748daf8..e13007169 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -168,3 +168,10 @@ window.measure = (description, fn) -> result = new Date().getTime() - start console.log description, result value + +window.profile = (description, fn) -> + measure description, -> + console.profile(description) + value = fn() + console.profileEnd(description) + value From 09259a579d4bb8d68a4a58851c3904aaa3742f7b Mon Sep 17 00:00:00 2001 From: John Barnette Date: Thu, 14 Mar 2013 18:06:55 -0700 Subject: [PATCH 094/281] Let's not accidentally publish this :heart: --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 1893b5e86..6633d19bd 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,8 @@ "coffee-script": "1.5" }, + "private": true, + "scripts": { "preinstall": "true" } From 875fbba0249c76d3ed37cc78e50f26c9640af1f7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 15 Mar 2013 09:09:56 -0600 Subject: [PATCH 095/281] Measure spec suite require time --- spec/spec-suite.coffee | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/spec/spec-suite.coffee b/spec/spec-suite.coffee index b2852b0cf..0c7ebc37e 100644 --- a/spec/spec-suite.coffee +++ b/spec/spec-suite.coffee @@ -1,12 +1,15 @@ -fs = require 'fs-utils' -require 'spec-helper' +require 'window' -# Run core specs -for path in fs.listTree(fs.resolveOnLoadPath("spec")) when /-spec\.coffee$/.test path - require path +measure 'spec suite require time', -> + fs = require 'fs-utils' + require 'spec-helper' -# Run extension specs -for packageDirPath in config.packageDirPaths - for packagePath in fs.list(packageDirPath) - for path in fs.listTree(fs.join(packagePath, "spec")) when /-spec\.coffee$/.test path - require path + # Run core specs + for path in fs.listTree(fs.resolveOnLoadPath("spec")) when /-spec\.coffee$/.test path + require path + + # Run extension specs + for packageDirPath in config.packageDirPaths + for packagePath in fs.list(packageDirPath) + for path in fs.listTree(fs.join(packagePath, "spec")) when /-spec\.coffee$/.test path + require path From a9b9e5651f4371621214d3f532fbeba9103aec73 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 16 Mar 2013 00:43:43 +0800 Subject: [PATCH 096/281] Update cefode: speed up node's requrie by removing exceptions. --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index dedb3643f..88da1f573 100644 --- a/Rakefile +++ b/Rakefile @@ -20,7 +20,7 @@ end desc "Update CEF to the latest version specified by the prebuilt-cef submodule" task "update-cef" => "bootstrap" do - exit 1 unless system %{prebuilt-cef/script/download -b 1427 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} + exit 1 unless system %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -f cef} Dir.glob('cef/*.gypi').each do |filename| `sed -i '' -e "s/'include\\//'cef\\/include\\//" -e "s/'libcef_dll\\//'cef\\/libcef_dll\\//" #{filename}` end @@ -33,7 +33,7 @@ end desc "Download debug symbols for CEF" task "download-cef-symbols" => "update-cef" do - sh %{prebuilt-cef/script/download -b 1427 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} + sh %{prebuilt-cef/script/download -b 1423 -r 1135 -d https://gh-contractor-zcbenz.s3.amazonaws.com/cefode/prebuilt-cef -s cef} end task "bootstrap" do From cdb7f14c035f7cf6bc6cb8eb50a7d5a68b2d7a92 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sun, 17 Mar 2013 17:19:22 -0500 Subject: [PATCH 097/281] Release repository when worker is done Closes #414 --- package.json | 2 +- src/app/repository-status-handler.coffee | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 33c61a66c..9a9140974 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "ctags": "0.1.0", "oniguruma": "0.5.0", "mkdirp": "0.3.5", - "git-utils": "0.5.0", + "git-utils": "0.6.0", "underscore": "1.4.4", "d3": "3.0.8", "coffee-cache": "0.1.0", diff --git a/src/app/repository-status-handler.coffee b/src/app/repository-status-handler.coffee index a6699942a..3b55acdb5 100644 --- a/src/app/repository-status-handler.coffee +++ b/src/app/repository-status-handler.coffee @@ -10,6 +10,7 @@ module.exports = for path, status of repo.getStatuses() statuses[fs.join(workingDirectoryPath, path)] = status upstream = repo.getAheadBehindCount() + repo.release() else upstream = {} statuses = {} From b01a3ff9cc4d915c0741ccdda3d95ff16f57af24 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Sun, 17 Mar 2013 21:46:26 -0500 Subject: [PATCH 098/281] Release repo when destroy is called --- src/app/git.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/git.coffee b/src/app/git.coffee index c295f1c6d..21128dfbd 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -56,7 +56,10 @@ class Git @statusTask.off() @statusTask = null - @repo = null + if @repo? + @repo.release() + @repo = null + @unsubscribe() getWorkingDirectory: -> From e5436974eb451eb269b1359e5e6bed2111df506c Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 14 Mar 2013 16:46:08 -0600 Subject: [PATCH 099/281] Replace snippet loader task w/ async loading --- package.json | 3 +- .../snippets/lib/load-snippets-handler.coffee | 56 ------------ .../snippets/lib/load-snippets-task.coffee | 34 ------- src/packages/snippets/lib/snippets.coffee | 91 ++++++++++++++++--- .../snippets/spec/snippets-spec.coffee | 36 ++------ src/stdlib/cson.coffee | 22 +++-- src/stdlib/fs-utils.coffee | 13 +++ 7 files changed, 118 insertions(+), 137 deletions(-) delete mode 100644 src/packages/snippets/lib/load-snippets-handler.coffee delete mode 100644 src/packages/snippets/lib/load-snippets-task.coffee diff --git a/package.json b/package.json index 9a9140974..caa23521f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "underscore": "1.4.4", "d3": "3.0.8", "coffee-cache": "0.1.0", - "pegjs": "0.7.0" + "pegjs": "0.7.0", + "async": "0.2.6" }, "scripts": { diff --git a/src/packages/snippets/lib/load-snippets-handler.coffee b/src/packages/snippets/lib/load-snippets-handler.coffee deleted file mode 100644 index 6d65a46c4..000000000 --- a/src/packages/snippets/lib/load-snippets-handler.coffee +++ /dev/null @@ -1,56 +0,0 @@ -fs = require 'fs-utils' -TextMatePackage = require 'text-mate-package' -SnippetBodyParser = require './snippet-body-parser' -CSON = require 'cson' - -module.exports = - snippetsLoaded: (snippets) -> - for snippet in snippets - for selector, snippetsByName of snippet - for name, attributes of snippetsByName - attributes.bodyTree = SnippetBodyParser.parse(attributes.body) - callTaskMethod('snippetsLoaded', snippets) - - loadTextMateSnippets: (path) -> - snippetsDirPath = fs.join(path, 'Snippets') - snippets = [] - - for snippetsPath in fs.list(snippetsDirPath) - logWarning = -> - console.warn "Error reading TextMate snippets file '#{snippetsPath}'" - - continue if fs.base(snippetsPath).indexOf('.') is 0 - try - if CSON.isObjectPath(snippetsPath) and object = CSON.readObject(snippetsPath) - snippets.push(object) - else if object = fs.readPlist(snippetsPath) - snippets.push(object) - else - logWarning() - catch e - logWarning() - - @snippetsLoaded(@translateTextmateSnippets(snippets)) - - loadAtomSnippets: (path) -> - snippetsDirPath = fs.join(path, 'snippets') - snippets = [] - for snippetsPath in fs.list(snippetsDirPath) - continue if fs.base(snippetsPath).indexOf('.') is 0 - try - snippets.push(CSON.readObject(snippetsPath)) - catch e - console.warn "Error reading snippets file '#{snippetsPath}'" - @snippetsLoaded(snippets) - - translateTextmateSnippets: (tmSnippets) -> - atomSnippets = {} - for { scope, name, content, tabTrigger } in tmSnippets - if scope - scope = TextMatePackage.cssSelectorFromScopeSelector(scope) - else - scope = '*' - - snippetsForScope = (atomSnippets[scope] ?= {}) - snippetsForScope[name] = { prefix: tabTrigger, body: content } - [atomSnippets] diff --git a/src/packages/snippets/lib/load-snippets-task.coffee b/src/packages/snippets/lib/load-snippets-task.coffee deleted file mode 100644 index 98b73b470..000000000 --- a/src/packages/snippets/lib/load-snippets-task.coffee +++ /dev/null @@ -1,34 +0,0 @@ -Task = require 'task' -TextMatePackage = require 'text-mate-package' - -module.exports = -class LoadSnippetsTask extends Task - constructor: (@snippets) -> - super('snippets/lib/load-snippets-handler') - @packages = atom.getLoadedPackages() - @packages.push(path: config.configDirPath) - - started: -> - @loadNextPackageSnippets() - - loadNextPackageSnippets: -> - unless @packages.length - @done() - @snippets.loaded = true - return - - @packageBeingLoaded = @packages.shift() - if @packageBeingLoaded instanceof TextMatePackage - @loadTextMateSnippets(@packageBeingLoaded.path) - else - @loadAtomSnippets(@packageBeingLoaded.path) - - loadAtomSnippets: (path) -> - @callWorkerMethod('loadAtomSnippets', path) - - loadTextMateSnippets: (path) -> - @callWorkerMethod('loadTextMateSnippets', path) - - snippetsLoaded: (snippets) -> - @snippets.add(snippet) for snippet in snippets - @loadNextPackageSnippets() diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index a76497497..3cd25e164 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -1,10 +1,12 @@ AtomPackage = require 'atom-package' -fs = require 'fs-utils' +fs = require 'fs' +fsUtils = require 'fs-utils' _ = require 'underscore' SnippetExpansion = require './snippet-expansion' Snippet = require './snippet' -LoadSnippetsTask = require './load-snippets-task' +TextMatePackage = require 'text-mate-package' CSON = require 'cson' +async = require 'async' module.exports = snippetsByExtension: {} @@ -20,19 +22,82 @@ module.exports = @loadSnippetsTask?.abort() loadAll: -> - @loadSnippetsTask = new LoadSnippetsTask(this) - @loadSnippetsTask.start() + packages = atom.getLoadedPackages() + packages.push(path: config.configDirPath) + async.eachSeries packages, @loadSnippetsFromPackage.bind(this), @doneLoading.bind(this) - loadDirectory: (snippetsDirPath) -> - for snippetsPath in fs.list(snippetsDirPath) when fs.base(snippetsPath).indexOf('.') isnt 0 - snippets.loadFile(snippetsPath) + doneLoading: -> + @loaded = true - loadFile: (snippetsPath) -> - try - snippets = CSON.readObject(snippetsPath) - catch e - console.warn "Error reading snippets file '#{snippetsPath}'" - @add(snippets) + loadSnippetsFromPackage: (pack, done) -> + if pack instanceof TextMatePackage + @loadTextMateSnippets(pack.path, done) + else + @loadAtomSnippets(pack.path, done) + + loadAtomSnippets: (path, done) -> + snippetsDirPath = fsUtils.join(path, 'snippets') + + loadSnippetFile = (filename, done) => + return done() if filename.indexOf('.') is 0 + filepath = fsUtils.join(snippetsDirPath, filename) + CSON.readObjectAsync filepath, (err, object) => + if err + console.warn "Error reading snippets file '#{filepath}': #{err.stack}" + else + @add(object) + done() + + fs.readdir snippetsDirPath, (err, paths) -> + async.each(paths, loadSnippetFile, done) + + loadTextMateSnippets: (path, done) -> + snippetsDirPath = fsUtils.join(path, 'Snippets') + + loadSnippetFile = (filename, done) => + return done() if filename.indexOf('.') is 0 + + filepath = fsUtils.join(snippetsDirPath, filename) + + logError = (err) -> + console.warn "Error reading snippets file '#{filepath}': #{err.stack ? err}" + + try + readObject = + if CSON.isObjectPath(filepath) + CSON.readObjectAsync.bind(CSON) + else + fsUtils.readPlistAsync.bind(fsUtils) + + readObject filepath, (err, object) => + try + if err + logError(err) + else + @add(@translateTextmateSnippet(object)) + catch err + logError(err) + finally + done() + catch err + logError(err) + done() + + return done() unless fsUtils.isDirectory(snippetsDirPath) + fs.readdir snippetsDirPath, (err, paths) -> + if err + console.warn err + return done() + async.each(paths, loadSnippetFile, done) + + translateTextmateSnippet: ({ scope, name, content, tabTrigger }) -> + scope = TextMatePackage.cssSelectorFromScopeSelector(scope) if scope + scope ?= '*' + snippetsByScope = {} + snippetsByName = {} + snippetsByScope[scope] = snippetsByName + snippetsByName[name] = { prefix: tabTrigger, body: content } + snippetsByScope add: (snippetsBySelector) -> for selector, snippetsByName of snippetsBySelector diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index 9c6c323ac..7fbb6871b 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -1,5 +1,4 @@ Snippet = require 'snippets/lib/snippet' -LoadSnippetsTask = require 'snippets/lib/load-snippets-task' RootView = require 'root-view' Buffer = require 'text-buffer' Editor = require 'editor' @@ -12,13 +11,12 @@ describe "Snippets extension", -> beforeEach -> window.rootView = new RootView rootView.open('sample.js') - spyOn(LoadSnippetsTask.prototype, 'start') packageWithSnippets = window.loadPackage("package-with-snippets") - spyOn(atom, "getLoadedPackages").andCallFake -> window.textMatePackages.concat([packageWithSnippets]) + spyOn(require("snippets/lib/snippets"), 'loadAll') window.loadPackage("snippets") editor = rootView.getActiveView() @@ -239,12 +237,13 @@ describe "Snippets extension", -> describe "snippet loading", -> beforeEach -> - jasmine.unspy(LoadSnippetsTask.prototype, 'start') - spyOn(LoadSnippetsTask.prototype, 'loadAtomSnippets').andCallFake -> @snippetsLoaded({}) - spyOn(LoadSnippetsTask.prototype, 'loadTextMateSnippets').andCallFake -> @snippetsLoaded({}) + jasmine.unspy(window, "setTimeout") + jasmine.unspy(snippets, 'loadAll') + spyOn(snippets, 'loadAtomSnippets').andCallFake (path, done) -> done() + spyOn(snippets, 'loadTextMateSnippets').andCallFake (path, done) -> done() it "loads non-hidden snippet files from all atom packages with snippets directories, logging a warning if a file can't be parsed", -> - jasmine.unspy(LoadSnippetsTask.prototype, 'loadAtomSnippets') + jasmine.unspy(snippets, 'loadAtomSnippets') spyOn(console, 'warn') snippets.loaded = false snippets.loadAll() @@ -259,7 +258,7 @@ describe "Snippets extension", -> expect(console.warn.calls.length).toBe 1 it "loads snippets from all TextMate packages with snippets", -> - jasmine.unspy(LoadSnippetsTask.prototype, 'loadTextMateSnippets') + jasmine.unspy(snippets, 'loadTextMateSnippets') spyOn(console, 'warn') snippets.loaded = false snippets.loadAll() @@ -281,28 +280,11 @@ describe "Snippets extension", -> expect(console.warn).toHaveBeenCalled() expect(console.warn.calls.length).toBe 1 - it "terminates the worker when loading completes", -> - jasmine.unspy(LoadSnippetsTask.prototype, 'loadAtomSnippets') - spyOn(console, "warn") - spyOn(Worker.prototype, 'terminate').andCallThrough() + it "loads CSON snippets from TextMate packages", -> + jasmine.unspy(snippets, 'loadTextMateSnippets') snippets.loaded = false snippets.loadAll() - waitsFor "all snippets to load", 5000, -> snippets.loaded - - runs -> - expect(console.warn).toHaveBeenCalled() - expect(console.warn.argsForCall[0]).toMatch /Error reading snippets file '.*?\/spec\/fixtures\/packages\/package-with-snippets\/snippets\/junk-file'/ - expect(Worker.prototype.terminate).toHaveBeenCalled() - expect(Worker.prototype.terminate.calls.length).toBe 1 - - it "loads CSON snippets from TextMate packages", -> - jasmine.unspy(LoadSnippetsTask.prototype, 'loadTextMateSnippets') - snippets.loaded = false - task = new LoadSnippetsTask(snippets) - task.packages = [Package.build(project.resolve('packages/package-with-a-cson-grammar.tmbundle'))] - task.start() - waitsFor "CSON snippets to load", 5000, -> snippets.loaded runs -> diff --git a/src/stdlib/cson.coffee b/src/stdlib/cson.coffee index f6ba3258d..1d105dc6a 100644 --- a/src/stdlib/cson.coffee +++ b/src/stdlib/cson.coffee @@ -1,25 +1,35 @@ _ = require 'underscore' -fs = require 'fs-utils' +fs = require 'fs' +fsUtils = require 'fs-utils' module.exports = isObjectPath: (path) -> - extension = fs.extension(path) + extension = fsUtils.extension(path) extension is '.cson' or extension is '.json' readObject: (path) -> - contents = fs.read(path) - if fs.extension(path) is '.cson' + @parseObject(path, fsUtils.read(path)) + + readObjectAsync: (path, done) -> + fs.readFile path, 'utf8', (err, contents) => + return done(err) if err? + try done(null, @parseObject(path, contents)) + catch err + done(err) + + parseObject: (path, contents) -> + if fsUtils.extension(path) is '.cson' CoffeeScript = require 'coffee-script' CoffeeScript.eval(contents, bare: true) else JSON.parse(contents) writeObject: (path, object) -> - if fs.extension(path) is '.cson' + if fsUtils.extension(path) is '.cson' content = @stringify(object) else content = JSON.stringify(object, undefined, 2) - fs.write(path, "#{content}\n") + fsUtils.write(path, "#{content}\n") stringifyIndent: (level=0) -> _.multiplyString(' ', Math.max(level, 0)) diff --git a/src/stdlib/fs-utils.coffee b/src/stdlib/fs-utils.coffee index d024ae4df..51fd3cc78 100644 --- a/src/stdlib/fs-utils.coffee +++ b/src/stdlib/fs-utils.coffee @@ -273,3 +273,16 @@ module.exports = throw new Error(e) if e object = data[0] object + + readPlistAsync: (path, done) -> + plist = require 'plist' + fs.readFile path, 'utf8', (err, contents) -> + return done(err) if err + [parseErr, object] = [] + # plist has an async api, but it isn't actually synchronous + # and it doesn't ever call our callback if there's invalid input + plist.parseString contents, (err, data) -> + parseErr = err + object = data[0] unless err + parseErr = "Could not parse plist at path: '#{path}'" unless object + done(parseErr, object) From dfecef24e9ef9effee7dad0d63292b247dbc111a Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Mon, 18 Mar 2013 15:14:12 -0700 Subject: [PATCH 100/281] Only load necessary packages in snippets spec --- src/packages/snippets/spec/snippets-spec.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index 7fbb6871b..6f52314c0 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -14,7 +14,8 @@ describe "Snippets extension", -> packageWithSnippets = window.loadPackage("package-with-snippets") spyOn(atom, "getLoadedPackages").andCallFake -> - window.textMatePackages.concat([packageWithSnippets]) + textMatePackages = window.textMatePackages.filter (pack) -> /package-with-a-cson-grammar|test|textmate-package|javascript/.test(pack.name) + textMatePackages.concat([packageWithSnippets]) spyOn(require("snippets/lib/snippets"), 'loadAll') window.loadPackage("snippets") @@ -282,6 +283,7 @@ describe "Snippets extension", -> it "loads CSON snippets from TextMate packages", -> jasmine.unspy(snippets, 'loadTextMateSnippets') + spyOn(console, 'warn') snippets.loaded = false snippets.loadAll() From 91587cbb991649905133c850c07ab8795387b916 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 18 Mar 2013 19:20:34 -0600 Subject: [PATCH 101/281] Guard `loadAtomSnippets` against non-existent snippet directories --- src/packages/snippets/lib/snippets.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index 3cd25e164..e93191972 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -37,6 +37,7 @@ module.exports = loadAtomSnippets: (path, done) -> snippetsDirPath = fsUtils.join(path, 'snippets') + return done() unless fsUtils.isDirectory(snippetsDirPath) loadSnippetFile = (filename, done) => return done() if filename.indexOf('.') is 0 @@ -53,6 +54,7 @@ module.exports = loadTextMateSnippets: (path, done) -> snippetsDirPath = fsUtils.join(path, 'Snippets') + return done() unless fsUtils.isDirectory(snippetsDirPath) loadSnippetFile = (filename, done) => return done() if filename.indexOf('.') is 0 @@ -83,7 +85,6 @@ module.exports = logError(err) done() - return done() unless fsUtils.isDirectory(snippetsDirPath) fs.readdir snippetsDirPath, (err, paths) -> if err console.warn err From 5270a99f7ba6c40f169b6c3b90874b2789e43aa7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 19 Mar 2013 11:13:27 -0600 Subject: [PATCH 102/281] Use eachSeries to load snippets so we don't exhaust file descriptors --- src/packages/snippets/lib/snippets.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index e93191972..4bc836034 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -50,7 +50,7 @@ module.exports = done() fs.readdir snippetsDirPath, (err, paths) -> - async.each(paths, loadSnippetFile, done) + async.eachSeries(paths, loadSnippetFile, done) loadTextMateSnippets: (path, done) -> snippetsDirPath = fsUtils.join(path, 'Snippets') @@ -89,7 +89,7 @@ module.exports = if err console.warn err return done() - async.each(paths, loadSnippetFile, done) + async.eachSeries(paths, loadSnippetFile, done) translateTextmateSnippet: ({ scope, name, content, tabTrigger }) -> scope = TextMatePackage.cssSelectorFromScopeSelector(scope) if scope From 4a203a9eb6c18285609768f362533388d8d8b88d Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 19 Mar 2013 11:16:49 -0600 Subject: [PATCH 103/281] Use plist NPM instead of vendor/plist.js. Use new synch parsing api. This also adds a `readObject` method to `fs-utils`, which loads the file as cson if it ends with json/cson, and otherwise tries to load it as a plist. For now, we're using my fork which is tolerant to a node environment with a `window` global and suppresses some logging of non-fatal errors. If the upstream author accepts my pull requests we can switch back. --- package.json | 3 +- src/app/text-mate-grammar.coffee | 10 +- src/app/text-mate-package.coffee | 9 +- src/stdlib/fs-utils.coffee | 25 +- vendor/plist.js | 220 ------- vendor/sax.js | 1011 ------------------------------ 6 files changed, 19 insertions(+), 1259 deletions(-) delete mode 100644 vendor/plist.js delete mode 100644 vendor/sax.js diff --git a/package.json b/package.json index caa23521f..9b1fee82b 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "d3": "3.0.8", "coffee-cache": "0.1.0", "pegjs": "0.7.0", - "async": "0.2.6" + "async": "0.2.6", + "plist": "git://github.com/nathansobo/node-plist.git" }, "scripts": { diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index a8ef8065c..59c294752 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -8,15 +8,7 @@ CSON = require 'cson' module.exports = class TextMateGrammar @readFromPath: (path) -> - grammarContent = null - if CSON.isObjectPath(path) - grammarContent = CSON.readObject(path) - else - plist.parseString fs.read(path), (e, data) -> - throw new Error(e) if e - grammarContent = data[0] - throw new Error("Failed to load grammar at path `#{path}`") unless grammarContent - grammarContent + fs.readObject(path) name: null fileTypes: null diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index 988aa1ebf..107637723 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -90,11 +90,10 @@ class TextMatePackage extends Package preferenceObjects = [] if fs.exists(@preferencesPath) for preferencePath in fs.list(@preferencesPath) - @readObjectFromPath preferencePath, (e, object) => - if e - console.warn "Failed to parse preference at path '#{preferencePath}'", e.stack - else - preferenceObjects.push(object) + try + preferenceObjects.push(fs.readObject(preferencePath)) + catch e + console.warn "Failed to parse preference at path '#{preferencePath}'", e.stack preferenceObjects propertiesFromTextMateSettings: (textMateSettings) -> diff --git a/src/stdlib/fs-utils.coffee b/src/stdlib/fs-utils.coffee index 51fd3cc78..4aefd02dc 100644 --- a/src/stdlib/fs-utils.coffee +++ b/src/stdlib/fs-utils.coffee @@ -268,21 +268,20 @@ module.exports = readPlist: (path) -> plist = require 'plist' - object = null - plist.parseString @read(path), (e, data) -> - throw new Error(e) if e - object = data[0] - object + plist.parseStringSync(@read(path)) readPlistAsync: (path, done) -> plist = require 'plist' fs.readFile path, 'utf8', (err, contents) -> return done(err) if err - [parseErr, object] = [] - # plist has an async api, but it isn't actually synchronous - # and it doesn't ever call our callback if there's invalid input - plist.parseString contents, (err, data) -> - parseErr = err - object = data[0] unless err - parseErr = "Could not parse plist at path: '#{path}'" unless object - done(parseErr, object) + try + done(null, plist.parseStringSync(contents)) + catch err + done(err) + + readObject: (path) -> + cson = require 'cson' + if cson.isObjectPath(path) + cson.readObject(path) + else + @readPlist(path) diff --git a/vendor/plist.js b/vendor/plist.js deleted file mode 100644 index f4110e934..000000000 --- a/vendor/plist.js +++ /dev/null @@ -1,220 +0,0 @@ -;(function (exports, sax) { - //Checks if running in a non-browser environment - var inNode = typeof window === 'undefined' ? true : false; - - function Parser() { - sax.SAXParser.call(this, false, { lowercasetags: true, trim: false }); - } - - var inherits = null; - if (inNode) { - var fs = require('fs'); - inherits = require('util').inherits; //use node provided function - } else { //use in browser - if ("create" in Object) { - inherits = function(ctor, superCtor) { - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; - } else { - var klass = function() {}; - inherits = function(ctor, superCtor) { - klass.prototype = superCtor.prototype; - ctor.prototype = new klass; - ctor.prototype['constructor'] = ctor; - } - } - } - inherits(Parser, sax.SAXParser); //inherit from sax (browser-style or node-style) - - Parser.prototype.getInteger = function (string) { - this.value = parseInt(string, 10); - } - Parser.prototype.getReal = function (string) { - this.value = parseFloat(string); - } - Parser.prototype.getString = function (string) { - this.value += string; - } - Parser.prototype.getData = function(string) { - // todo: parse base64 encoded data - this.value += string; - } - Parser.prototype.getDate = function (string) { - this.value = new Date(string); - } - - Parser.prototype.addToDict = function (value) { - this.dict[this.key] = value; - } - Parser.prototype.addToArray = function (value) { - this.array.push(value); - } - - Parser.prototype.onopentag = function (tag) { - switch (tag.name) { - case 'dict': - this.stack.push(this.context); - this.context = { - value: function() { - return this.dict; - }, - dict: {}, - setKey: function(key) { - this.key = key; - }, - setValue: function(value) { - this.dict[this.key] = value; - } - } - break; - case 'plist': - case 'array': - this.stack.push(this.context); - this.context = { - value: function() { - return this.array; - }, - array: [], - setKey: function(key) { - console.log('unexpected element in array'); - }, - setValue: function(value) { - this.array.push(value); - } - } - break; - case 'key': - this.ontext = function (text) { - this.context.setKey(text); - } - break; - case 'integer': - this.ontext = this.getInteger; - break; - case 'real': - this.ontext = this.getReal; - break; - case 'string': - this.value = ''; - this.ontext = this.getString; - this.oncdata = this.getString; - break; - case 'data': - this.value = ''; - this.ontext = this.getData; - this.oncdata = this.getData; - break; - case 'true': - this.value = true; - break; - case 'false': - this.value = false; - break; - case 'date': - this.ontext = this.getDate; - break; - default: - console.log('ignored tag', tag.name); - break; - } - } - Parser.prototype.onclosetag = function (tag) { - var value; - switch (tag) { - case 'dict': - case 'array': - case 'plist': - var value = this.context.value(); - this.context = this.stack.pop(); - this.context.setValue(value); - break; - case 'true': - case 'false': - case 'string': - case 'integer': - case 'real': - case 'date': - case 'data': - this.context.setValue(this.value); - break; - case 'key': - break; - default: - console.log('closing', tag, 'tag ignored'); - } - this.oncdata = this.ontext = this.checkWhitespace; - } - Parser.prototype.checkWhitespace = function (data) { - if (!data.match(/^[ \t\r\n]*$/)) { - console.log('unexpected non-whitespace data', data); - } - } - Parser.prototype.oncomment = function (comment) { - } - Parser.prototype.onerror = function (error) { - console.log('sax parser error:', error); - throw error; - } - - if (inNode) Parser.prototype.parseFile = function (xmlfile, callback) { //browsers aren't capable of opening files, instead use AJAX - var parser = this; - parser.stack = [ ]; - parser.context = { - callback: callback, - value: function() {}, - setKey: function(key) {}, - setValue: function(value) { - callback(null, value); - }, - } - var rs = fs.createReadStream(xmlfile, { - encoding: 'utf8' - }); - rs.on('data', function(data) { parser.write(data); }); - rs.on('end', function() { parser.close(); }); - } - - Parser.prototype.parseString = function (xml, callback) { - var parser = this; - parser.stack = [ ]; - parser.context = { - callback: callback, - value: function() {}, - setKey: function(key) {}, - setValue: function(value) { - this.callback(null, value); - }, - }; - - try { - parser.write(xml); - parser.close(); - } - catch (e) { - callback(e, {}) - } - } - - exports.Parser = Parser; - - exports.parseString = function (xml, callback) { - var parser = new Parser(); - parser.parseString(xml, callback); - } - - if (inNode) exports.parseFile = function (filename, callback) { //Do not expose no created method - var parser = new Parser(); - parser.parseFile(filename, callback); - } -})(typeof exports === 'undefined' ? plist = {} : exports, require('sax')) // Changed by sobo to always `require` sax -//the above line checks for exports (defined in node) and uses it, or creates a global variable and exports to that. -//also, if in node, require sax node-style, in browser the developer must use a
  • qoz@@RH)aUMippMZ4r0X5qoUZQX048SUMphz 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 diff --git a/native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexp.h b/native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexp.h deleted file mode 100644 index 84f24b46d..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexp.h +++ /dev/null @@ -1,91 +0,0 @@ -// CocoaOniguruma is copyrighted free software by Satoshi Nakagawa . -// You can redistribute it and/or modify it under the new BSD license. - -#import -#import "oniguruma.h" -#import "OnigRegexpUtility.h" - - -@class OnigResult; - -typedef enum { - OnigOptionNone = ONIG_OPTION_NONE, - OnigOptionIgnorecase = ONIG_OPTION_IGNORECASE, - OnigOptionExtend = ONIG_OPTION_EXTEND, - OnigOptionMultiline = ONIG_OPTION_MULTILINE, - OnigOptionSingleline = ONIG_OPTION_SINGLELINE, - OnigOptionFindLongest = ONIG_OPTION_FIND_LONGEST, - OnigOptionFindNotEmpty = ONIG_OPTION_FIND_NOT_EMPTY, - OnigOptionNegateSingleLine = ONIG_OPTION_NEGATE_SINGLELINE, - OnigOptionDontCaptureGroup = ONIG_OPTION_DONT_CAPTURE_GROUP, - OnigOptionCaptureGroup = ONIG_OPTION_CAPTURE_GROUP, - - /* options (search time) */ - OnigOptionNotbol = ONIG_OPTION_NOTBOL, - OnigOptionNoteol = ONIG_OPTION_NOTEOL, - OnigOptionPosixRegion = ONIG_OPTION_POSIX_REGION, - OnigOptionMaxbit = ONIG_OPTION_MAXBIT -} OnigOption; - -@interface OnigRegexp : NSObject -{ - regex_t* _entity; - NSString* _expression; -} - -+ (OnigRegexp*)compile:(NSString*)expression; -+ (OnigRegexp*)compile:(NSString*)expression error:(NSError **)error; -+ (OnigRegexp*)compileIgnorecase:(NSString*)expression; -+ (OnigRegexp*)compileIgnorecase:(NSString*)expression error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline extended:(BOOL)extended; -+ (OnigRegexp*)compile:(NSString*)expression ignorecase:(BOOL)ignorecase multiline:(BOOL)multiline extended:(BOOL)extended error:(NSError **)error; -+ (OnigRegexp*)compile:(NSString*)expression options:(OnigOption)options; -+ (OnigRegexp*)compile:(NSString*)expression options:(OnigOption)options error:(NSError **)error; - -- (OnigResult*)search:(NSString*)target; -- (OnigResult*)search:(NSString*)target start:(int)start; -- (OnigResult*)search:(NSString*)target start:(int)start end:(int)end; -- (OnigResult*)search:(NSString*)target range:(NSRange)range; - -- (OnigResult*)match:(NSString*)target; -- (OnigResult*)match:(NSString*)target start:(int)start; - -- (NSUInteger)captureCount; -- (NSString*)expression; - -@end - - -@interface OnigResult : NSObject -{ - OnigRegexp* _expression; - OnigRegion* _region; - NSString* _target; - NSMutableArray* _captureNames; -} - -- (NSString*)target; - -- (int)count; -- (NSString*)stringAt:(int)index; -- (NSArray*)strings; -- (NSRange)rangeAt:(int)index; -- (int)locationAt:(int)index; -- (int)lengthAt:(int)index; - -- (NSString*)body; -- (NSRange)bodyRange; - -- (NSString*)preMatch; -- (NSString*)postMatch; - -// named capture support -- (NSArray*)captureNames; -- (int)indexForName:(NSString*)name; -- (NSIndexSet*)indexesForName:(NSString*)name; -- (NSString*)stringForName:(NSString*)name; -- (NSArray*)stringsForName:(NSString*)name; - -@end diff --git a/native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexpUtility.h b/native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexpUtility.h deleted file mode 100644 index 245ebae3d..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Headers/OnigRegexpUtility.h +++ /dev/null @@ -1,57 +0,0 @@ -// CocoaOniguruma is copyrighted free software by Satoshi Nakagawa . -// You can redistribute it and/or modify it under the new BSD license. - -#import -#import "oniguruma.h" -#import "OnigRegexp.h" - - -@class OnigRegexp; -@class OnigResult; - - -@interface NSString (OnigRegexpUtility) - -// pattern is OnigRegexp or NSString - -- (NSRange)rangeOfRegexp:(id)pattern; - -// based on ruby's split - -- (NSArray*)split; -- (NSArray*)splitByRegexp:(id)pattern; -- (NSArray*)splitByRegexp:(id)pattern limit:(int)limit; - -// based on ruby's gsub - -- (NSString*)replaceByRegexp:(id)pattern with:(NSString*)string; -- (NSString*)replaceAllByRegexp:(id)pattern with:(NSString*)string; - -- (NSString*)replaceByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; -- (NSString*)replaceAllByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; - -#if defined(NS_BLOCKS_AVAILABLE) -- (NSString*)replaceByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -- (NSString*)replaceAllByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -#endif - -@end - - -@interface NSMutableString (OnigRegexpUtility) - -// pattern is OnigRegexp or NSString - -// based on ruby's gsub - -- (NSMutableString*)replaceByRegexp:(id)pattern with:(NSString*)string; -- (NSMutableString*)replaceAllByRegexp:(id)pattern with:(NSString*)string; - -- (NSMutableString*)replaceByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; -- (NSMutableString*)replaceAllByRegexp:(id)pattern withCallback:(id)object selector:(SEL)sel; - -#if defined(NS_BLOCKS_AVAILABLE) -- (NSMutableString*)replaceByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -- (NSMutableString*)replaceAllByRegexp:(id)pattern withBlock:(NSString* (^)(OnigResult*))block; -#endif -@end diff --git a/native/frameworks/CocoaOniguruma.framework/Headers/oniguruma.h b/native/frameworks/CocoaOniguruma.framework/Headers/oniguruma.h deleted file mode 100644 index 8c6322c9b..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Headers/oniguruma.h +++ /dev/null @@ -1,770 +0,0 @@ -#ifndef ONIGURUMA_H -#define ONIGURUMA_H -/********************************************************************** - oniguruma.h - Oniguruma (regular expression library) -**********************************************************************/ -/*- - * Copyright (c) 2002-2009 K.Kosako - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ONIGURUMA -#define ONIGURUMA_VERSION_MAJOR 5 -#define ONIGURUMA_VERSION_MINOR 9 -#define ONIGURUMA_VERSION_TEENY 2 - -#ifdef __cplusplus -# ifndef HAVE_PROTOTYPES -# define HAVE_PROTOTYPES 1 -# endif -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -/* escape Mac OS X/Xcode 2.4/gcc 4.0.1 problem */ -#if defined(__APPLE__) && defined(__GNUC__) && __GNUC__ >= 4 -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#ifdef HAVE_STDARG_H -# ifndef HAVE_STDARG_PROTOTYPES -# define HAVE_STDARG_PROTOTYPES 1 -# endif -#endif - -#ifndef P_ -#if defined(__STDC__) || defined(_WIN32) -# define P_(args) args -#else -# define P_(args) () -#endif -#endif - -#ifndef PV_ -#ifdef HAVE_STDARG_PROTOTYPES -# define PV_(args) args -#else -# define PV_(args) () -#endif -#endif - -#ifndef ONIG_EXTERN -#if defined(_WIN32) && !defined(__GNUC__) -#if defined(EXPORT) || defined(RUBY_EXPORT) -#define ONIG_EXTERN extern __declspec(dllexport) -#else -#define ONIG_EXTERN extern __declspec(dllimport) -#endif -#endif -#endif - -#ifndef ONIG_EXTERN -#define ONIG_EXTERN extern -#endif - -/* PART: character encoding */ - -#ifndef ONIG_ESCAPE_UCHAR_COLLISION -#define UChar OnigUChar -#endif - -typedef unsigned char OnigUChar; -typedef unsigned long OnigCodePoint; -typedef unsigned int OnigCtype; -typedef unsigned int OnigDistance; - -#define ONIG_INFINITE_DISTANCE ~((OnigDistance )0) - -typedef unsigned int OnigCaseFoldType; /* case fold flag */ - -ONIG_EXTERN OnigCaseFoldType OnigDefaultCaseFoldFlag; - -/* #define ONIGENC_CASE_FOLD_HIRAGANA_KATAKANA (1<<1) */ -/* #define ONIGENC_CASE_FOLD_KATAKANA_WIDTH (1<<2) */ -#define ONIGENC_CASE_FOLD_TURKISH_AZERI (1<<20) -#define INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR (1<<30) - -#define ONIGENC_CASE_FOLD_MIN INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR -#define ONIGENC_CASE_FOLD_DEFAULT OnigDefaultCaseFoldFlag - - -#define ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN 3 -#define ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM 13 -/* 13 => Unicode:0x1ffc */ - -/* code range */ -#define ONIGENC_CODE_RANGE_NUM(range) ((int )range[0]) -#define ONIGENC_CODE_RANGE_FROM(range,i) range[((i)*2) + 1] -#define ONIGENC_CODE_RANGE_TO(range,i) range[((i)*2) + 2] - -typedef struct { - int byte_len; /* argument(original) character(s) byte length */ - int code_len; /* number of code */ - OnigCodePoint code[ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN]; -} OnigCaseFoldCodeItem; - -typedef struct { - OnigCodePoint esc; - OnigCodePoint anychar; - OnigCodePoint anytime; - OnigCodePoint zero_or_one_time; - OnigCodePoint one_or_more_time; - OnigCodePoint anychar_anytime; -} OnigMetaCharTableType; - -typedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg); - -typedef struct OnigEncodingTypeST { - int (*mbc_enc_len)(const OnigUChar* p); - const char* name; - int max_enc_len; - int min_enc_len; - int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end); - OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end); - int (*code_to_mbclen)(OnigCodePoint code); - int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf); - int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to); - int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg); - int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[]); - int (*property_name_to_ctype)(struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end); - int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype); - int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]); - OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p); - int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end); -} OnigEncodingType; - -typedef OnigEncodingType* OnigEncoding; - -ONIG_EXTERN OnigEncodingType OnigEncodingASCII; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_BE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_LE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_BE; -ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_LE; - -#define ONIG_ENCODING_ASCII (&OnigEncodingASCII) -#define ONIG_ENCODING_UTF16_BE (&OnigEncodingUTF16_BE) -#define ONIG_ENCODING_UTF16_LE (&OnigEncodingUTF16_LE) -#define ONIG_ENCODING_UTF32_BE (&OnigEncodingUTF32_BE) -#define ONIG_ENCODING_UTF32_LE (&OnigEncodingUTF32_LE) - -#define ONIG_ENCODING_UNDEF ((OnigEncoding )0) - - -/* work size */ -#define ONIGENC_CODE_TO_MBC_MAXLEN 7 -#define ONIGENC_MBC_CASE_FOLD_MAXLEN 18 -/* 18: 6(max-byte) * 3(case-fold chars) */ - -/* character types */ -#define ONIGENC_CTYPE_NEWLINE 0 -#define ONIGENC_CTYPE_ALPHA 1 -#define ONIGENC_CTYPE_BLANK 2 -#define ONIGENC_CTYPE_CNTRL 3 -#define ONIGENC_CTYPE_DIGIT 4 -#define ONIGENC_CTYPE_GRAPH 5 -#define ONIGENC_CTYPE_LOWER 6 -#define ONIGENC_CTYPE_PRINT 7 -#define ONIGENC_CTYPE_PUNCT 8 -#define ONIGENC_CTYPE_SPACE 9 -#define ONIGENC_CTYPE_UPPER 10 -#define ONIGENC_CTYPE_XDIGIT 11 -#define ONIGENC_CTYPE_WORD 12 -#define ONIGENC_CTYPE_ALNUM 13 /* alpha || digit */ -#define ONIGENC_CTYPE_ASCII 14 -#define ONIGENC_MAX_STD_CTYPE ONIGENC_CTYPE_ASCII - - -#define onig_enc_len(enc,p,end) ONIGENC_MBC_ENC_LEN(enc,p) - -#define ONIGENC_IS_UNDEF(enc) ((enc) == ONIG_ENCODING_UNDEF) -#define ONIGENC_IS_SINGLEBYTE(enc) (ONIGENC_MBC_MAXLEN(enc) == 1) -#define ONIGENC_IS_MBC_HEAD(enc,p) (ONIGENC_MBC_ENC_LEN(enc,p) != 1) -#define ONIGENC_IS_MBC_ASCII(p) (*(p) < 128) -#define ONIGENC_IS_CODE_ASCII(code) ((code) < 128) -#define ONIGENC_IS_MBC_WORD(enc,s,end) \ - ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end)) - - -#define ONIGENC_NAME(enc) ((enc)->name) - -#define ONIGENC_MBC_CASE_FOLD(enc,flag,pp,end,buf) \ - (enc)->mbc_case_fold(flag,(const OnigUChar** )pp,end,buf) -#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \ - (enc)->is_allowed_reverse_match(s,end) -#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \ - (enc)->left_adjust_char_head(start, s) -#define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \ - (enc)->apply_all_case_fold(case_fold_flag,f,arg) -#define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \ - (enc)->get_case_fold_codes_by_str(case_fold_flag,p,end,acs) -#define ONIGENC_STEP_BACK(enc,start,s,n) \ - onigenc_step_back((enc),(start),(s),(n)) - -#define ONIGENC_MBC_ENC_LEN(enc,p) (enc)->mbc_enc_len(p) -#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len) -#define ONIGENC_MBC_MAXLEN_DIST(enc) ONIGENC_MBC_MAXLEN(enc) -#define ONIGENC_MBC_MINLEN(enc) ((enc)->min_enc_len) -#define ONIGENC_IS_MBC_NEWLINE(enc,p,end) (enc)->is_mbc_newline((p),(end)) -#define ONIGENC_MBC_TO_CODE(enc,p,end) (enc)->mbc_to_code((p),(end)) -#define ONIGENC_CODE_TO_MBCLEN(enc,code) (enc)->code_to_mbclen(code) -#define ONIGENC_CODE_TO_MBC(enc,code,buf) (enc)->code_to_mbc(code,buf) -#define ONIGENC_PROPERTY_NAME_TO_CTYPE(enc,p,end) \ - (enc)->property_name_to_ctype(enc,p,end) - -#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) (enc)->is_code_ctype(code,ctype) - -#define ONIGENC_IS_CODE_NEWLINE(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_NEWLINE) -#define ONIGENC_IS_CODE_GRAPH(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH) -#define ONIGENC_IS_CODE_PRINT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT) -#define ONIGENC_IS_CODE_ALNUM(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM) -#define ONIGENC_IS_CODE_ALPHA(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA) -#define ONIGENC_IS_CODE_LOWER(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER) -#define ONIGENC_IS_CODE_UPPER(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER) -#define ONIGENC_IS_CODE_CNTRL(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL) -#define ONIGENC_IS_CODE_PUNCT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT) -#define ONIGENC_IS_CODE_SPACE(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE) -#define ONIGENC_IS_CODE_BLANK(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK) -#define ONIGENC_IS_CODE_DIGIT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT) -#define ONIGENC_IS_CODE_XDIGIT(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT) -#define ONIGENC_IS_CODE_WORD(enc,code) \ - ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD) - -#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,sbout,ranges) \ - (enc)->get_ctype_code_range(ctype,sbout,ranges) - -ONIG_EXTERN -OnigUChar* onigenc_step_back P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, int n)); - - -/* encoding API */ -ONIG_EXTERN -int onigenc_init P_((void)); -ONIG_EXTERN -int onigenc_set_default_encoding P_((OnigEncoding enc)); -ONIG_EXTERN -OnigEncoding onigenc_get_default_encoding P_((void)); -ONIG_EXTERN -void onigenc_set_default_caseconv_table P_((const OnigUChar* table)); -ONIG_EXTERN -OnigUChar* onigenc_get_right_adjust_char_head_with_prev P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar** prev)); -ONIG_EXTERN -OnigUChar* onigenc_get_prev_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -OnigUChar* onigenc_get_left_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -OnigUChar* onigenc_get_right_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s)); -ONIG_EXTERN -int onigenc_strlen P_((OnigEncoding enc, const OnigUChar* p, const OnigUChar* end)); -ONIG_EXTERN -int onigenc_strlen_null P_((OnigEncoding enc, const OnigUChar* p)); -ONIG_EXTERN -int onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p)); - - - -/* PART: regular expression */ - -/* config parameters */ -#define ONIG_NREGION 10 -#define ONIG_MAX_BACKREF_NUM 1000 -#define ONIG_MAX_REPEAT_NUM 100000 -#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000 -/* constants */ -#define ONIG_MAX_ERROR_MESSAGE_LEN 90 - -typedef unsigned int OnigOptionType; - -#define ONIG_OPTION_DEFAULT ONIG_OPTION_NONE - -/* options */ -#define ONIG_OPTION_NONE 0U -#define ONIG_OPTION_IGNORECASE 1U -#define ONIG_OPTION_EXTEND (ONIG_OPTION_IGNORECASE << 1) -#define ONIG_OPTION_MULTILINE (ONIG_OPTION_EXTEND << 1) -#define ONIG_OPTION_SINGLELINE (ONIG_OPTION_MULTILINE << 1) -#define ONIG_OPTION_FIND_LONGEST (ONIG_OPTION_SINGLELINE << 1) -#define ONIG_OPTION_FIND_NOT_EMPTY (ONIG_OPTION_FIND_LONGEST << 1) -#define ONIG_OPTION_NEGATE_SINGLELINE (ONIG_OPTION_FIND_NOT_EMPTY << 1) -#define ONIG_OPTION_DONT_CAPTURE_GROUP (ONIG_OPTION_NEGATE_SINGLELINE << 1) -#define ONIG_OPTION_CAPTURE_GROUP (ONIG_OPTION_DONT_CAPTURE_GROUP << 1) -/* options (search time) */ -#define ONIG_OPTION_NOTBOL (ONIG_OPTION_CAPTURE_GROUP << 1) -#define ONIG_OPTION_NOTEOL (ONIG_OPTION_NOTBOL << 1) -#define ONIG_OPTION_POSIX_REGION (ONIG_OPTION_NOTEOL << 1) -#define ONIG_OPTION_MAXBIT ONIG_OPTION_POSIX_REGION /* limit */ - -#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt)) -#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt)) -#define ONIG_IS_OPTION_ON(options,option) ((options) & (option)) - -/* syntax */ -typedef struct { - unsigned int op; - unsigned int op2; - unsigned int behavior; - OnigOptionType options; /* default option */ - OnigMetaCharTableType meta_char_table; -} OnigSyntaxType; - -ONIG_EXTERN OnigSyntaxType OnigSyntaxASIS; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended; -ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs; -ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep; -ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex; -ONIG_EXTERN OnigSyntaxType OnigSyntaxJava; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl; -ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl_NG; -ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby; - -/* predefined syntaxes (see regsyntax.c) */ -#define ONIG_SYNTAX_ASIS (&OnigSyntaxASIS) -#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic) -#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended) -#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs) -#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep) -#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex) -#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava) -#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl) -#define ONIG_SYNTAX_PERL_NG (&OnigSyntaxPerl_NG) -#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby) - -/* default syntax */ -ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax; -#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax - -/* syntax (operators) */ -#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS (1U<<0) -#define ONIG_SYN_OP_DOT_ANYCHAR (1U<<1) /* . */ -#define ONIG_SYN_OP_ASTERISK_ZERO_INF (1U<<2) /* * */ -#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF (1U<<3) -#define ONIG_SYN_OP_PLUS_ONE_INF (1U<<4) /* + */ -#define ONIG_SYN_OP_ESC_PLUS_ONE_INF (1U<<5) -#define ONIG_SYN_OP_QMARK_ZERO_ONE (1U<<6) /* ? */ -#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE (1U<<7) -#define ONIG_SYN_OP_BRACE_INTERVAL (1U<<8) /* {lower,upper} */ -#define ONIG_SYN_OP_ESC_BRACE_INTERVAL (1U<<9) /* \{lower,upper\} */ -#define ONIG_SYN_OP_VBAR_ALT (1U<<10) /* | */ -#define ONIG_SYN_OP_ESC_VBAR_ALT (1U<<11) /* \| */ -#define ONIG_SYN_OP_LPAREN_SUBEXP (1U<<12) /* (...) */ -#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP (1U<<13) /* \(...\) */ -#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR (1U<<14) /* \A, \Z, \z */ -#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR (1U<<15) /* \G */ -#define ONIG_SYN_OP_DECIMAL_BACKREF (1U<<16) /* \num */ -#define ONIG_SYN_OP_BRACKET_CC (1U<<17) /* [...] */ -#define ONIG_SYN_OP_ESC_W_WORD (1U<<18) /* \w, \W */ -#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END (1U<<19) /* \<. \> */ -#define ONIG_SYN_OP_ESC_B_WORD_BOUND (1U<<20) /* \b, \B */ -#define ONIG_SYN_OP_ESC_S_WHITE_SPACE (1U<<21) /* \s, \S */ -#define ONIG_SYN_OP_ESC_D_DIGIT (1U<<22) /* \d, \D */ -#define ONIG_SYN_OP_LINE_ANCHOR (1U<<23) /* ^, $ */ -#define ONIG_SYN_OP_POSIX_BRACKET (1U<<24) /* [:xxxx:] */ -#define ONIG_SYN_OP_QMARK_NON_GREEDY (1U<<25) /* ??,*?,+?,{n,m}? */ -#define ONIG_SYN_OP_ESC_CONTROL_CHARS (1U<<26) /* \n,\r,\t,\a ... */ -#define ONIG_SYN_OP_ESC_C_CONTROL (1U<<27) /* \cx */ -#define ONIG_SYN_OP_ESC_OCTAL3 (1U<<28) /* \OOO */ -#define ONIG_SYN_OP_ESC_X_HEX2 (1U<<29) /* \xHH */ -#define ONIG_SYN_OP_ESC_X_BRACE_HEX8 (1U<<30) /* \x{7HHHHHHH} */ - -#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE (1U<<0) /* \Q...\E */ -#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT (1U<<1) /* (?...) */ -#define ONIG_SYN_OP2_OPTION_PERL (1U<<2) /* (?imsx),(?-imsx) */ -#define ONIG_SYN_OP2_OPTION_RUBY (1U<<3) /* (?imx), (?-imx) */ -#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT (1U<<4) /* ?+,*+,++ */ -#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL (1U<<5) /* {n,m}+ */ -#define ONIG_SYN_OP2_CCLASS_SET_OP (1U<<6) /* [...&&..[..]..] */ -#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP (1U<<7) /* (?...) */ -#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF (1U<<8) /* \k */ -#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL (1U<<9) /* \g, \g */ -#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY (1U<<10) /* (?@..),(?@..) */ -#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1U<<11) /* \C-x */ -#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META (1U<<12) /* \M-x */ -#define ONIG_SYN_OP2_ESC_V_VTAB (1U<<13) /* \v as VTAB */ -#define ONIG_SYN_OP2_ESC_U_HEX4 (1U<<14) /* \uHHHH */ -#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR (1U<<15) /* \`, \' */ -#define ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY (1U<<16) /* \p{...}, \P{...} */ -#define ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT (1U<<17) /* \p{^..}, \P{^..} */ -/* #define ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS (1U<<18) */ -#define ONIG_SYN_OP2_ESC_H_XDIGIT (1U<<19) /* \h, \H */ -#define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE (1U<<20) /* \ */ - -/* syntax (behavior) */ -#define ONIG_SYN_CONTEXT_INDEP_ANCHORS (1U<<31) /* not implemented */ -#define ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS (1U<<0) /* ?, *, +, {n,m} */ -#define ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS (1U<<1) /* error or ignore */ -#define ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP (1U<<2) /* ...)... */ -#define ONIG_SYN_ALLOW_INVALID_INTERVAL (1U<<3) /* {??? */ -#define ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV (1U<<4) /* {,n} => {0,n} */ -#define ONIG_SYN_STRICT_CHECK_BACKREF (1U<<5) /* /(\1)/,/\1()/ ..*/ -#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1U<<6) /* (?<=a|bc) */ -#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP (1U<<7) /* see doc/RE */ -#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1U<<8) /* (?)(?) */ -#define ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY (1U<<9) /* a{n}?=(?:a{n})? */ - -/* syntax (behavior) in char class [...] */ -#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1U<<20) /* [^...] */ -#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC (1U<<21) /* [..\w..] etc.. */ -#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1U<<22) -#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC (1U<<23) /* [0-9-a]=[0-9\-a] */ -/* syntax (behavior) warning */ -#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED (1U<<24) /* [,-,] */ -#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT (1U<<25) /* (?:a*)+ */ - -/* meta character specifiers (onig_set_meta_char()) */ -#define ONIG_META_CHAR_ESCAPE 0 -#define ONIG_META_CHAR_ANYCHAR 1 -#define ONIG_META_CHAR_ANYTIME 2 -#define ONIG_META_CHAR_ZERO_OR_ONE_TIME 3 -#define ONIG_META_CHAR_ONE_OR_MORE_TIME 4 -#define ONIG_META_CHAR_ANYCHAR_ANYTIME 5 - -#define ONIG_INEFFECTIVE_META_CHAR 0 - -/* error codes */ -#define ONIG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -1000) -/* normal return */ -#define ONIG_NORMAL 0 -#define ONIG_MISMATCH -1 -#define ONIG_NO_SUPPORT_CONFIG -2 - -/* internal error */ -#define ONIGERR_MEMORY -5 -#define ONIGERR_TYPE_BUG -6 -#define ONIGERR_PARSER_BUG -11 -#define ONIGERR_STACK_BUG -12 -#define ONIGERR_UNDEFINED_BYTECODE -13 -#define ONIGERR_UNEXPECTED_BYTECODE -14 -#define ONIGERR_MATCH_STACK_LIMIT_OVER -15 -#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21 -#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22 -/* general error */ -#define ONIGERR_INVALID_ARGUMENT -30 -/* syntax error */ -#define ONIGERR_END_PATTERN_AT_LEFT_BRACE -100 -#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET -101 -#define ONIGERR_EMPTY_CHAR_CLASS -102 -#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS -103 -#define ONIGERR_END_PATTERN_AT_ESCAPE -104 -#define ONIGERR_END_PATTERN_AT_META -105 -#define ONIGERR_END_PATTERN_AT_CONTROL -106 -#define ONIGERR_META_CODE_SYNTAX -108 -#define ONIGERR_CONTROL_CODE_SYNTAX -109 -#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110 -#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111 -#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112 -#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113 -#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114 -#define ONIGERR_NESTED_REPEAT_OPERATOR -115 -#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS -116 -#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117 -#define ONIGERR_END_PATTERN_IN_GROUP -118 -#define ONIGERR_UNDEFINED_GROUP_OPTION -119 -#define ONIGERR_INVALID_POSIX_BRACKET_TYPE -121 -#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN -122 -#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN -123 -/* values error (syntax error) */ -#define ONIGERR_TOO_BIG_NUMBER -200 -#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201 -#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202 -#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS -203 -#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204 -#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES -205 -#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING -206 -#define ONIGERR_TOO_BIG_BACKREF_NUMBER -207 -#define ONIGERR_INVALID_BACKREF -208 -#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED -209 -#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE -212 -#define ONIGERR_EMPTY_GROUP_NAME -214 -#define ONIGERR_INVALID_GROUP_NAME -215 -#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME -216 -#define ONIGERR_UNDEFINED_NAME_REFERENCE -217 -#define ONIGERR_UNDEFINED_GROUP_REFERENCE -218 -#define ONIGERR_MULTIPLEX_DEFINED_NAME -219 -#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL -220 -#define ONIGERR_NEVER_ENDING_RECURSION -221 -#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222 -#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223 -#define ONIGERR_INVALID_CODE_POINT_VALUE -400 -#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400 -#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401 -#define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION -402 -#define ONIGERR_INVALID_COMBINATION_OF_OPTIONS -403 - -/* errors related to thread */ -#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT -1001 - - -/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */ -#define ONIG_MAX_CAPTURE_HISTORY_GROUP 31 -#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \ - ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i]) - -typedef struct OnigCaptureTreeNodeStruct { - int group; /* group number */ - int beg; - int end; - int allocated; - int num_childs; - struct OnigCaptureTreeNodeStruct** childs; -} OnigCaptureTreeNode; - -/* match result region type */ -struct re_registers { - int allocated; - int num_regs; - int* beg; - int* end; - /* extended */ - OnigCaptureTreeNode* history_root; /* capture history tree root */ -}; - -/* capture tree traverse */ -#define ONIG_TRAVERSE_CALLBACK_AT_FIRST 1 -#define ONIG_TRAVERSE_CALLBACK_AT_LAST 2 -#define ONIG_TRAVERSE_CALLBACK_AT_BOTH \ - ( ONIG_TRAVERSE_CALLBACK_AT_FIRST | ONIG_TRAVERSE_CALLBACK_AT_LAST ) - - -#define ONIG_REGION_NOTPOS -1 - -typedef struct re_registers OnigRegion; - -typedef struct { - OnigEncoding enc; - OnigUChar* par; - OnigUChar* par_end; -} OnigErrorInfo; - -typedef struct { - int lower; - int upper; -} OnigRepeatRange; - -typedef void (*OnigWarnFunc) P_((const char* s)); -extern void onig_null_warn P_((const char* s)); -#define ONIG_NULL_WARN onig_null_warn - -#define ONIG_CHAR_TABLE_SIZE 256 - -/* regex_t state */ -#define ONIG_STATE_NORMAL 0 -#define ONIG_STATE_SEARCHING 1 -#define ONIG_STATE_COMPILING -1 -#define ONIG_STATE_MODIFY -2 - -#define ONIG_STATE(reg) \ - ((reg)->state > 0 ? ONIG_STATE_SEARCHING : (reg)->state) - -typedef struct re_pattern_buffer { - /* common members of BBuf(bytes-buffer) */ - unsigned char* p; /* compiled pattern */ - unsigned int used; /* used space for p */ - unsigned int alloc; /* allocated space for p */ - - int state; /* normal, searching, compiling */ - int num_mem; /* used memory(...) num counted from 1 */ - int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */ - int num_null_check; /* OP_NULL_CHECK_START/END id counter */ - int num_comb_exp_check; /* combination explosion check */ - int num_call; /* number of subexp call */ - unsigned int capture_history; /* (?@...) flag (1-31) */ - unsigned int bt_mem_start; /* need backtrack flag */ - unsigned int bt_mem_end; /* need backtrack flag */ - int stack_pop_level; - int repeat_range_alloc; - OnigRepeatRange* repeat_range; - - OnigEncoding enc; - OnigOptionType options; - OnigSyntaxType* syntax; - OnigCaseFoldType case_fold_flag; - void* name_table; - - /* optimization info (string search, char-map and anchors) */ - int optimize; /* optimize flag */ - int threshold_len; /* search str-length for apply optimize */ - int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */ - OnigDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */ - OnigDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */ - int sub_anchor; /* start-anchor for exact or map */ - unsigned char *exact; - unsigned char *exact_end; - unsigned char map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */ - int *int_map; /* BM skip for exact_len > 255 */ - int *int_map_backward; /* BM skip for backward search */ - OnigDistance dmin; /* min-distance of exact or map */ - OnigDistance dmax; /* max-distance of exact or map */ - - /* regex_t link chain */ - struct re_pattern_buffer* chain; /* escape compile-conflict */ -} OnigRegexType; - -typedef OnigRegexType* OnigRegex; - -#ifndef ONIG_ESCAPE_REGEX_T_COLLISION - typedef OnigRegexType regex_t; -#endif - - -typedef struct { - int num_of_elements; - OnigEncoding pattern_enc; - OnigEncoding target_enc; - OnigSyntaxType* syntax; - OnigOptionType option; - OnigCaseFoldType case_fold_flag; -} OnigCompileInfo; - -/* Oniguruma Native API */ -ONIG_EXTERN -int onig_init P_((void)); -ONIG_EXTERN -int onig_error_code_to_str PV_((OnigUChar* s, int err_code, ...)); -ONIG_EXTERN -void onig_set_warn_func P_((OnigWarnFunc f)); -ONIG_EXTERN -void onig_set_verb_warn_func P_((OnigWarnFunc f)); -ONIG_EXTERN -int onig_new P_((OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_reg_init P_((regex_t* reg, OnigOptionType option, OnigCaseFoldType case_fold_flag, OnigEncoding enc, OnigSyntaxType* syntax)); -int onig_new_without_alloc P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_new_deluxe P_((OnigRegex* reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo)); -ONIG_EXTERN -void onig_free P_((OnigRegex)); -ONIG_EXTERN -void onig_free_body P_((OnigRegex)); -ONIG_EXTERN -int onig_recompile P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_recompile_deluxe P_((OnigRegex reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo)); -ONIG_EXTERN -int onig_search P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option)); -ONIG_EXTERN -int onig_match P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* at, OnigRegion* region, OnigOptionType option)); -ONIG_EXTERN -OnigRegion* onig_region_new P_((void)); -ONIG_EXTERN -void onig_region_init P_((OnigRegion* region)); -ONIG_EXTERN -void onig_region_free P_((OnigRegion* region, int free_self)); -ONIG_EXTERN -void onig_region_copy P_((OnigRegion* to, OnigRegion* from)); -ONIG_EXTERN -void onig_region_clear P_((OnigRegion* region)); -ONIG_EXTERN -int onig_region_resize P_((OnigRegion* region, int n)); -ONIG_EXTERN -int onig_region_set P_((OnigRegion* region, int at, int beg, int end)); -ONIG_EXTERN -int onig_name_to_group_numbers P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, int** nums)); -ONIG_EXTERN -int onig_name_to_backref_number P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, OnigRegion *region)); -ONIG_EXTERN -int onig_foreach_name P_((OnigRegex reg, int (*func)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*), void* arg)); -ONIG_EXTERN -int onig_number_of_names P_((OnigRegex reg)); -ONIG_EXTERN -int onig_number_of_captures P_((OnigRegex reg)); -ONIG_EXTERN -int onig_number_of_capture_histories P_((OnigRegex reg)); -ONIG_EXTERN -OnigCaptureTreeNode* onig_get_capture_tree P_((OnigRegion* region)); -ONIG_EXTERN -int onig_capture_tree_traverse P_((OnigRegion* region, int at, int(*callback_func)(int,int,int,int,int,void*), void* arg)); -ONIG_EXTERN -int onig_noname_group_capture_is_active P_((OnigRegex reg)); -ONIG_EXTERN -OnigEncoding onig_get_encoding P_((OnigRegex reg)); -ONIG_EXTERN -OnigOptionType onig_get_options P_((OnigRegex reg)); -ONIG_EXTERN -OnigCaseFoldType onig_get_case_fold_flag P_((OnigRegex reg)); -ONIG_EXTERN -OnigSyntaxType* onig_get_syntax P_((OnigRegex reg)); -ONIG_EXTERN -int onig_set_default_syntax P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from)); -ONIG_EXTERN -unsigned int onig_get_syntax_op P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -unsigned int onig_get_syntax_op2 P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -unsigned int onig_get_syntax_behavior P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -OnigOptionType onig_get_syntax_options P_((OnigSyntaxType* syntax)); -ONIG_EXTERN -void onig_set_syntax_op P_((OnigSyntaxType* syntax, unsigned int op)); -ONIG_EXTERN -void onig_set_syntax_op2 P_((OnigSyntaxType* syntax, unsigned int op2)); -ONIG_EXTERN -void onig_set_syntax_behavior P_((OnigSyntaxType* syntax, unsigned int behavior)); -ONIG_EXTERN -void onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options)); -ONIG_EXTERN -int onig_set_meta_char P_((OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code)); -ONIG_EXTERN -void onig_copy_encoding P_((OnigEncoding to, OnigEncoding from)); -ONIG_EXTERN -OnigCaseFoldType onig_get_default_case_fold_flag P_((void)); -ONIG_EXTERN -int onig_set_default_case_fold_flag P_((OnigCaseFoldType case_fold_flag)); -ONIG_EXTERN -unsigned int onig_get_match_stack_limit_size P_((void)); -ONIG_EXTERN -int onig_set_match_stack_limit_size P_((unsigned int size)); -ONIG_EXTERN -int onig_end P_((void)); -ONIG_EXTERN -const char* onig_version P_((void)); -ONIG_EXTERN -const char* onig_copyright P_((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ONIGURUMA_H */ diff --git a/native/frameworks/CocoaOniguruma.framework/Resources/English.lproj/InfoPlist.strings b/native/frameworks/CocoaOniguruma.framework/Resources/English.lproj/InfoPlist.strings deleted file mode 100644 index 39d5b82c7a6c406ab1adc9b76c29ce538c2bedea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmZvW%L>9U5Jk_Y1lQsZh$}Zjp@M!v+Da=vBHB{?dG(~-y0}SZ?wvFFeoBt)7`PF+ zbKvCNsEVuaEr|zjo}6jv=m~7pVsdKT$lkf^4yI;Kuzs1U?POl>*;rSSg8OnOndr;~ hO6!Yi)u@(JGV0G$Nq+ddW#$#E^oxm@Ny*=>`2l05C|Lji diff --git a/native/frameworks/CocoaOniguruma.framework/Resources/Info.plist b/native/frameworks/CocoaOniguruma.framework/Resources/Info.plist deleted file mode 100644 index ccdedf455..000000000 --- a/native/frameworks/CocoaOniguruma.framework/Resources/Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - BuildMachineOSBuild - 11E2620 - CFBundleDevelopmentRegion - English - CFBundleExecutable - CocoaOniguruma - CFBundleIdentifier - net.limechat.CocoaOniguruma - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - CocoaOniguruma - CFBundlePackageType - FMWK - CFBundleSignature - ???? - CFBundleVersion - 1.0 - DTCompiler - - DTPlatformBuild - 4E3002 - DTPlatformVersion - GM - DTSDKBuild - 11E2620 - DTSDKName - - DTXcode - 0433 - DTXcodeBuild - 4E3002 - - diff --git a/native/frameworks/CocoaOniguruma.framework/Versions/A/CocoaOniguruma b/native/frameworks/CocoaOniguruma.framework/Versions/A/CocoaOniguruma deleted file mode 100755 index 3799f6f6b12ef6e74a754f9b5d9ba44383401df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563988 zcmeFadw3K@);~Uz%p?OObX*dQ8YODfps0yUlxzs5$xPBC6JX^ciWqPNbiJ`;hRc#0 z+Zmv3TUb|C_oB@0jI;o)&k#Ko(r zW*lBW{`-*wKXTwl4*bZ0A35+N2Y%$hj~w`s13z-$M-KeRfgd^WBM1Kf#DSfskDbLN z-;RmDEdft|JZ*h#wh*lY;NL}fTH|cC^78SXN#j}6xqmt+XODkom=+G4cwA;ud3j*^ zyg)ZxZ+w%eVEk)efRzaRqcDo?{^zjOb_a-_ia_w*ida-{e8V2&cxIar6y`BJ!e!#4 zI@3Rnul)Y$56zlRd3xh}$;7vVLECH;{$cuN`u*k8=lQ443X}(?-P;>qrOK%pV&bFl zIrz+Y>s4OvuL#V3;E|bTL~nenOnd_eZ~!Z8`$Fs902a`SknCXUv}V@N^E*8{e=O zIiglKPp5D%NjwKN$*}~1EH8J9`_CxrJOnlFn z87SNnAJz8~3mM+!<&WO`3xB!)p=lKr4?R#3=*_>qz38KGPkcaOk~`zMOA)ZYvXo{{wvYO$$t86!fOA$i%n8q>sYA@R=$61-&<; zry}i*uieDgZswx!595oG#&Yz=7ygdt&NLf=!av*|z4h|B`l{W|bB{HNqVNynySJiy zl>EN@ByW#=FEFSvzXDD-e*5Z2{V6JAd=l?V5Ifw0r^CXe3rE*Sw zP_^{t7l*#K=Eam~-78Oy$U+>*zzz(IG5n*=n5lROmXUpt2niTszj56Bioo=TZ}dHI z@9b%_=lA4Q$)mwXAe`XJ`S?_PV|O}m68>R5@!S85kll7;uwwR&4?S=%J-nzJM&5AW ze1wpUf8WbzJB-+K^O1(RLF}1}=er+}vHGMfK(&5n`+@otKRSDQH_hj(6SaL$7~rQi zAwIgUa@fK>1rTvR{`-*wKXTyz8xBm6luyMw#EIi1`E!?~eC1WnN^0I{Bi`mycIJfj zft7ZfS84GL{z_6lkeVX5O7;(=cTP#_r57KIw*mALfJ$ni8zG-^0yz$2W+-WSXFjKh zsHAL;?#>NM@>bVm@gA{!$`&e7Qk~ZwqI`~Fv4|^rM_kl9;u)X>=HK8oCE9M{IdhQX zQHvZgR7cG?NiA|o{_Seg5~a0CA7pQRrz-}tB?cq80GA^9cd5gdT{rwUN*954^#EOA zf?9d=7Jn9R%iSi{NAV9eKJhENEtd8m(qbulV=1D&mH3K8WN3;-Bko#;46!eE$I73l zAY~F#q!tGaF(@u4?8(LdZMqCN@H53MlEV%mSS2Z|2i)ZI!8v;1Tu*uyND1>ceaQL1 z-;Hpz=YrbL2m0RxYEmn_y3HfJN@!89-Sf{wZ{@#(UU@#~(dU6i89+Yg9Pqkr!tyW` zTo)FeY665dR3m%G-mDy#x5aso?%n~;cIpsL)sq4Qc|Z_ry#0u04AC!(Mf0AaIv+cL z`l%VikbNe=^l#^(TFN^Jjzv&X4nWj_?^B8=w; z@Lr`Ea=o7M`am>o4L(BQ>fxf&;>kViQ?Fl5DQaH(QObdm+{z)n3i*7>Nl8oo4a>I! z#f#B*#pqT~{?XuepVGnm+}+}o?tT~R>B?^2(W`(GSdj|H~3&s307IzWV#UJ)5 zr@z;K^Tq)xcNZ$~_1qo|EMu{Hdo0f4o^OAQdlzt+jewE-Z78tgh*>Xv6~&#)yl%!h zUBKZ}ho&RT+sFb&T^##k3_B{R-)3R&W(cy4Wa;|#lo$#J z1|aGhhN%UWyAZKcwy=)Q+q0XTyvV1F2K}o!b~M+#G!g+duK;YvJdsz%%7dNogno=^)_5hlC9% zJZ(~Fmrn^vh!6g%EEE>%E`tq=l8zoGkiuseo1MRB8C;T<_9$ov1s4+qYTkMd^(%tX z(khUayUnYF0dOk7NR-rdgj+vMLDf0mEV#haCWN*@$L5A3$3YzNrX@5MkO&asNrbp% zGpz8Za?r_6>VF3Uum&WhvBL6ZfECfSsrXB+svOmSOGRkTd(h>5YBmZR&v=_xh8HkI z+msK8VcPOZ!~`WZOVUzHB&~r;^=Zz5P(5WzL~pMHueK0E2?#^`f-@wQ^G(b92`e*+ z@Irn*q1STC&f4NQY8}sL$op@iUTKM@{RJOB^{QWg0NiR;makws>irH?ap6{Kl*wXD z2T5`RampstsYvi?E9VemPA#ZW_5*$9(~LRSv62fv2lDkaPI1{>T)~>;2A+6;m)yP= z{85v#xB|Y9gT!-?twg2&O*GsF)QC6RNP-|X^JcrAWne6lLeYRz|M1r+PQB_Cpp8|i z?v}G?;qYwA$rvXvBnR|ABFZ#Hrh)^KI((S^A?E6q7pFM)+KL#3aLy;J1eaaVQO1pmG zn9U}4MT3_$a;_cKm;H%Euvh1WjQyTCq~%?KS2Qhy0&3n$GIglao%SgQ%ajhZM=I4> zO@5sy)biHS3%q0YoYk(;gO(n!hPrfgIiYR^+Rf4lZJtng{s3V3D=@J7{2m{o680!9 z`tg+(BiuwlPev^NrNxK`tc+8M1~vKk`}C^92r@k1v^&mWkH;P@^S6}Qb;g;4dgznh zoSB1mVw{0avFfq~oT;G#v^*DH(X=>LTAtdDI1-u(Z86rIn#EYd>_aW@_ndcNO%HUO zH8g5KJ!15C7BH%ZgFz%}kJds`lqotAZliJ(PX}6ICY7aC>H2e20O9K%d`vW7zXuT2 zLX%BsROkCvq?VTfVxnmS8A%Mi!9E%K6bt>W=b~rYlvye%K4ptn+2K{*mlR^Ka~;nO z#h!PF>>#bG4Wbc!6y$}%5MiMX6rfq7KDAIGHLm4-h*F|ydpO&C$`QzvzL7Gh&Qj0` zouBDb^M*2#^FoA_4N@x!gd`9dPUtGjaOq_n>LfEF3fq7ar7ws<(f~0HA)nF?ZlzFT z#-PAXO`CXXLU`swTk>y&Bp#Z#3cm82Ht~yEwIP130t~1AKLsvd@!?5z5nkn?JQ4 zfU5vV>i@q1;*GZW^3Mbh#_Ts%5e&7*sf%@6AI>X54if-1ZyEA~oCg^>dDos`x|(>h z^%N6}_B{lenvSBTaGDxXE#%0j9Np$t4=G*AvT*V0%QT7ZeI_QVFEI8nS=vYlNmRdj znBh8)sPgd;xU{@QU|ck$=O9tg`2xTehTh z@ctsfW>H6{NHCL?<|*A;%48$iz>wEzjGV&1(o4(x3P_`A#~A9o5>_r*_G0w?x^VCk zu<);xq!v~ni43<7^{*ZxiQU4?nY>D*(qMi<|A?YP;b8yVT@o`OG1S!<0x*mv4A6QT z2!binn6x7GT2^!#)e}whJHVKgfjx*MHl?bK#nQ~(GUnTv{Zx1yP|9}Xy^HXxdG8<^ z;ssJAr3ul+h=vXI{n05~Qp!-H-QaW^XH5ywq82V@B<1Y|qG;MK-o3A*I3>m!A@mmY zDlP9y2AlQ}=Ug;x0K%A!)%}Kdx}hw0+QUdDk$>$$ka&*$dZA?B45IhIh~h@kQvjg} zlA6~=BCnk5JcDfg-8|uMNZ`$xMQF)r zl&iwFU~Y@2p7ceFXCsZL$S|9kcZH)^2EFqac3ZS;W9~j=X^oTu1|X#jXH{6=i_}oK zrmxiE2@@8>DRUT zi(EsoTHYTBSWAa;h}a#-Am+Dtm3M=8mxYc6??5>|?fT1D ziC;w1(s+r1)tV+rD!9%xVcybPl z$^j!mjJAkt?I7n65Tb=J;G=iBl~eixLJDg>l*Ek4JTEXaHWpD4n99xPO?Vl|z1~X8 zqBPip`K@ykM-y=TNMcb`i-AYHthzHA7)|arylE zevqN%^&=qS4J~-Ff`!mR@RJG&{KS}#JSogRtZLPpD2tlsvTD?-ucjD~d^<2LBrr0p z=g|iuw;Bb2z858;dXVa0^AZPJaGCU>=4}H&?l#^h0d+S)K`1fMv_i{d_b_q5-pHG< zXM0<1E}v2c?wUitSNRsgP|T1Q*3nDLdlzLy({|!70@;Y;OMF;(FtuYHC8>oIkVNb` zt-m{y4XOmE=G}u-iaw+_BAV(pmCbkZj=?ITgroXOO3?Crgol_=j1M;X!31PKSzlrl zQ%qQCd3}%qw0Z^QU<)yS1{UBz6L^)q`eei#SpZxXLoRXTUy=<*$dBNIAt$>53zRV< zkT~O2XvwaaV727Gor*^Ja+U))xb7@dnmEiL4$}wC4aR>m!vc_$Q$EZGkxHuNq)%zq zn`4PQ>tV8NwB*q-^ebZk-IH7S^K7&X*yE{(ieAH2bSqcU&r{iI;bBHXULIc2v>SO~ z3B9^ibT9+eVdbfX>yX6NT^`EgVv-jIEv$#N()g7@2^hbwMy}B;1=6P{P^^~sGLcOj z{2M+Zeo}j^O_C{IEu6#9>mN+FV>t~C=V>z%0N_E}sChqUc@OBXBNfbtZgMN_?!jGH z^12quaqpr{{O?1V@c#7_z!3c+qN($varK21g^H;`m`@YJ(Ftn+@K_IksZ_B2bJBQT zPz{2IpwMXA)%ff6e5_X zMrHs_L1k%x)qg{=%HCeRxLZaS6S$UaJ88-2RAlHSqkaxE{X4c~eQOMWi=l_7wscw; zE{g$R>H-U@szXwpe+KbrOc+&pNi0JZO%P9^`9WIG^=J-0s~h}X)DUJOfp7nJ;9@uU zbKT&7{CD6#=?0(K4gS!-1OJ2w=CtQ@gBSig@U`9Gr*_3?@81hNS~E8d%Q4Xf7_DD( z%qv=Qe77#Q+ox>FH7EblLbloiLsVFlj9wz2?Jq3;4tnCTRVCh*Xp-?B6t5B=q37CKFKi{^a(O&0o^ zhtiI)&=)*(;pZ%*^UyXPI>bY2U#h$FBOYqtq4#)b6HGRwwegU>n1!|@)a-l{f9;YV zlg?x>C994mNl75_F_}dCkXqoqKq~gVDUpxNaa&Ror2NESilmmfr2JAB-}pc_NSWF9 z)lye{qBVJ7&=*_KEME%prTn{m@ug;m?l}w%1A}IdB=SA=EuJ-KMJV?Puz9{xs{R&v zpJ-GuMrjgFC040Ymr}OYG<{*hNB(L7s6`z>(dJc0NE$3{rFjEUEvaR#(cNUxwZdn@ ziwcq%P6*X`9p?x9GXOEd_|)n3#?OEb%LctrRWVeO>Wp*kM}?nTP~lmTd+CoV$mPkR1_7Aq3!E&&p-Vt6xSMc9;z2u=5VYB228N+1iK zRd{3N%2O|@B`Jz$ttYqB@PoPG+tkVqBs6aTnjQksLKX#*-Ris)wg>iby>Xo<|40C~ zx0wm6dc7JHnh^Eb>XqMcdGf!lZ1YB&-37t5l~03^RX!ycwpvl{`kC7}|1HA%|GyAUL%@GTIB~z6)7|e}x{U`c#$*yVA*C^H2CGa?rdyo6hB%3}49>~S z-kc2jdJwb6;^Lpb&&A{#Ea9;>&N15v#X0;b(R*)o8he{}O8zOkyqFyDYX$mPaDTJ21_1W+tN<oF(U z$C&Ur^&5~Tsm~G!GsxFb9-q37z{KdpOw8_lN<${gdq9j1q)9>{TaVNx)MKYge;&0V zK0OR^AbVa-zzT^FdW{HC86l#QF18doAQ=ECae0*@mrtGJ0-hDj1|>Y5`ecSDm|oA| zlu!=Qp{%2lBM&j$o_cwht@;47^HDhhz@`Z=L(+bZB?bm9WDGah8rD`c=p~l*iAz~G%Eea-L=Z~b0y6xMDf!6c! zy*MKt%j>tPflgqV3wye753@-)pbb%|4Y$OPPP0x9OnM7q3wR`_vS#a>l2vyB`5jxwAuT5x=HE ztW5cNSD8AZOvxu>!YemrdZTX!KQ@tg>`gu{e3BeSD{T|%mZ0;5cGWy?95Z<&Jn9nJ_fL=5CiioA}>sf=Hm1Wq?u z2qa;2tGe6`!0&Nd3lVohyQ=RehO%}6L$~|Xnxgvt4D%T`6VikgPK07wKfLdF9RE>dxR^6O+ddhZly^x^5+Bz?w|z?rjp+*Ei9!TS4dK-!SMDz5&aM{m zTh{T^K$}ZaawW8{6y02qQu&DjLzXeGTLTDn=JjOJV*n zg$m0S46}}0fP8NI8T7>4t)A$WxLiyAZ4${f?-pLo=lZ|Z6a`WH*{uqD{VhH_76@1! zY5iW|Uj@r~O-XVj>?MA`dRW#kd#PWhBC#pw8~OqfY%F?^?H`TQMa_FGVyZErI^psK-EUG)+pf|qzgoz;G~ z(jh)pW?RzF8+}8HZjqv`!7q(6pZai{sCuy5Zx8grF2evas&DbCRgla5R7#F91W}kB zj8ZGVi$(hUy2t*7&u-9GBT#q>s%(`XqX?|w^w_v&ewsb!e%X@heC{=nX!_J>Q#Oih zXArx@SSt1^-xxztB@F7khH_Vpu$YeFEr}Q9vjc>soAGVd8O{-2`x_z#&*+x2{O@MB zG{*-wn}`$l{V#y$fS`su4NsLIVL-i2prWg+-(vvV=xG3*!4qaw86 zM(pKc{QXdW8YQE|G*tNIS9yiu%M%=o>4QO$&-92)t-l;Sq1Vcs{tT=UHgU)D4@?2! zX>v-`+_pGA8y8+JwPV6RY-+qsbu2Vz=o;ekJ1SCYZ|xiGS3ArmJVlwhmy(26$JmwD ztBCl*z4#-%ni$McHaC5ipe1Q55N&^_>0pZ7eyi~69r2pu*G=s%?Qxeaiy%wm;C@OD zDNP4m_ExjNg`muCn>~UYUi%^+R;%IQn-bl&WPA8ff@|}VflZOP+NQlrM%#;)RL4n8 zU%HBFkH#0(?)(Vh_;XY49^q=bxQ39J{d6;4W-Aa}4y`^pJ&YAU>A3p{@#rQh(K z3#@>+g;!mkI(TDYG5o~5tlD{YTM*kl&PQg(+eSX-aEVK7VsjBSd|aGKAJ8#e{ea7- z?3xm}1xkL|GHNZ=`3M!jBws1K7vI)09__NK&;w&&cHWWVQ%lo*>X;m#dI#n|<>(mq z#Qy3k*90u1tnA(=7}QGF^^jDo$q^smqjZ6M*3MUk zzMmfuzV)Ml0RvUWN(TdWV|-U)zkQG z_?V;^o_Z&RM%2?h!L)i8#a>)bTPenXdOA~MB-PVl z9>ZBrXOX6CnX&Azp!Dx}*5G*!Pa__p8?B^#B`Rm#aA@7H--KAXD;a*ka#td`0w-xS za0h-Ocl8S-Yh%BbPsh#1eyk9Tmzx}-uzJ6;*WMcAQ%}{0wjsxO5i3%1S6^ZAm#7!| zZ#vB@{Emf^y*1hnHS1NY!R!5c14@R`yrdt>gBxm@IwysBb)G@-7@Cdu0V{6AQhU^h z7nPk>wnc~-sU-~)<*j|qJi&J4ciY<|ValqOU|PLrmAwq*c!4yK;>$lPEPfEwV50FX zKoFkuwWLm#u!WEDB^n(d`S*J52UO3VcW7Z6*~<#5Q)UY-o;HBnM7F7Il%5l0mV~D@ znv%a)RNe?Wu^3=nL{7&?)Cqg^-@=Tsd)jzTY$SU9Z+Pu33~Mt$lmi6x2!P_TxsfDx zmN?=9sjNMFjW1qxbhZ@QhAGbFpu{*xWXlUu<0|_yL5UY##@o6345*4N@)=jvXQEvB zoXZyIsK1K9+kx4c36{752~e!b#$QOUT;5qc)*ie-l&h2Cgg=`~*KUNEAVwB|!GLu} zX5)hu5+U={qgH2l)ETK(JDi2FNX_R%npeHYB^Sg8vwM-}UBOhqGmI&=AZph);-+F-jjxfzMRUhYx4K{~WmiUx1<%kq_UqfBMBU1Qv5^aj zEQ$<8gATYYrBdokNF|P*24^`Id*EmCDTfeRNkRx2!9wD{kP~8`ZZ*SPGt(P9Q%bZ+ zSltx)8c@{qcJ8ephcAfy4FD{YStPXRem&pJy_n~AEIbt*WV6*=vG5cfn-uCiz=Ln7 zo4_c%ar8{6Ye1Zlgit1h>}X9kL5dUu2V0Gg#8WgDEoq3=~c{A(9H9 zW#dqOB0iddg`R2nei6@Zl<_FS#{qmPVE%$QQ+GkhK#%?w9D%Me9N>jZRQtg^qB7BimUGtMh!U7S6b9K|#5Z-Dm3Y3y^O*S% z?cAM8bJ7u0I5`>)bY+*?&!oIhjB+3yBB={pdJ8gx^g)12A^H6bVxmq4>ABlFi=8f3 zu;78kz>ZNY`wZZ(;5m$^70+AdWAROMF6vQoCY5}Kcs4UuGR$CB@OI>M=XYQZ+5wOK z+pO|GF>dWFcGL!%_<)rMHDn76rdk;PbgLCE*sqSj0Q`*$B;&6=n9K*bBu4d8V2An4 zIJN8zl<*FoukrlOd}wH8wDz1TFt4pnOm{`Txg)~9V1o-OW(+PD!kmf?EaS?+=dr&jl^r-@pGX5N?#Qgqq zFmmYt(AVT&)f?Ap-(tcLtW<+6TzXt%YfQ}GW9esgF zxWvS2?_Z|YV5p1+Ka3=r;AQYGO7Br*nffpwjtO-~KrzjAOk965aqT2lO^Qu;;y!$Gf*4QkU`UjvK%&wb2?17A=ca@@p~#}f zr5-h56TqXnyO^nTveTU(o|EVnR%6&}5tR|>c(B#vE=S;2xhoF(jn*;ak%9Pv85&Zv zA{{6J1!AJe3Os_|kB)FD`njl#$r5YFIP8Yd1Avs@xoQUX&$U2$OONLSfQk`*2G2iH zz^aIo<#vBjDh}Wb1D?_hw0zBeS{9v9V7RPb48u}qNoC$z}kZxQ`7}* zKjO`PQoV)ut~U|I$_p+7Ct%RCw*55_MTj=YS}Mj95<$)=mh5Ncn6jo2n0j-lGjKvw zYf{NZzXsjFi3K_1B7U0C61$W69din-UUL(+E}lRhVkB*I`_ zBQ+ZxF>(UM_K>fSxd0-W1TdQfFs_%p5p*OQn3gR-URtcQo~Q6la`+sc4frNGEX6wm z;qS?vdFbIJmI`7T&ymGdo{qM`vWAx2NiAww)TZEN^cKAPvY-Lrtw?A=)| z<0oFV6!!UnXo?t3z@%KVZ}Aq~os}~CD5UfgCJ64VR59P3l_G>_{iGMge+7p_VPy-H z)ZWOy7`!hl1%|W(%Rd*ZReM-PEpa)X-!%vJ-6_mol$(vW#ZGsYqc->}!U;h=3r8IE-8n``8n~cRxH!@i_1dK>7oCX5!l#_sLVa3sUnpFoBGY zBA1#X$){by;w6ZY{Hec@?AxPGt4Mnlu>u zWLzgvjm6QinK-)=ctwJxU80V4!CVhqEuVG-E{7c-yb0#OSXCm^7fuNhh~5DJcs9>c&NVj;IaA*v#FHbqS9Ia zC1%Q~CEa!fbHTVy-h2l1%$;Q9ctUesfh(aY(~UGSRPG2|h;J7Spb17keTwRZ!t-sj z-)45KksV_R=^?k$3F^7N4klab_S4vrMSg^0188~{56!pVGarja>#&cD9MG95qbADX zGjf+xSo|4rTub&q>|-68wx6|!O$&eu{}&KKzA#0nb*w?I?Lx?j3}TiW zzKD%r74^8Iz$#bmu?6CC_gNILf%jm9`U#(s@?3;{!uPSi05JFE?PgY?4#y2JBj0Ll z@6I)d<+2BBa`$l~!M(+(fcA70vI)dRg*1N%;6+o1pA^!}A-IMeuo5UffGzQ4*9NDA%aD=X2kak1Qr#rjeQfXE~O(JPQitexrjk{Q3<4yolJ zYZIPoJX-;CCEn}tSZ%>=aOErPozt9(1f?IR2(tnb1l}@^xo)rDu?Va6(RQMgrb>hc zL+AAtLysC)bl3NFUSGVZzH51XUuL`d)`5Ojx7t9q-0HIG0<_FGLw^TD0(LDE>xo`t zJJswY%1Muq`AL15rUHM!Q)50>-`1S}g=)}jB7;xa0x9Nn&Bdo{!BS=hShjxt_iTOY zRbn6P67V^O0TbOAqmD9Xg4KWL^Sr=%v>mor7i8+RR*Pld>uN_iYK^PZVrsBMXfSgR zb^zK+DTbO^kgiVzXszGzCAayhPrr+Y=15PN&t|;4>q6J|Q(dSIkP<%c?LogoSWNT2 z@6~~NAFXS+_)5FsLMK?VnjpI+{&E|mfa0}r2dJ~WW&-!Ji^2@kqrw*4fa7zb_dX7=o}+0B3yc1 zqTF>~rI{jN(DZ4}(`7h5C~U&g!RpQGLyuckX(();YC=B z!+LqXm@a6|sJo=JwiKljm$7>jmi#5@J}r=tA=x{;EiH#pPw!ytJ9}E)>QtPAD$0O~ z+UC<9$uK5jMisq~sM^cD9g%~xoPwn``4q;e=Wra+r-DJY*>G1yF%DX*&h7DquuAQdzH7#^1qqAl8z&|m6_=X1c;4Tz=jW0 z3D%*jTCsQ>3bT_f6e)O0l9bYelJ!n70e9jC`c)*3~m2V zUBu{xT2eaI<#wt|S^lRLx1vIM-4zl_t(u@}R2d1|qvx%Rc6U6l%cm7i`AmA{3Pw2A z)6ZFV>E5Wq(M9Dec|kg@p9G-tMyJCn8Z0)KWZ1-(l5{kV&D&A}(PnRmJG~R=6?p}J z)OayJA=n0i7V}FSK^&UFLhWIr*z4c=m@hs<9Og^N2o`y@%7hGm7^vb?i zyu)1dsj$%(R5I$;*geXObahm!*k^RAI?5$pKH8;@O2R8?l^r!}DWTPOwi6jUIflh= zb!0m9m)p%`lZIpu)cViV;v7*a!RAD9wpYQDkXoFHcP8FwOh_?iQg}ls;z=QSm3#0c zFvTWfY_18&UGY_qio&a-GwQa@Ph1a;VKeX zTt?ll`H34$&|Mbj1`9NA1OrW-sQr=-L67Q zRMYNua==&iD@}R}7SEswpCC2-KdIg*RBf~?V$DyKj@rt^R9o=oW_Mz$y{N7e`z-Sl z`EJFf2!ifkQ5EYgy3-a(R7J-~JM|x~EU-YWpldH)Ln^dThy?ifC7l;yuOdms9I#Rb@pcfb)za0$OVcN35e z^Vo{P>QPM}Y2jIH;Mr#5Tt_i2^+Eq_Gp>=;VLDlwV9@d~_A6;)x4m6z(&JTMyi0ig zxbP%!wnEIYA&^T)gJO4;OdLmT%2%dPZQ9T?`oPAflM7?B$(4(yt|S|55ry=Fet93e zP4|aw@MRvhn(ajJYCq<@7C|_PB{e$-;mfYuJhV^oeHDxO8=W{3mG?#EYp?R%W6q9$ zSUEq%mtAjmW1@w#9DVB#p<(YssYQa=;z_|b z#3ZRq2}ppgL1+oR@eiNR0GIi>qWhB?m&c+$ z_=mi#H{xxo6wmz>?@_9zT6WSo=Zer%L*V0?nk1eH_EZ#Be|PwY@?hF zx%}vPtVY;rzu{@i-(as=JXK2ykxGHfjeyPM4zF_9JNPZ1au@?mD$~Vci{o*s37nJi zo2rkuc=oUmo9x5;;)uQlqTp3;rO(AW>ms4W0Ff6=wN=Bny?7Qw!%PQJ9{!ZA8cwqR zT0LrcNcSr5T5U-NE6khweqP!HA!r< zVE55Jr}JRb5zK;JcP9ObGJ9 z?S{A$AvTW?Lhz7^0h7rXDdZ99#xbAzI&q0+o(`Y3U>5Dmp|rXe8FTNmRpa2nsFY68 zRU1g@EVkRxLuqp%LOY^ZaIPNg#XcD}1YuJhXuKLJ`jhYgt*0-`slHvsObtgJ{NXZn zcuSd5ok^u(lGvT`8p?PlWuz}=7GpunX~!UpjjKUwaYju)*0#G3_1TQ0xUF_&voa3a zbMhn%d)dY#uH%udlr{P#eMcFilZ;%CRCbF5{0GP zA!lsjB-HUwbYh`y6N|+NFVwBYr==WN$9Vw}^?0@b)g-)sg{KkEIV}$V1GO|syVFiP zvoztJ?ewaN#x?eE{@&TAG5NwG%dI$M=)D0h5AX%WkdVlEF|D_!Kgxc$T0Dq3$Zk0gT%v zk~#^#3glJkc?QQlyo2|b**nYpSQm=wf4d%f4fOPVowQhFCG{y~${K7P19}Dg+=%;A zmZ=M-qB$fa@fBUYwKq7g$`zA_SI)tCr}0#{v@Au;R&XXP{B+INqcl&S1oWS}8pNIcg;^ zUvY` zDgW{S>W0zgn3ud;6bU9$DYEi?m;(#X*fKHir`f|rSRbUZ$kGiR#%F5TN1}rJ6>#`3 zrl(@{V3(dP{2T|w(9)U*<5RrJb)o^i+r?P6$rqbtxi1lL|#A;zQ~r~KGnMKoMU23zIR zUb!aQ7VO7}5b8QmL$=XxE`LFfpb)vk9vMz4Sf=q}9}3PCpdCX+rcF+A#@m2pz2SBBk$wO%){2D z{j*Xe`&n{51qQHzR^Qs;aAmX&J}dc~p`$?zRIbwI9o*{64_7;s_Xh7kMbhJfqp4jU+$`gtaISHo=^}rCTLKeMAvA|lX!}wKJ%~?g z*g|$Q4WCe8mmtyQCUYl?^+fofoxdkS{*k@A_f~G$M3$WX#fRWD^+DPQ|4BLSg=DWv?v}x?CG&F#V<$NpM;w zbkP*Kf%KnE2~mY`9t%srq3=kD1A=YKwdhwTN;#Ma}xw56r~Hl(-x8sm~HE+GM-RY6RaOg?-3fE@A00 z%Kd{xRd9qcqH0-{dlL0JYK+s7p==am^jBFU=3`^FC^INVw-m7AD|K9jr&EQAp;U{F zCZToLfrOUOMl-FO)m?}&9$~P{EZ8X2g$cnDR_*1rt;5}#NWftuv!N!rSo$4S#_cS< z*u@K?Rs|X=0f(80_mc7~Q78G=u^~%+mfBH*KRHIso8YfX{H_ZT5*&VF@Wn2x-Z`i@ zx-Z+ew#YYGDukvX(JI4lDy$Gk4!8LO(75`AXm&!sj#_LmY6y2hM*aGIX2D4)xJ;XY zb(}Yh;!*1GvpxD9>{j^8?ud@f0gff7frIuKweik(usSDc9wavFYrzMSn0-iw8@Q*S z`rFFaSQ&X12g8)4w0Qku<*ciy8dI77#Bc$P zc|`=Lvw@-+PUfx54*5dA`F*nn^N?hu;^40Gg?>4Y4DN}HM{F6qW8wUyJc?6Z>!=N2 zx1^NOZD0))GA^Pdv@3Dlr_3{xC}hc&@Hp+^%MBz#_TX(XamEst)wa}y3>f~ro0#40 z_wSj+;XF9CE6IUR^}~i**-G$NTbKg9bCz276H0#8&m}u=Sk+V{EF{SB3_H^i z>b$8?HBb|rrzRUUje1UWEM!axQC}65RZwxDmdMsKu>P;I_{b47NDKQ!der!sgB$OX z!TrrYXh#2K1TuqnRR0uVn5M19rxbdhrJgkQN?JoE6UlQ(Fk4dpidr)GrV^kK5i$^nK_LBYGxwK!)P6n64WR(l1{N2ntk)UhiS+J!2k zw_OiPp>Y>(B}4KYbDI&aC$oAr5K7}ht3{FjP0anl!Qj(`M1L7wX&0*}vkoM6A)nP_ z%}mn7Sys8~9au-(MR9i|VI*7+-o4HosQy8UGwGjzqXsD$GqvU@W|U@7EzhdyXHD}D zU}E{E9mWlBBT<=`g^U0e)k&Ct_6EbCMHrR&BvVxP&QfP)U?|TL!=G7`7RwmRk!d8O zBrAAlCU%cNU{Y(X*MTERm^?9j1#?}(<08ZZrZk;JoPzcH(H2Jedq^#9pTO{>SB~=3l1@Jwv=W-wjpgN^=W$<*piz7 zh6!|E6GFjeL9CSga(?+hThpQVeoPh0+a0VZ(}>`P+>1;Il`TSOFvu5~%ljM?iyQM4 z5pDy4>F$D>)L=Qj<0|jO-}`FD!5W9}*Ju}UKn)g0_MdCxE<3?p4VphwT}v+U-M70ka2r5#S*(7!Y6p+Qf=MF z@+8EW<-qZ%C?a)-)pEzeGqmF_EG6$o%tO%w131J?`_Muid12w3)>1-OqSu&MK)s8Z z?;EZ`lD>LBm%^9Wh*Uk~bv9+@wZq=``RY`79Mab0#bYJ|gR*Bood-EvMl-gF^d)F6$9cwF?klioCBt&^Dn$8&O>E zX?r?OU|xALvRNLT1sdgz}h>*{@M`QU(4okT-X7_Rz$7+HULc}pu0_= z@#foSzTNZ|n-@LB-Ytuk(HsA~EsK`$FZ!&FeU{9lPp`J6#Ti{npi{2$Ew55loRu-7Y1C=`1cq3DF>^j!acT zSv(QFt05boWm+TE1)(;e!7=fvXr;(Q&>4J2udW-52t6Op&t?e?gx;;L9FKUMywERW zNfb#dk+kR;3Y%2<)L*!Q3H`K50QH0ptIO}kN6;bmo0x%K)<*bl|_XX}1a6F6g`HgLITX-w|*k?A-Qsg5wErQdc`TS*YrYKOXx zs;r;dMlmHc`cq$q!UTEz6BiQS1jCv~V^u{9k;Ktbn8s(c%4Ypts1GId7ILEX>+VG* zR2GU%#8EA*BT?qa@6Z8p%9*}{7t!FMty>0Fw1K7+`d==@6_yX;OAS4PNbzzE386pn zuOv{#d)c}bi1Dc}Qrk)N_Kq9pOuhN&6!c!E^6qOS^dx5H4O#=*W0(pjtNZ+%QQA;H+Hu@p283D0tAn(Pu@{i(@seIZ&+ zT~1)4G7zcF~U{*h7i%au}Lrl1X~xeMpm} zX~V!4TCF@{@(hcru<+&;qYpj}3sGBH1OT7*axPw8m2O)40w6iUtLrGH2foF?hy7Pr z=Whnzi_r2RjrNy7iE(O`CY7<6x-9r&GAVyzHan2;6;`WAds0OW=qTQ6*-CN(J7O@< zq)$@sa$z?B{v(k*=;26*kPfEJ>1U97%z`%n)T; z_Hqpt981V2R5{Am?8niXJ$77U6reqDnvs(*3M63U@h?!gs&LmOUQ*UT71T*jelm6P!lGl7=uBmgMVVI3AHo)nvR#@lN*Kr z-d24Z^hXTa@NR5FyRi|Vi7ktN61G(ORJ9BigZ{3>i`{ma-0(Q!ahT>-uoG3QM2Op9 zX3MQc=VnJFyW0fR{(-b79sa^(`>t6gcOb^KfmG{!0Hg~jqY>IH^{F*D-o&<-Ym&Tv zY_AQ+fq`{zp@RAfjB?bGa8DyH<>X1R=Ep|vx>kZZ0rQBUUZPnfJNJq%yOkL9FwS$l zzz}xlqJ=4m;SEkcPco2(3F)&8X>gdT5vF{N=$VtCu(zraNWMm;S0IkwOx&0txC>^w zDi^W-4}w&dsxGJeOe>CdMB)+OgD-sT-_(ZG!*Db_6ART!F}`A_PKLsk$3e`L$Q!U6 z&y_j49@LV#WPrsE5&WSW6z8ST2gkz=C>q2a_N))dzjD}wPzUSDIN&raUI=}H0G|b8 zA<@=3G6m))PU7}YCbI=2jw{lH_+(p=8KPqfsOl4>jlnvigjoYLyIv;PA@A9UvQ(1&r9&U)py)Fi@=%TBL+8{bvr zDwhd77AF8wP?{RR-7-8HZ)TKsW56a$CFMFNdW?0v;!?GNXm2F3{Qe0G3(J^P9D7n5 z9Du~d9NU6vbc|!KSv%cHgJ(hkI;gtTABklpi=VWsk|9mMXPXU4BW(MMTYc|IwlLF zx#@lzi=?wcI1mIPhOsgjC@l?;_YZFheLH5#G|A|E16~H$`AZH5##>15NRm$vf)!1J zs)S`1bxu}IAL04;ii9Vdjd=M8Iok!UUU)EiD~bDPmw|ETd}Yi)8Cd$G$!L$Izv*DC z6I$kXcrL<2o7sa=RRavWALh(*tV=wDd9MNUmCb9}uiK?4!OtxR3P=84?5>mdL_)Xs zL+l1-gEKHtk8MJ^QJD z1)R)}QrV9v<~2uWMPf7U@#9Q#GA-X*K1TUPgjO#3)4szLoO#!+pl87!i zGjtPnrKtL{T*^+#j)nU7Xs3T9fW&;9GpfLiWq8r)lk@!=hQ*0Y;=~WQlAOgQ2Isnx z3?)|*@{m#B2Q}V>H8i@nV!R7pGXrToO;Q3b{2@mDdq) zEHWm$6(~s@+TE-tHIM|pfmwtb8vlup5R$)34B!%m@A?I9!r$azKbCk_FGk~un&)fu zz1ay!5pZsk{w4tx78&82itFkbY^Q!9VBN|IM8A(1G9AgyGIpFJauVX&Lo{b7!7r>9 ziTfehd=%%%&XvuJxopl*CwwvE|011qlkD)ydgtMXSCAY)Jem=C`PQBn4I)%bCWB`H7Wt zB+FR^7Io?iF)Cp=cokZp=Uu4s0!)b#*&3p87;Y&x=C#owH(yG>6BDe5v>BzjWa0gYI@2 zVh>Xozfe$xhOt}+`{Rr}*Y`r5pBW(NRDAH;YBq>Fe+~vfw=&12R^%|c2BUh$Jmyz} zdy*L4c6D-6;PS>H7G*;jWkTpQ!&z0Y?2qJPZi;=6fIt_Hq&5x)Xe15&sqtF+>PKJK z;mg=$p+t+{KoQQy>+xbGe+&zdI`s2E%Q_lb{f{sSC~hg@(EBiLzzKe|c@mB{MBjv| z;ol;vLl?39^FVp@O@gM4`Ov=kha%*C**L~3pwcX0BuAFXWT79-Z!i;!b3yc^8LlcA zPFUB|#<}P``2rVydCcp_t)WL8dLt&t7_f!9fzbE_0ppxph+JwvekmOonFVQ$ll=Y2 z>)%JCXEdH%h)|VckQZq|PIX*{GGQ%tg;HY*^N!c3nwU1u^Fr595ifvf@?zo_LeSPV zoS3s`)MutcMLX8*ES1!Ih+D!cX z%37O8a36*15J+AHZRb`W#Ja(Eag`}V;ksd)#X;zl+pW6lJF9IsjROH6V34lT@B^JOLaB5hf* zRVG%@6j2+W>Ly|F zACc@<{g~o-EH`5;3i(t{X8NrCCUG^^03%QM0?=2$g_%aixanX zbm4s_H_Z2d4czlTzQm%!XhlYbAEI6Jz=zwtbCzRsbC#e?1yeeg0okkEI*_pzU#0-cEf0{2izYa{vc} zlC&~&)IjTq(NcmAO=d|)+~U5u%ih> zKXDVWBXTjIN$hbaTv1EOFb80aVNeG(*Rfc&x(NJnaP1YZ(*=RZO}F>*EN-QGn8Ai+ zTsK!#qGaKy)^}0XrD{Ba=erW6vIEPw-BNTIJ&|btGaEF6^>THVttJ6uR|@n#^)izO zMc9t+5gfsI7j5G_xfhwi6BgHuHj1ppG6^&;&56gs91mPe6XVdo5Q}?!iiEm+W{yq9 zEqxVyF>)ixOXMYJ66&G2@oOv=NMVkQ1+6rx)r-Jqton_OkYfWow_4sk2+TFGb04K5vv!md$E8~IKbnG*!2o~}g%H+%y#i0Wv58h!*Wbl_mbmdX1PUjTJZvyUU?t+HB7{tz zW74vWmEpj-K^)v=#Z1fzOod+nm9<@Xax=<0WWTBw1=Q^dB!et+8HG6BguS>}U??kS zj#>Ed9)%a0h11GS<5*ycOu|=h{6L-9coR}lm!Wtubk~^ZjzLACE|DwIEi85Xnu+!u zq?v9Qhb@89{cDH`qS8Dc<7h|ZWrEQrCUh&tKnLg2Z;=wqb)Si{8j+3p77>5l!9njw ztf`YvM0P?yHQr`{)R-V1j*atopouMqu#Ey}WGcR381oAP<`hOTzY&%?AcBR_MEYC- zv12R9!qN%s6MuxIdF&JUg{5iulyP0^(vt|vUAGEL$!iPJAuRnX`w)bswEGlorK=1V zzX@5Dv`Zf#A@@6E$-Xz*Zl2LuLrFC5m;!jyY7#(uV;ORT!}|Cyd8I1=2ZI2=HLYw$ z;fz(ip;^$>ksMPK*g3k%~yXedQpO;KZ5 z6s|A1oT9FwsNwXLO&k1!gFTA zlSqhF#BWkog~-OyMA^&uS~dlo_$k)P79#L0CExehmo`n*DUF`qp4@2xX4zX!f2cZg8*B&v~@sX3*SGO<_oS-8Pzx=mt|lx zpp-NoF^xcRd!qKNS#b$>CnYhV7DDq;1#HO!0+Z=%Rih5nrwNy84Z(Wp*v_V$0FL)# zEgt`jzWqXDIbaUrW)XI8%i>yk;~ykp9)B-h#v+)|1Xz^1X$jtC+T3~6c&U16C(BBa z^pA>S$9T+YDIw~&{PY#hiA+^ONyG$&`53l@=x7OLYhm8h^aVzcrxMz>3u*chEbY)X zkr0}VWe(g`k2F=wBAlBS9&(1!Ry*V)>3!Z)w#$dov2hW&5b}p)QMsd1T~6+yqVjYt z5X%j;Np7o2mKy@}Av{65PVA78wvPOtP~_cs={cLIh&}iWZS(opQLgIY^{qew*O*gs z!*E2<)c`nvh07L%)jJ-12fxwDT&O@iwJ|(o{_Axnf=h2j8Mr}RsH4%?%p16!2Ex>D zP`bh|it3ib0~l_Ag%ljjIy(Dw;%g`vPDWY$YmE8IYt$^%a2RrIk$Ei7vy=xH&WnTh z)0OQPh*}AL)~ic@3HeFTlhMFdD;ZDXyknUkXMyljmDn3Np+63&;%3KCc)!0uP&ju$ z75CYXczJ2mr~r?SodpjRq~HjTvZdw%I?40+m&kzrRd*EcGL_S)zCbj3lutc_zY!OH zN3C4r!;N=KUP^oh-%>Ozv9UFHOpLzm!F`HPP_(GIvoOu;@C^Q1T)34oVF$jyXUX3L zN~PmFXWx==`FzB9*sCsnhANJ#UA&2WGxg11F^-zCLfwCZOt+HFHvGNnQi^vgLl$-y z{TVO1`f@S)7D|NU36a0uY zJF7HDEmkyDbthxD3%62ba+GQpz|1{(yInxY|6$5euLcJ zIno&yeEfA-6j7rOJMo1J$M$tA?0{3R0Dh`Cc^zP+O}AltQLe!v11Zp<=*YM|91%mz z2$BQiYD&Tft|p0%1=SavgEj+bO&zZ9t)ejxc~U43b{J{s@7|t?T`6Opvo}owHEr~C zx->qj?7(duWlF1_+dz6I(67fiYE193){h|@-J7oNG;hg@EXCxAj3kZ{%6k@eMkKX> z55hGaMBMAF?<38rKf)t;Z=#4PJc8yDJd2M-EGXik5j>gQJi-vrax{&$?0S#L+BXpD zzUjjvA_#|9cKrv@f^!m+(JbAWK7(elHmUGaH@FD_g<~}}Fr%fId|ct|w1^i-7jH6u zdSwS)_>a>SjLdKlx3}S*h8=H5L%s_JU^&ya)!2%M;>u_AfPM|rHawAD(heM&FBQlDajiX_}7UaCPY;vMUSIUZEJ zJP?F3?|1Ee&SVlmectEy$1k7HWcHl1FKe&8_TFo+wf0(6q)LzUARJhF}WjFSS@DWootf;!dw}Kg|tunMqNG?r_wcQQ;Bm5WP}Msj8+c^ zw0Y@u5Hmz@B3?}7=iR^+NeN>rG^Qz_i~kSb2MV{rds4OMCB_{H^W3HlSBdLPDU*F}Sj!?yZU;KX8x zk4A$uTs7exo(k{=hrWRqMV>bo~&8Nwr zi?gXu+5L34x!h0TxU%jIzTPZoHjRnfd{#d@cjY2|aL3#Ne8>;f*ckPSUk@E80Lc~! zKJw|@_XUMV(~(R5!)WE*eoSS*@f5Lumt33|--D{FzX+fPMv_wkZb@={hU>v*G7^Xv zp*j34u=suP^uE<6fi6xKyipR8Mz!gd|ot2_5<^#?Rj> zJt9LNBDx^m{mMd|>K%pfSM&@uwS<crlHa))yN6L^{i=MWg)rY6Fc%p+%SwIXl)TGj3-Borj z=?pw*wyQAogcm3CWEd{hRUB&6CKqSBn$2*gmIFV%aD8G?Tb}Y#ck;$Jgcg(MRbPWS zvFuYiH<&2vzPA_;=Y^U!g_djr7oVLHwWpWPzb2FtH-Rvg;}u3=hFG#&$|IcPa7bDd zT9G&Q3eOqgOx#(t)MCW^k$ze*wmuFwGQM0|<$H)!6iJOACJ<>qPER+rE@{1Y$$?Ym z4?B88yS#>eBURSNf8pLe_KkP}x8bf_FE}Fx3tn{&EG%~~Hj{Hp&8qRmakpDdsIl;Z zTGb=|+7U0t<5yyQv2zhMp~xM}S56jz8fc5_^>?X!OK&`M4DsF%yF$MoDc`)W_TJZc z?@h1#RPX&P@BMeZ_t$yl=SV)~=F5?w1G0oQ^X)}HF@yW-`w)ajvz(prchF@sA~+K~ zE}(+ToU++~H#yI;M9!kF zq!OMdu2NPV;gn-lVyt$4BzYx)gI=ybOJ4)3cs&x>muNYR`@l$WTf~^O&D_5e%_8Q! z=bC|!a9SiB{0BHJJlej|VcK6Y9O_C<--UnluPAUz?g%zAGH-Ai>Khg|W(i1oU7EBmNvILh8YsOfwT5aLOp z;td5UOMW!i5ide;T(J{xS~42lz|+;1?%yU5!6l?sz0{9((fY(}6&JtL(@o&yn*qrr zS6%QUla7_pEUraLoBD{AwDr-xt+?P-Z{Ujnh^N&}qXj`?Q87Iosn|h0v`ndjX>YtY zn*>iQ+B?DOG%Lel)Z%&gv@Dt5*J@wCx>UBi`&#FgsogkP$c;ydJwB&tyBB&Km|6Gn z*9MvB7$_boettbwU$&myHJ9GO8?%Q!8@9HH3&#?=(MrIOF>-50B9UEL&Ql}U z8c(}Lk>G1{ce^j~%HL48asgdVfQ@f2{?}2rjjjy_!5rfqhl9g_kE`+SS0waKcLpI9 z3BEdaPw24{hO*Xrr#5*lk-rWd;#aH^l1|RdNB6w3rZ6uYOvPW1*wI2b3{eQT!@Q^a zvl_4qaP#G~I&$LY;nQDD|Z`-{harVrSLZqeT{B!SwA;pD*=To1%e#v9E;^+l)vZ zN11oiudSDxES`(GZu^yvjn$Z0P{hKG-^RS9nIAEA7MCr}oP3A{t?_K0fzt0IigM(N z?$S&-cv?JYX^JrG#Er@~miN(FCNag4|! z=>uSh=l_)S`#Sxyq~FwOIe|I<)ag$p{e(^*lJo|hF5=|p{8gv>OZxXZJw(#K)ajt4 z<%%wCO_lUgo&J%e<2r3i`ujS4zocjC^n;SVOs6+WI;_(#OFF32Z%O(ro&G@5gLV4f zk{0b2?Ur)>c5oIc>7kPTw~%|X@Jvbbk@Q89en+RTmh?+H{Ub^LL#KZx=~kWoo21w2 zbep6_xIsP7OZpz2eoNB-q0_~PPE=qI^7JR|E+jET67?j;Na6=1E|$c%Nn9$486>Wi z#1s-gmBd66DzAxr8 zn$J)^r}8oQcb;ty0|Q>*`G{Cv9HNU1Y%`xn_{ja^ z)5v$P_but=q;KMr3*XUT`x|-w%tzog`E*@?btLOri>R=T0s$78UQAMUjfR%kIYxyF z>1k9D3zv>o+%;8w-7`yl{eF)6x_*gK5npLk;4ChwBCB#-Xfu;xi3@>_z5ngIj`FS_@KwiR8q zB0tnbC`x#hM5>4TAMj2ngLH+$Q8cv4R1*Id>*OK3xLo^3J%q~VHbI{R2To4wLu(jT zB9*LOQ6(`VC2T3oA&o@>NC%#G#*kOajNluMemFT>ZpTEd*TTlb;k;4%Mz)yAT0&Jl ztL(e58@`am1W$GfJr7JpCZk?IlNJ>vZ0PA$i;hcdCZ|8A+PzS<3%{Ff7f;y{0%PA3 z4ZNjp6~XF0j*gB2QUPl-m(O6=pD#~)b$|M8VohR}Hxk$5ajM_%Lv=q(ar$?!DyU8d zDjBpBfrt)E?=A&LK43`tj{%n>Q%(?HBzVuHR2Ve|;~cI(V}Y}DOB!&xpCPldt)+X) zAO&lk%q=eSw(|vzp9hVXf?H@@_G4&#r24u?Q~d9zs$UOiieEQJ{aUny;MBz=nKyZS zp#haaX6~q2WEb8O0`E5CkBA`IxJ$hYukq%@YAxbUE>U}WM{z2Ax1J)aN&(+kz5s$> zuXa4;DoyMc?C>gV!_S$Ixhoc5fmVVx<2+JyiM33+5d39$wP|C%LMpjan#0E=R=hoM zCq4(v>AQLv2L9C;`^IEER^?gkD_4{^DD=u`{~`6U)- z$%TC%;toLAN{3q0Wtd*-*$By{;K@d|q&MS{DU_U4AnaChVc|nHR=PD^3PH4p^_o9> z$^Sc@|7SYCitgg&Hy+;7E$=+?a?_jYzbn}hPPpU5EE3oT7|9h~VWUNA$OUagw)h#k zI7VA31s(HeYqz#~Yq$=wow|K$>voTCsyX8!Bp7;fD}>2egitgJGs$wntF>Fq(3jm0 zI!T=JO5&}6dlpVTBZu~3uz=LqMHkToqC ze@JfR)=~51WWhz;8|1vV%`Mqh-Q(=psl2n#u0>at*xEzlB-7H`(6*iss+tR-io@$ zNN42$*$JQ6gMz;BI1eP5i`Mkj5h2b2OpH;)%U%@;Y!e5r`nrqz4KBPeNmq;X)q0tf zxKx!e&6Uu-dKX{C>coq`WM2fg#;;U4leK?wjTOgLmc}QF@(!)5QW-AZ!$QJ6W%AiJM4bP;heqxqR@NS0xsK1w(GHg_f zwaK_|yIgpyHXhy=*qcEnTpr(}Gpsil?@!F%>tCKMLup|82|=*sYPHREUi&!`kAotp zpDm`QH&<{o29a#prS{mp+>Iq1EaoTwP^)()eHKNTJvCMJr3+t9+*Fcx^GTepZ9Gz> z3R;ES7|W^&B@6eUkddFM3F@*f{>G^wlggL>3JUGmTlgylC)cb0(?;`_0mpBY&Xlst>ILTP}`rbJhsFtKNbeXr<=K_FDrB-EsR z98YiNY`zMo!0quuxw|vk%%8auGb^OvlT5-w1!9A-r&}p@ulgB{DA^5@EE0TuZd$mq zRCu+Z(YacVr{s&;%1nT{*cMX0yJ{=;^Gq~+JZpiWi{@kEYsc5t2KUz*lMdr)$*i%z zH_JVn>hb3SAv0dJNV8d-YMaw*{o6`+Dh{+UT^nr zXJ4hVwPvzE_Y|<>4Sq~Wksa`SrdG>i>J;niNe{OnJ#@dj9yH|4$MbNbpaMi5C3@Y9x*oq{_oNrde zo9814xpu9KrQ@~D(c#y&sj*3HTqTg>I=|w8T(4lUaGvHt=TG-?dVxAB65MYz6q9+y z#7t!%_MTvxEvuxT)WgpH7u6{lSbh_L+XUqqqUg3sKdqOd6(2=|&Z5F-@U6M8A=Il4 zzH1~(WMtrDB1x$x-s0Yu)0VIvM{CQp|1K~`>qgx6KWptbg4^8Ieyfo<-*iv&#%9T5 zsuy`gTJ;D2-TMeBvtXXMxt8PzNlSK8BqwLXQ~RX zocjY?n=5pbt2mcN<7v9gDx={9RVKb#JIj|_NHam*O$fX`PX8U_J60dih|N{JIdfT= zTSiOGMgt5z{SfmObsr-$RoS|WP*|h>8hN8GzC{C{Fm+bTV|&sZF@_~>lDM{m^SWQ! z_PsJ`L})V|f9^>WCg-=Ptt@P61G{DZv2(4B1XEFC5;~y0(TZJUX>miL6$L{o^W$eW zQ)`~vw|d2x6U^lJKy~FP;?!H47~uZV;74#3H$HB9aV{vT|N2cdgmt<10a(^D|XP7__$V zXq9P%_iD^6HeFcWkIjlrQcc7<&a9fga$dxLDdic0GRQUk+M6(ODpNrAk10Ge6Tv)o zbYZm7wMt%YQD(~$m1LlTDt0>kI$GQ5x2coj)X%QZkSHUZNX0htvlER}xMR7Wk+bv9 zUMaU(uEL^4M2GKSXL=Q~g6`{drLHO(XpsSnSZ$Gt7FO#utlGlq@RV)dI*46?b2U@0 z#(IXR$|Z*NoJ+;f z$RUn_TA=OwWC`N17Oi-f*hDA}_RTAVF?0=X6fiK0+LcD$Lcj2CE$k)kzl?^O_Rm0g$b8wfr5&n!8hxRR`jYY>5238;I{aq=q(-9uAVdQ zSAp`}@k<^Xy$WD3P8Q)GTRdacp8no0p}9?rcw7BWN8G#uy9QczmHYHQ^KO*2Q^Oyn zQZ9zfGL}nix(i>wPTh{APA)&=|DMrou4Nk7wJqs67_}pDz6uSBa$o%mny?cMloey| zhBYdI)54X~bk(A@M#C+nWV!<%Y}#k(EpKRE+n(Uf?G`<^8$?K_A_jY%k@evhIy2PY zW+Z;doK^u_&BUWJMD$%bLr5%I^IhXsJwmwyr47(R|Db&{2uKToZYHb!CtMAn4#E zc2+caVD7tYs4?VOa%ZnSeckJw!@ogkO)7JynVra8ZDJ$Q;7jB%=A~&B+X-QU=&D*b z;$;!*B)|XZrLW15X{Dz7CmkfzfuKgn7K!eS%LRJA(C zq^d>fl9#G3RbL`U$fT+@cUi5t%TA@Lu3|Y=kV9ve|5R1%eXC0Rsx`ly<%aERO7Q66 zdoWmd4XS(cJJ)s)8G9N$k;kJ~SRQ(hE!@8+k^;vpdp$k#%Q^tve}!Iu^dOkR>O#OZ;3M984)=d5>CSI08*7%~hCqR$iUPC*BEWnAK*5 zG1(u;`qc(I0;f40+LFVI^A{T67SixA0b(bi9v{el@duvi`_T8u+kCZv#f}@7w+y#S zKMmPM!3o9jxo#WRytv$XXwc%>vg_E@!|=kstNt5lby<*}v6djuxHemVn2V*HY(Gdp z#u&2kj5iaThtVW@I3+YutS0M5xGf!IxX4i+u?PClg^MLS`pgz%*>$}3m-b;fH0Lkk z{$VElGE@SRC5Z7pcPjHqJ65xHzzqWVUigGs9V_HSL!9!C^q*)+ zMhROw%viRi2}^*4FjZ4^6DOJ@O_W4=tE`V;$&H3bKwn6F#hP{X1@R%6^N)`o9BdLyPye27{!>a@~c$;D&-fMASt53y-cTx^XVU63b=RSA6}S#>PXWo{degi zLD{;f<}qZl<`*Om_kI)~dwE9f>k=1$BUAjsXx+gG@H4dO8U@;xT5EQ({5;Qt6!*%p zLK%gLimGJ1lrlcJbD6)9(7!?L8R)Qt+B>{)S4ls)_|s?_%ZQytuCu*V;5eEA` zMNr6#CHjT*t*07|+?m?U5aGwtpRgK@OZUi5Y1)O44i|X{8!1wyx=CE~RSJ}7-Pg-P z$%661-O{(HJ+rjd<_7sa<y)s-+EB@_SQR>iL<>@xU3*RIP1(XMrLQrqr%f&+r~=`Y zfZ7D-0_PpUuC2u4)8=BJ)|7V&jNlV~xG)p`rs7E&s+MxeTTA7&8308uP=l@o_pGYY z+9lL4B5z^28wD1-dW_X5N~fDg@XKx%RJuD%^4LlyuZ`Q_DSB25(x*3>)+NPsr3sjakyX}OHVt~Gx_wEqKi>QA5~;hF z6v=HQdAXo(BzYrAqW9@c0z)LQ2_Pw=)Hi^k5iYX2q@cN?&1#hWfItxZm$-Q4R&uSE z9BC#0LNc)npSAKj)hGt>^5+~LA)HiviLAlH8wJRyvGJxrw5|@KpNvr*dKdstbPQWG z8oBUF#Bxhe%1Ac^z3eij=?gq*#>t~~UC=wdSCx@Xcf8FU&bSOtEp3KU0N1N)(imC3Pv*#ZW`vyq-})h0(7mhkp)CismKNqm~T`oQofM6#J~(8@L{R0Y6xZm z!6#c$| zme-4Y_|8qn!_Nh_yFHL6B@`Nw({;&jpG;P$CiWWNkXL*w{t}+|GKGSZ%Ho7q>JTE2 zZ1k7;$o>z-9JlpDwPQsCpUF94Iy3M8eQ3K4>v%iL6@7*qrKcL-xy1Sm$hcm z60_pj@l|6u2hR1;Y}_h)pP9&f4u-$mp)tJsY?%bLO{qXGf@PpOC(f53nG?P0R#BZ4 z&LJ5nQ_syyKW~aS))#{OS1x4;QH<#Vva=i36`VBY57SM5sVOa9>7=f3C%n1+*97+0 zq5r=muxIHoI9?JRu9m~kUrHA$$$-(A(c8dLmeN9vHuzh$W;)ZpqI#|8(mEkJ0urVs z?#zRsg|6j6*Y!A(ym}|AjTGQZ-eV8HbM_xIrSa6bJgSfH=vF>rUtNk5s#UcFk@PqW zXY$t+9Dc8&bvFfw@rj6Euk4?@U;F|^p^WDIV|9|XBhR@(SO|OO5_7nQRaT&5Zb3C( zl_|AJ%w)UMg>3ajDA=Ad!(=JH;|!_Re+-iR1;%@5=POjaI!=nj|3y*qI9I7ss&A;v z?F};od$wYzM8b0UGlEPuf4bE$U5To5vmlyCA1_%Fo57G;=t0yh>TvR@SdeE=#vNL2 z8L9Rl3MXNadq_66b{mcg_U&``h#}mT7nB$1O|&T`_x$rz zwVFGaL9b@AAquB30}(0vh29XO;%Hqk$F9u#?jTkPh+bbV5coPN-K?9yQNY_pHy3_B z;U_q$3V=P;E+Mhvy7Lf_yISYi(iA+5mn>BNrkX#Zx7#1wF+RA{J<1eazt!3_o~PT9;w z;lhy!WMGSR)WFR1>c+Vc6OOZI&=sKx$%2VRHnQN0LGB2@@>RJvDNHi5Y>|BHAA$G} z6;hHDnbYB>(2|>X<{6FR>Vo}XZD{Gu!}8dBVkg7u?-aHwwB#agIM3S|d)s+VGSyu= z(#%gP{?@*-8j7wKlv@3t@!kyMCueU{9=VSkrKww~#V!V$(o8Ae%w0l>98f})v!Zo# zilh1Kq<-bJ-&O~NORSQQy*E-nZ_3r9+i92a_#GN~a_cl~<3R0M>*r zoM3PVOt5=|8Zswv{Qyz%DsQ#eV6OT2##B0y;%y zRU34tjz1CoSdq80R|euSHP3U_4SFc-D>g3lnq?&^%fP1G9=_!{H<``4FQrp5;3~y> zA;SXbFgR9-wL{h<#Y_|ORIeSnYmKUFT(RIlUAu~-j8MCA>qOPH4inQg58zualCJe- z<7Bf6_#Iv@Q5rl1A#tA}qANYAGFRkI7g>Y1tE`NxsE)jLmG(%c$tq`Uxh#G;RsZ(O zRvr7J6DM!9O0E6zV3%6NiPV<>&=Ieg)KDrN*8`4Vs~lHvGmOUVoL;6*3Smy(N-&*As*ocu5F&UdlQ5a)l-A-662}8F z=*g0vU{q~kcEK}R=rg{I4M?_`OY8zp;35Ya&s1B)w>lnvo(zOd?~+sjEIFM`q=vDk zHaU|q&NGdTur~RsQTiYaisHf<&O1Q-e?`IK_cRK63_cbLmVGe_3P6Dt5i)(Q80ZqKKhlS7bUohWOy#KIcU>^*oYGYRnlHNiQ%;wKT@NZ!PPnWQ9yL6M-Mma>GHceS(juq0RubH z`qJm46~h2cT@`yH&7HD`bXO6x#;hhP(6>NvK!N>fxli5tfhVH)7{==*=XG>{YCee> zs-G=l#n|pc0WGiOa{IiYM;nbtYl0MB z=Z(gbY5?tf#6QRE#KA!xTW(JovA7rdvjaK)_ku|9B9C_>=7X+1rVmm{mTgov)nMxr z_q6V>vvP9)9M@d3m$B>+2fE-E={}!h#R?FU6;YY?fR~Z0@$hsW&Q5e> zk@j`vvv8B|M^Ib{Vt)E-$PU`N>gCcdc}I%R!ESjG)Z5H!JK9!iwZX-rSPkqos~V?5 z9LDm$an`DMDS{^4J$1zi)hp)cvug(X)6JNnRens|b~%ncvG~ny`v9tsfmkZ7G7>j{ z5tLg~k|h^ql@8B(EQm5FiUi&eJG`nzWFB~uAatFud+w8J?bMexu-3VKC@qQUmwlI} z=l*yWQA>E#F4z&l)eH`XB#SMpfwT1rC|?HK;%V(zEXqCNxL>qPfrCTmxvAAMdCRKr!gRS4^3 zIMtR^RSOPo<3Pw|lkN!1$r?yy5%zBX9E92G7_HXVP7MH49*0vP6crTK!9){wM~7Dw zoRoPcn!F@XQ(16w)OylrklO;#w_u(Ldf1=f>P*r@Zm8IINyVYyi$?MkHrPvyjni&I z5}|fXv~1_nTiM=Bd(3_=%VuKhc_1qyD!dB`!z%9xq0oW!G84OJHjycKSjoe%T|HuP z?~rj{d&sz>#VrWoFFVZ5iCz@kXxa-8FcP_$M;;^dn1@X}_E9OG=07v*o{I)PHmme~ zqU9g#g^IZugbS+Mx#So|NttrV7UsEyXI@y~@;MLl|r_riw zSIvEeOgL6kTawmNF!N@({mhEZkXoTf#om4=SB)CiA$@kf4KR3tM%AhoU_@cQ0wJ87 zM{IYld>_)60quL{2>RsA=^a7kzRw0>T5%czg)m%)>I|R z#LGFQ$5$JTL#Qzt+%)%H_s_mC5|Lmp<~>ruQO^;$fc93py>Tz#DMQSlBD4B2PWpX; zW`p#D_^e@cDEX00YdCmd(eo3T%ai+tf}h3T_i{urv~eHxvtNw=1Qw;(8oosqR*-qp z{Y~)6_^(kbxM=n2(i`{YQAIo* z40Xic((FQ8G&s^|?91f@?z$z-O^E{q#ZEv*UOSnMhL+O=@Db*FtC z8ojB|-@o`4EWRhX;%_6VCHlnX{Alnez>#1*(xy@{Mefy0gQ}mGoAyuWC;QZF`^Mr# zCTBO&8%)O$yOG*pKBk*D(oMFeVC=KfIHn}~Vuj7RikDR}4pQn4d(@0d15QQ?*5McTlS0FH{>l5x_}o5c35j(qpODm(wNA;YW?NPHY++le1T7MNh)~a!9;O2$_}7 zVu@@#n>QeKDvyligXITeO!o)EmSz|K-aNK9XhsVOqbNMIEsMTo<*yG@E1@W<$P7~R z@)y#ixD%VKecU~1#c|k($qn61TjdEDv9V$EnyX6hdPh{}J~~3H`Po+QBtvKg*9>*lZgs(8Sj)rD6zS~DeI#eD9AQ2`iKSw zAFY9sYy&wp?`H`D6b{(At>#xw#!34tvOI}=^KZz_=u%;}#a7;Q?b3s~9=4#IF8xYB zR3k(`bzd6wLt0chbyIWnL&9z3f>BU8nNaQ1c;|J#r*o>P*gQ_E4m`^a=?(e_$;XN( z7ZJa*qEBeWm9j0Y;-?%$+A6mjjlIaiSp5ra#$iY9s*6%7np{{`Ci0=@`x`9l=YbQMj?F3ve$(G|b`!o42$7R`@c zS;>@Kl`VFYv?Evceg$%SWRd$_9(P6V21 zRZC&z?nCm^>6CO=gQ*@I=*c^paawySB>@+uIM_?Kg^UD!f=xC>^T5b zcLU&O)F#6x07R1W@-e5atyxiX;o+Lfnks;(=Y2F;5XA6!l|0YLbD;Q^etw~TUT~p2 zE;1Tx^kWXnVFg?&AK)GYxT+lBF8a3*++GyVHmdZx$pMaV4`M3V<=nH6+djsF=zBN! za!-^wBQxMl9xC$pCJ+t0Ep}U(XPguDTF|+ut|Kqkv3fSOwm608MZI;-E?J?jj{lt3 z-A=J`1lEK**x4q+X%QcL$0y~t;5*X1sIQXObgFA=)kCeMtvl6Ut1%_qtFi_To1Xe& z`ROXBVyB|X1rU{Jnl)QJwOsBLSliNluTvXn!+vaBy`eLcHTh&#<(${R8Z_V8&1cA% z+YbPZm4daw{<=R|HVhP3#>2%;Pqw@VDxQN~HF;|H|G9*5NZ8U=-Q>Y?-9`GJyy}!Q zoUO>YyEJqyxjqMOovo28mnNLMDBT6t2D#uQL++h) zj=+vrQ)&OD;}=l6iA|WWo{E31%ya0Nsbw+0QV{7z%CgxpEPR3t`|G6&(dSP z4!k7qnHkQY4(UXWhHoQpa_Lsd>4ahn24$DYU#r?Zy`0yGy2!FjUIb>Ya^@EZmE}}> z-BGH|pPAJsFE^zmhka)pCB=H&+AMH%q~N!h=1H*;wafxh_1cYPAfg8UUM2@`(Z_mr zgc5uNp?y+G!%;wUl=7r3=`>a)9HXp%VYlOKQYI4W?8Sb$lck`^xvvMd`YU=?PAC+9 zG5#ZOFRQQ1IW{4!=;=+P&zGFOzFoD}__%85D3Vj3i|px$<5nU*p`39pAeqyIhK8*j z$b`qGtBCQ{8A55>k9lmH<+c8nTD(O=tqbYHy;evI!`#!Uq(#-g|Ai6l$DTytIa-st z0JF12bsP|>#OG^Ipww!H6ybHp7aGwn^V<84Zto~kY3~IGgfakXqH>uy|1%@nJ0Utj z_!k<{`XO;n^jh^S1i|lsB4;N8SyqTn4(L0tb>}ap@@3nRPRWqNRAc#9fdJEII2E;I(RC(m-*$QG-$|X#NznO8S|-*fPD*u=>i$O- z9Qj(h(|8LLNr3rM790%0EP+@;go}xk+SmMz@n{Rog&e~?kw|tGQwz*s^+Jv~y2b#S zu+CLv*$7(k#7WL}S^XZ6_RsmvREa zqt>tc|GH(lOhB}QnksdOUL2~iRU)xLt_^V9{s&f8i4DS82(e-pQNI`TR^21zjKBC>=zI~>Avc|#YRIf zmULU)WU%s;k&l17fxB1!H4fvpIPYU6Ut01 z+(ayarxP86cv8tr`|=}HUvQ3h?GzyGX`4Eh9(TEp|ifo`46#tUnJ|Gc7D#%SFx1>YDfu|z(#Xr&$7U&tMfB!+ARg*j`a#AS$%1$ z<`zAmHOtg@G9;Z+Do+fP+Kk&yRG3j(pTvS;Q0H{cwpjL*$=&A0VobNwXKn=rvPz1` zH^37eK+v=c*X-*7H6S~}_s@*rNs`pehBJJ@t;zlTW?arJVm0c@08s^djVF63Ut?m~! zK>U?r_wMdBj8rw?3Dp`fSM z-j0Ba^3AFy@xsup1$3Pmr|N&+!rwp5X`zp_plZ5`)TexkIIZqPhWr3Ta?_qn=2bqI zqAz%f&!5qg?B!F7O6Yw)H?Yq2;lf=Zc|?cuP11kl6QagH@p*%f4g7EOnTm@24}8XR zF8JP#Oy*1uSCubfXt|Sm`23mAFc!+!`CPzq{wF?<@p*>NSJ|Sz&F4WrLCXJTS0-~m zpLaRFocvZMvyt3qaceFmRb_|#%q zRQwe6J)Ozi$oBiMe`GQf+B2E+;bi`kPamY8ukv}BXF-_XwR}$aER#9@xlCprpL_Xq z@JaG)%k$LzLU(@;OZSLF0htv`UNM8};#%t_!S@X9P$4?E}^ZI8v zRXv;jG1Hc7n7ypc1hHxtp-oW9Pv)~zXbY2|QZ3gPJxcu<_a$x;EMST^41>2PIDwHE zL}E=rY$$8vECC^?ATgG|AsKw`Nonz%Q`u<<_I#zM>5K-I(g{l--4sq`;=hb0Z$`zs zVGdP!+0+526B_BKvHS*U%2Iy!#P7or0fN0uIZ?H^Ec^zp{k<|3dkL+*5JQAzK`GP~ z%v){;d)#r=)~ppo;l6DNPl9dpdwDr=MasR$;LBXEMm zjtltP2~|8Rt%ZWm;^f`GiIH;~ewUQ?01Z{7q}eRoCyF6+#WS_Q&APvUj1tL$@lh= ztKz?`kPGb-r>-eC8jhFd6UuO!t*n4wdR`!UJj5GYy-7#@Mu&Fu0K?9yrSV@!ljF8? zwqoFKJ z!HWA885EDoMEddYuLV2mJxH7b+_RvRkbR4|s*npLLTyqtOTY}i+|$7fmjb+p+)wjf zn8BCkVYr|~d&(2jfk@qzF*CT`xb<$%1xo$36$qlqYuC85qt=iiN~GcwhDX!2R!91? zO$z<76Ic$KRx;uWQAUHr_44ROyJ!z|)LI9?Rc-LYdH;vr3YeY-*hmbO!$?w`-$e=J zjjfGom2_(aG>e@CkxknS6aKLHJBskJ_I@6Tz*9gjEoh<&Ndy3BE0hxgLVWt=`m>i!W89ALC@ zxTi*Y?sn?%(iAijJB6S=2h?ybsIU0cZ8SVexh$xv*_?^*F89H16epy|u0IVl>3_8- zY#0qu@(OLlvduI~WMR7O$SZHBsXtA%YyVzopKJV{Yq%|*hR36J38G2?!5u4{79+R= zq@=gDF<0beX6kjG(1@i|=0>wTH1Q8KK@3latHqBMI)*;LWKX#D59DdYJ=#kVqvlzJ z%OdQ)McKt8y=H&AWj6!GYiE!8_N(CX43nm9VY3_SGE?76m#k7NC#1}x)s2*yJ<`is zOCf6g#vHPlaxhCauP~Qtt$)`B->JXPNBlBb7Q8NjKx$v&&lsdCB}33?1r9K`aZQJH z5Q1EP!ZLN#eA9bT`q_2*__9`d1IOrl@3OCLa&4ag1cxY8<)R4lh6GI%beoi2t6iX~ zy?LfkauV+;v7ui7>2m!a)FWbE%7{9H z$s@627GM=BF6R7&KGqCU|$=c2+O-7Y;l>;gS89%+&`fr>h>Cjx)Q*%VtKOnqbg^P3kECXNF_h7n5o~$B;?~x!*?hVkK z^BdLsy)_jbffkl4tkBZKsXx>T%@oCHsyJU`hot{@2RKa?3=xdGr(j?RePKZ) zo&?*|zh&{G(HATtOdXCDL(u8Fmw8CSS5P({nDP^=9i^DoxUcW;;dz1O$K}}{!5xdw zS$bIJ&*GtG-7`vv@%%26uxg2ScbTmpud)n%Ip&h~qNE(ty_9B+l zBH|o=c^t`DVq?HSW-&xO3AymcZx)KoW!{jgAHpvAqpIHuCPqgRhc1|ZR+r&zO*5h& z$$T5EM|4th%%_ZHTYVug$M4awe*S>!NmoQj`Phg=M{(@zL`SdqDdN+K0P^XV=`}0Z z@t(Xj&RqAVm!58%VRXj7s*JH+*^KT#gdOI4=m7CZ1=p(#8-AqFxgg%0ao= z=AI+BPsJNJr#eg(lO|iAagR8+ zck>03N!->Ws)C|w*F>vE#dH`WU91|Rc5$iEFn~Pzyp1dA@MGfCEFu1Cg*QUIYG2FT znl?mFEAA&ksj8Cm=+arm8kBEZ+x?v+|^q{x{{%qW8pfHxt0|;p!ueGsWM6dvn zdG6W7V>B9nPttp$FzcSI9^b}ebhYigk}>34|7qjy-KC4naWMvW1#+Q-V8b5$puqJAqV{?K{bn!sm zeLWjy+TSepC`Blvck?Q#`AT8(wZll%gc)Fj@UC4K3U=xS0H*Q}cspQ0a6CH)d@@FMuvTvC*>FW&Xl~=H^ zlnaqn*S7)LF9fp3$SoLT8Sx;pKp%H#FhR}%=qwncJ0<_ElArSREypS)4sr2-?Kc^% zno~-sQ=uK&NIwORg|V%XdI(XKcz1DR>9!?w);V1O?*tSXR)1RbfQ66DD6{@AXclCh z6&uw2Gs(V-T01Mur^3y&4g<|aowj;x-x%%AZZin#>QIO5MpSdLh?W-%UBHaw4(d_4UUi#PGH&V{bt$YMSYrW5}_?8(U)C|89oKzA&Nj%^Mi{kxY>4KAr zb)>zSI%1z*Bu70ls>OJ?f6@1!5SA>kUHCCp|F|oUrxlfSeO?fMFMmpL7hcV@zFuis zQ>u@;<_@gIZaakMAO5&+GgjR7i%A)4>S|^Zvnbvyo*ptoVaSIH(hN>5Et1{s)qD|O z3?nozGABv056={$Ka*}c&j_XIy;JiQtj6#{CqWl2u~*gA`OS)jfJ8Kd5$l&&g!}dh zp^X((;9kypa#s8lc^2Qp>8L&Qn5<^0Fp@G}4}Dz5wzKeQ;Zbk%PCDai?v6zdCPo%J zcR^_5Fbc7>wK?KRfy23b{ZXN-OGg5)DHva&{fgK>33bOobw=zAno{s)+8bL!GNtq4 z_|(fNFr)*t@Amc|h)WJM$*#i4&xw;GRWeW7V1jrxotScO$1c>X{SNWW@>|6B_-9xX zvH}PbdpB1Cu9_6=uSLxYA=eoXhX3Z}QB{dIXp7rz@#d&?HqJ?|?$RU8dwQ{lxr)>h ztA#hIh)oiA(i{k7tY8M^dMwP79AXJ|=fbIQn#J$D-4EAqt0I^`vi4c#imA-$Z!*bPo6n)@Tn-j2ay(OOB}}MV zxkZ`<_={qX;beD+-pfbv;HKDc{x6i_5$Tp37+XiRAe@q#O&ig<(D5aeQR}DG?kW`& z(0yC&D82_$!g{A4h(QycW6#3$z5J3x;4kDUP9bmSTkWJ-PoLc6;aHK086qA|o>%z^ zD#?ql7Zt6ZXq@y%dgqc3 z39>Hi+elrP;{2qsfr^RqVvrxK*V9WKqMY~TSLb<3c~>R&#J<=m;=b0td6+)>ZzG#@ z>~YDCTAm?#BmGx?bnTsLF|l|6oj)i--J6P~ct1?8%H^b4n7)}JsR`WCmoKgoQ=7aK zmn7B%Od?g3azV1FE;xAS$f2U3l3J#zO6KX#NX7L3wNj z3#Yw39UhI6+{yIGBlwsVE8);f&hL}lpsrzvy>rM9kCW06z4w#t7v%sts zk45-7D&@@@(+;ZjH~7X}Hi|`SwR{8L)qP=!VClWBnG*`ju#VZ@5e@8CWr((*y?S|a zzZz>nndkUhw&vK0{GS;=O;>vYy?6eA$u#R&s;IyG`lbA`i3GqA!f5<}6Cry*Xy2sX zD8&}ZJAm?d_rM}rr1cB zGy}uGhIaBfn4L(){G=*&0~pFjV56kph)2^MX#9muZsHk+A-d)wsW>&MSm=$r9!`>% z)I4eNQ2y5#jcJux5J}BsER%yS!Xhc={6VyIiOiJ6=kwn*8XqOI2TV^m<0f8fYjxcwoXQhut@c#||9eAP%?%1aT_=mBFTxXEa|P@dV>($ktDJqh)9rv81z zIFe^=2+`;9ezkYPJ0kt588X0!4U4lq^uw>-+RO_%G6}m@x3@NcK$-Jz;^5Urq z^N$ygrT*{6e!~CjjK(^O_^^Z5kpg>ea~@u)C(k)SYDi96DSWfByh0jF_8l%II+xF! z;q)3;MRy)!tkp{y+b)fIeN-=hBLfe~IilTDBY3NN(scyWXo1$hY4o6HAs(zITq~=sqK*ZX9y2=PS<$w^>uloD0aO zuzNNM50iypQjA0t)&wjMYwxN{mJ5)c`ZGNTW(0p!je#v{xz`o&uL_+j&YCW2p$x3# z>hzDjMdKg5m#*U&)@XQ8e&D8qUTai1_wWQ-{hHD64W0Uy(P*h6;WbDWn69VDuizU- zLiWr~EMJJLP63*8)`j}JZ6@D(yu`?k_1#)r>Q7FjNQVT+o)pNDwIi{pIWJb0T|5yo z_;2r&nzGA?lH&*oC_&CUfO}zlvX)}G%>AL;u_PA$uw#3|<89QATt4I|d;t5>h$?)3n1Yc|Ikuh8rhBg_Tm2%YM zd(FNH1=YlASLB6nkUTdEw|vP$aAPl8ou1hN^LC+ZFZ-&=H&Tdocqbaa7RS8~^>~q# z2$sm`a6nbHaW9%msgIUSVu$@p?!y&R&tI!uswKq&HCLyG84X)>YNXMyT&F78eCVZNTg`IORY?(i;c#$ z^4M0x$0T4h?iC>IbO2oZdED1n{@?U`ect)> z#JKMxBOwx45G5q3C~ij%VwT;=Q!t>0LB^S!g@1U`XQ12TXcL`xkm-4toI6m7iaAs+ zQ<+pCNhFr!NZ;{YDXj>{MA_FB-BzPm9CbxP3-hIkr?ttkoDIEB>hiYAPTU$oi2^Qr zQ8f{~I;I=T_ppn>f1E7n_W2L06)Ftv6CQCt*?Ay6;)aZfBmJ`%-vgkGj618d0K~fO zs0F0eY=Lt+3oJ1jFkSnc78JO85VHjHb4qlMvZlRdx)u%i#QYvHT!4Bw@JXLmb0|@{ zJ<=;owto}LsYT!%BH#X!V0$YL3v=PiZP~#z8fSnMZ;0$7r!Neb-=-#5Bau+m_y7Ru z@OZu7d3$03=7)X##uFFyi66J7Ja$FygNc5H+4;-cFYJVe>>={)h{D6KGBvSWJ^PA& z<{?Yg%~GD2$y|i77RjJ{q@I2W35Xm{rn1e5?)5s}p>Q`EcaWfdudZIyRm&4c;$3w< z4nRo{=qFMslqB+S=T}`bK|MmiS!jFWVk6IqACal9OC}tS>%Wj)bZ2TBz6O7E-u-7X;)K;!O8~e&TgZ*lua5T3T3tMCLynHS-e5d~4Ut zpzNnd%`8WD=b9rj*B(7HTbFZg*UaF#yh~;uJ09#BJO74>$muABT>ZrBX!k-2J8fMH zRT~WtAGMI|g4uES*%5`7er_Sv($!rG$x;vvZNyb(2^G>c^SYyEmeYgtt0OWu9W}FT<<9k8GcPe3zID{hf?B7#OXfl{ zpUo3THuX;E#veobA=&z~9;BY^apU_V1fzzF@SdwP?G1 zj!iElkEk=Et_k6M`qS5P&xu6`kTR-$$zS6MeM(Ymh_cOWQ#%^n0{rCmXphzA4^02 zD1E0(t8&7en$xO+v9r}hs?`N6yxwKol5AdEqn@BOBr8#)<|Cr0lsN%uz|ydF-4(F! zyX6&Z0YvU(EdM2Sz+&mee^L*Qk<0ZHVUI%glv%;Hn+p+(FV60I`z98b$Ij<*@8*#Z zqm#!q7$B4Uwf4hnrQ?nJ;(feFFw=A76r33QdS2`q9txV+JrEYEMOLO9q0t5~!H1EQ zXCvg>sTSmV9njnlJP&R&*s+#f0$mcAlG=Q3p_G`Wi4DS1jZ{j{_QWQE%RSD(Yf z|BJ&i+sD7L5ICC3ts zGE#%DOWWrCR?A23)O{BIRiNd*m$Va=b(%9W~A*sBJSn9z$ta>Wt+9SDm14bu3OD;gwUhD+=yxEx#?z}!HA&XJ8efvQ4B6(lv>Xb>_NNR5X7lolJ`M$IrIR>c{qyGFOa z0zse=m8*{yYlGsGtTb~^Qtok5RCpUv2FGyEf`zph+Y6Y+vgxYm1Aa>mhps6{G-tR#15m)!=hZQ@4uh;Ix%F5rx6!4spR44>6j$D*ipBRbl< z0&4!*%~$vt+5lch~e_1VA>Izc7|EmupviL)JZ^1fvr-(W;BU4IJ$N0PXx7& zcmOmWRK!QS&HTdbCt%zuaXx&&r;G>_6cLNGz0UfNq;zZ{GE1yD)G*kQS;?AWwD-ns z|AD-ybGc&y=DMWHQx%$J++MHV{?%W5kvz4|!7h_dPfmk=kLOhWLIiHk9tL;$)C)@?If#_*Ib>)dZ>+%f$9jv^i_th4Fi?;PFlN%*gp;eu z7fq_Ldfw!cyA3={KjiI8>ktKJJ0v@i$bW%Kl>|z=@h@bzCJl4G+6CMKHlNbYuBD1_ z;fXhXh9Jvud?Y_|d&5o&Tllg(&JK?WrEiu9~1q1-P0&&Ipx08dIamCVl!&p;4phM;~Mn zi8x)Zt9w+Uxj(kyNoCIKU^{BhNAlgBTXZ(_Dpe%QvC}MLl04C%LI3z3HvWd4sKl z4;>WTx0P2PlE{vR5;?ra6Mw9>=f3SeR_n{@R&y!;FcKEhxz8)vgHirPZb`}GG^!_R zc{c6HFs8s%05pUBj9Y#nuabp@&&cn>*;}Q8D^+%n-4pxYKA;6acSnK{jokPW<`|m^5&LOZgd!;OGv%pIupO58^H&35A)b;Zc79$6+ zIr^fHU+xCTOVYpQdzx2YPudB2&%eh^_46iqzCGu+|2+5m5SzqKKJx6}ULF4XH-Otu zkESj^o%{WW_q@MX_S~HIDyaAFoZsJqv&}6lX=&eo*5=hA_wwc0pJ@Lbul`wl?__AI zc=ni+$@~s{%IA{Z+^L5v@qf$rf2AqQvsKj5%Ey1Vh_to^N$kPA=_ymRGBtQo#C)xm zy(`uSF2ZOA%8WY>ozq@B-#riGDl{~9?Oyk*xTcgu<8up6HtRk%>&E<*xaF8sCC2_e z6LYx3QH*=Rx)!@&X^!d!$>*9UkbJ^opaG-VzQ5$>%*`7sq1c&D!KI#Z$u3;lHQQW% zy1iAl^y{^dA2p27o_CbJeyX5}8sz2_*6_XKdp&y&LbfXoqx1euHf%efoTl5bo)203 zLRQ8Hsb@}Gb9Gya;i^qZ&_6#$ydNDN>ygqLYfk@EwPIpY)k^Bc+j0ev2SBQNr2ND- ztw=zt2Gp#elH55ByGlI9Yf4D=7(I zN~a5GK^kKuN~M3@IwkTAWvjnCbD5(a}&h#Uv> zn6!SElH<1(jMgS|$`0hGDfvm>*PqDuF^>sZF{9omXmDKNsP(tB|2G(G1(ma&nz%4ZhBap!3FiM z5f1E&5R;|#-Td^XOQhMB*v0nbS;@-+HNlS;m4}k^4p%&byG(rCv~xAj1TRuyVpFl1 zc}A4E34s>JN7q?xnHFopEVQt!O_}V-b?RUfd&;c#ioI5Ni<}S+N;TH>c74_8VAQT> z)3~WLY#j<$d}>b^0P9|APu~(smh?{?C^K&T6ZzHeX#Y}fyaZbpA75LC=6}Cv*f6kn z?jQp(zpDXXkq_@^z3(z}x7T|D%uJ)i(f;Snf~lX|#| z4)@}awr&f-4AD)5Q<{mw`Ue}sNf;7N61xdHF6Y3jft}$-hLB0m`=<(f(RHPn>3k22 zbp_0NUhHY5j!gPFxS?!yovV~nNX33BKk9v@9%n9y1b0CA^ROGn#9Eu!!`>2qaI~nX z8*c;bjY68~!KM&MJ{0K>-9RLOaOIB=waxK!97A&2lu%SZ_m`$wGa)ZwK$T&g?&qXf%TbN$oUX+v*3#h|CziZV7*vV z0mZ-?aU+OUBgwIq=F-e@$jvYq6yr?iI3}WrnIEPnu``onPnF!n0O3;W;dwY9UDP%q z8M~M|_L+9{Bf08Y&(qqLn&4-iT!^?wRpGTp;sMpu@LFym6Lp(R;k6;_)llo(1zh1P z4JDo~4z=zkoq{UEYq+5LEy2UYxN=?NNpW=4SLqr5ny9%Ij%}8L-v)$H5H$w2T8_? zL*c;eVriBel8Md5HOZUsci%C$P$Y4E_!kbm9S$Cv+fftT6&uKi*I4hS-Eb!ue`6ws zt=T0t)~=dlT`}1(7lTj~@Vjz>UzbzrW;K0ZfnM6UVO|yv&MvMmpc(~YBoSOE+j!_enN0DxEeU^09no^k~ z{p>yo%M=46v)BGM7wuTXlGEF3Ebik?8!{`=aoA{(TOF*Gy&Yq78yq)Ng%+MBelNidb!t#I9WtE{jg+HLZvZrZr;sKSagz zc2aRoReZ~$-zIV8iv^ZlvIT#QX5B%Ti!_@f_Lwc)D3FM((SE(9IcAz%}1IRg5uFwYAIk}W6;P&6bGFZOaC~v6NdSQnIf1MiANcn?C~i-1@7rmNxM| zJ@<_DtEI!@hYr3MZca=<_-eoE6zO71O}_p#o1 zlMXs`u*P6$Hk(Tiids1SbSSZKNGT`4-vObd`}Z*JMobH2sbR*$dtoh#%#_%aW75OF zZjHpgOe01^n9AL406Df>`7Z^e(I8uryRBQ!EE@{_p}LhLXq_xtgZa&ZT55|#H8x5f^^+{N;gfOe zo8@Nffip~*Lh@H+4t^4XzO&eQhnW$vFA$4O=$1=O=?ejoDy*k? z_m8?P()o|mF`fZynZCXtZZ0J)f3l0!*x?sytU#@Gf%L~JJ32G!Uk}sl*d3_nH0R{| zCixn?n2j$oII$P{D3a)JUr`*weWGcPX7f#7OOf33Al$9b4uav1hzF4Nt`Z;3rKUmz z=kendIJx&tqjF6MX?pG@)c?!gdjM8ZG$jFqNCF8afPz>l zAq0p*5|eu=O4AVKdW~Z5D|W1l1r-$tf&@EQunYDZqhec%AbFqfInOrt#37JWI zW^}_0Jw@#@lD1{U589TI^ma!4;J3}w&=Tby64NrUSw{6*bTeFE^qi!Rea9ek)m=^! z-9ynM1;b_aL6vZV$w5|NC^ad~omO7;qGWp;i_e^eJptQi2w61K6@Ap|xD*-pED5D2 z<(ZMGtK*6rWhDKr_?Rlhiyx5J4ZnpJ@6|76CH)P9#mL|~f2(SZ2bT|QAqvaz!1lagS~3edARZV%7EH*VVBevw@m=rYlG~=nDU*&Y%&E4r`^Ws9d$2+Rf!?%1$By&Mr%Jz+e z!-WFC4VH$oOla&=-k z6vu4a{dJ7;hFF8^MbClNILGKu65t2pr0`Hmjsi2EM|YZBS*QWF3n9b4uIebnz75EM zF2tsYbJ3$vO@`&D(vCJg_X8J1iEjb%RGARAo187{S;lyZO`=6C4|S= z_*4@C%{WfB?;6JHl+vwqlw4w@$FLbuI6Z78xK77lZsD@1L~4z$Xe=yI1QP;8uXw?f z?gyJzlzs*at{I&uQ99m6BEZ}>V?$q-%#HOzAIlI#k!9b>Ucx$uee@J;Y`4RE!3@jx zGU{hacC-xc7cPy%9x5d>hT3m)ZV}8+5H6EKD)d`R#7T++D`ls6&X&ehWo;{s#j=>C zF~Jj&#IavAF(t{)=KpiYppQ_M*a^nf!{*Mt>625Sh>m$KaDXzI1tG zWGHc;t1CC}Cl_Y}IcF{kqIe1eYc&Uz>pkGEycrjmUS>`wJ^WgAg46|nCLgRxU(U@!n+iEw)Vj;L zqrC(Am0(|0$@YwSzL{lawH@+I&-ZIQDELZ9OZqAF4mL?ce?b%ogj%PV91nst{)uZ% zwj*3OvJJ$?pPmbT^}|t-=3)O!OVLLjml4@pz7F@&>}p%61cd0uj)vfNJ*a_R40!O zeFm*vdMd0>9#%YFHk6~|(j^6G6o1)9EKYe=Dp<3^pJ$a}OzI1F?}mzB@Ff04P1pMm zqmOnZv%ybkm=LrgB8s6BlX5}dON-m{_iHq4{_AWpxM6$X-}x&X$wP`gJlrlF$_F z3)7F$j@cT83Hg2G`Z41XG6Ho10uiwFoWl@|#clTruVfU11{-3uo-v_U@NaS`Lp-T9 zheAgzbYm*+DcR84ezm3ttE5IIM%oKW!FVGQH!f^wpR%#I9+M1~^*(n9QkIL539F4@ zD6+IMAL)pR<3Ckih4%|?wU zrlhRAO2V^&T{%#8gXO{A@|rmbd9L~P$xC_Ti*$Z6WUPWo{u*Vr---Ao!JpbVxG=8j zU=)qa=aTfYnRq$<5Zz1O4*sG7&AEyw{Y=QhC2(kB~F;YUcp zOiFau3Y!vLhcIGTL`LgXVm$Yjasu|kaPIYk*>VLoI-18~9S-&PQjSOQX(spJ7o0`O zjsxNs$afB2Pw}Nau>|pgL9nWuoO65RUG$Dfa*h|!ZzZ2&xYH$Or>%kqmaLGMmKSPX zv%|_wct6zM?@cJ#ie805Qc0b9l| z7=**&axfN9&EAS-Z^z2sj>Jl|VUh67h)B(K6O4nGvT_l0Z}fcg*%-uk&^pdeTxvH-M?TNah!;7(b82KD1_>;T zON|tPr{IgpJOG)I$ui`Z$peNkliAxHVrEp4T95lKKMg*Y*bo7B| z%|`JHWSE=E!%;U-vO*qzFElLG&QZc!m1$o;W%l)BMnmQlCQUnVieQtq~*?+{mU#nW$&E@^c$0O3PWXFN=m)wL!;qvsdW?Ll8w98k@${TUv zl_glFw`b@dzddqGx}#3gWL=O?L=a0jMxR1c2fS>L)>{)y_rDM4A$}s-ng>;0<(h;? zW_FHVyj{2o%Q#2e>OtPC5o( zx%PE5KfQ5m73L+ekrt&`W(>-wWf#$DpP36X_fkJq8sZfCrmRGMN}e5)jgJgSPcoa! z{3eV&2#y&~)wM)35IXYdb>Z4JxP5iLz9uc|f~Y$R1qaRW-y?E^v3KFQJ1ph*ANj90 z5?h%JI3JviaN1c`jC9Y$B*ij*jf~;`_Vzv1CA(rm zlTsq%VoN?n!_;776d^aO+z+Q+`o2vevhW3gD!^8lfkohVZS89M-1j3m@aQ;G*uHpWdb(GH0fZ>E_v(b!H4oiHh4ug1j}_VzcBhQHP0P zfl=-yXL%m(0_K@U5eLS>O8M>Lzw}7|WABkF=;~lcd=%dM1d8rokDh&mJShEJV@>p& zBk{YUK?D4jKOM}771(A-TGaFgTVw08WwJGTltvFWI~atqqwwg-f(~XcgQnPBm@?sC z57h=I2aQH~h%Jw-*Hy|RpU(=EY)@O#-pan{J1KKCZ;M7twfJ!zN3t;>MyvC$-Nd}dUo_w$z1K)46_A`Zm z$0KyAx~2BbT`N!Hm<=*+LPq$os)LZ1ZWbyKPxo!ng&)deBsF(2RYOq)Sv46k%vQ!@ z@%m_n$;`|=Io%!&tsU&)Fyh(z=tl?fkTaj>?vk*(jBr{4LO~7_d{ml8Bpn#MyJXJV z_~jAYV^g<-CV+dFoH`}#C?vrR#QXq>c-~M}(g#4Y-v&TnlzxV+c6y}Q$jcEIOzG){ zblb=v(mZK(dU#pD*jIE0f(MuEY!QFS`E3#8s9J1x8-COz_^4yp7CjJg5s96c5eVs# z2D{5-x9FXmhO)s5shC3c3~M7^Wu|N$DV4KAnFwM)X@dD#Drc6CvedAdtqT^jy9yHt z(PLN6ALa0J{gpqVbrbgyLF`{|i6<1D;-U?)WU4GA|APCe7=Bf7{0| zI1;x4zdFS)IM)8^7EFE$-_q5UU9fx9C$7WVhBLm#7iSq349n^FR7OliN;PU%hg^^A ziJ!4?`Th%VL8$I4UMFAbC-OAoOHRdZ7zX%uvL`4*G*_TY8&447Aj@S+fW1$1#=HqQ z@RWJ&@Gm-+EJ0x7SGQm){>6YDXUG{!Q7vR%a0LFH7CZz07RQ&KV2-M{QGyq(eY;?x zWE{tre7dV@tj%Cojm8Eu(VK|t8kBtc3kKVLsa{oou|n>t>RIwqOw}=U?iRAqm!`Z9wP#m(A1-E!B5=_Xit%#FjhpSD-{nt?eVkf2h?esY$LJhx@h43*eVTFr1}aSyp5o>b-`<;w1XxB(T)(&jf4j zDXr><^WvcN8oFg=OXMue%GLt-0qRHF^*FW!Fh+AID-$6Z2b9m+^Oqw;e|*{mf~+)Cxcvw_GO4l;FNE>u z`yYHmJ#QuMw-#;K#n?2_Z$x7H$jXr_3c#!6{~{(v0im~3flaApB3(e+af`g8S@G5f}9>QDN;C>xT0imnq=8^?q&&W1U2#vWXEAD#q$4$O@7fAbRQt1|#&h~hnQ8?v-db(DMA z8DnN3u%lbsOPKY4xUOrKxbS>cSJs0owX8TMEj*(s@`J$y)a9o{ZcRW?;bdD?U0?%u zDRzRxnHlvK+$<|`_ISw9rfgiRa2wqAHZ>c?Rt?5d6ytt0uVF@HNSmro8CV^ICL=$h z!9%_1^t$^RZV!Y3y=OE<2xjH%vHLkOdAiYt(m!V zetLu0y^<-roABvPQOts4c)_+MyV}ibweVf$QFZ5yrB{wUPW6z9mE)26QJd!!x#MjW zNR_WfW_#P3`9U=B;%lttEm1dV*egwt7=njkDS$+w6NVly+0`%9!am|L2t3r)R33!f zJ9=^;XXBDkV)PWwV(&M?-me0iU}C#md@QAfkC)48 zk4^1Ms`2X#pelL9otKpCIunBu;=IfqsC{2aGjBd+kv6!gcoF07+Bo*aMzhNh9^<|8 zPLT%F7Sv|P7OcWutL%v)QXI8zrp+e1$Kb~4ZHZra9!^9(k;dT^G)cF+<`+jM9>m`a zFKm>EZKGMpLCb~9E&BsuW;g1EuT0tKN0Zj+0ZaNc!d@k4&;ucy9#@5#h%iP}%?Xvv zjEf1O9acI{@>)4~5_<1lwidl_YJ2a6kgqrEP&ikJ`UrGbD77JMGRDZfR(^!^#q|Ao z3qP=0_9U51o4buPj$|Z+O}U<25o${eY?cAVU}Nw_B&U9g9Jb7ig#eSu`d(|Z+~z28SKPpo;;hixpf@UbY-kM8Xj|>kO|if3u`w_h{ht$ z$_a+dv6x%hD+GAgPkY=NGv$%pQ9pQ3_xCFwLDd^~d+ES73rp{niz-`TaqALui62E@ z!6ES3i*JaUuL(K7&*TMU%4;*r?v_oeCe&ote(MA_J!VhfB|I)B8IktKzq-7d^T2CP znh$iq10>gXEw)1K8~k#2F;8U3~7X0p7hS_ z)za-@ct!;pgO~%_$0jp;ggKjfwuopm22DidA8*3uS_vz5eo2qumh~TTH3AEL0&d0_ zdX)*td*d8&LHFB@?~sjANY$cx4Ki5hK!vYB)A*$7s=aS_W~AeBb0k}VnH&4&Zoq&f z2;OKKHjkc(HXv$dtQ>@t+4d}!6j&-RyT6YT1{97lNlZt=hK4p6Tz0{1eC4Ff9~K)^ z8MNO!ZOoOJr-`qp=$zXnDGINd*(>_>`d=OGExasnG_=qOZIDr_=d7a{|UeJGHm3-(e1gE^}#9O*_8AzI`0FMESAp2t{87q zw#A@G{IR+_XoRAsfpQ_?(sV&Z=?K8w#WM2~D^ACfl*p`D`>^zGC@oFOu9dB-M+}tH zMhum$f=5Ufo#l7Pg*RAwL2c%x^a8BKRW*{UlJ+5qbx&bH^cT4^65X5I<+8KrdDu_o zHY6L-^QGB~#Ph?E2da>1@4d>;kim>*>x#xTD>P)njaK6H(7qWZU9U%aoc+r=1HR(c;b%ZQ}O6Fwcfs+sNk_=)*8lzvO`3*N^0r&Od#QG!r_!Ar(q zKD#vY_?Y4oDJ*Jk*5cievQml{O3Zh$7i^t!;j3N%Ux(pPtSuo*38y7$(o~jGh)L9r zgJ(YWE1s%u89A*k(U1K-4Zw31E<}5XnQf3D>29RB$~@R9 z)hQ#YhHBzHw@vgpv<|Am*oS52cfE;DKz4NWN`NJ&bF0g3{=7O%k)~K*eDI2^E`QainI>-g~v644SI=Uk}kcP!2xvQYJ-ZJ1Z4S4@MT5@gj$%I8`R;O z51Y!ictleom?Eq}{DONCSn`1H!7W8HSGoqemk( zMhRG(m|(2rQ?tU8(X$oTm2Wn{R0Zbqu5yy>7-`tdtL1Yl0pTU(8RtM@wuS}+QN<8n zx*eB-U18L%(y#HeCf{cI-lMQu9&eeIuB_=mjQr3ZgURCOi|IM05IWNI5j3)mUtq>X z#<02lP;`78ZUegW--fT@_ysrC-KEr4r+1d#`z7KZ+waAi&^Z}_n9(^al9HGnM$ZtGZEZD{UZ_(EqK#K1w!+MAy7&HDVE<^G zh^P8vJY8UQYY&IO5H>Rh*aAFnW-|m7YGI-e+=^)3Eu|V=Pj<)52uK{LH@hv+#tXJU zPpX8{a?`dDV`QgXs#kpr0h6ad<&wcBo%nXFcZT% z)U*YANo%@bfBcJaC%0lIolT`K;O9_UM7K@4rGIs>n$6 zNLx{Bg~t1mgE1v!H5+w`{(@#Fvg778D=W{&V^gQ6HTz9Vb_7MSg(}_LZ+j-5%>@?3Si)yH>P5UgqETxBXQOj=515AhM+U2fIkXJUE&0!8U^uCb6zp)HA9QAmi%BrKHzpS)p6^r`$7JApG z)H$Kp4pMn5Q3=>3gF!{C6> zRy?I6!u9d*`0ya)@&>2N)H&ekGJQ^FIHz-F_yWA+i_?)skqwbX=H7rCzBs)sbOY-4 zWpu}b?vl`+*$#^qOJk5Mtk{Z)(lcb;CrD0Luin|N{d)9fms9|Ol3pk7FIr^gvc+{H zKhi%JrH4otpO_DX`)Exz+UBE{QHr85T?+>70y~49!2lQl+khzZ!E`M$VzTrU9)_oJ zIR0y7Yq7(}lQUxVN1Xn^WUUhCBeX__&=MI!OJoQwC3_mo=!38SvS!CiDAs(bhEGe7 zlf@ioZK}}7{`AuOuLtXU+__XXs%X)U^hgtw$@mwXR) z5jlE;BuyjIl5)L}^ni*(ud`rE%_jRJ3)i!%V`@@B=DaC1YXf!HBH!I6)Btlyp)CqJ zoXJb#f_xMhbVw}6sY}lk1H0ewDpzp{zEMO zR8W%^NDsJ3+WNjj;$|OcF0S%1S&ti=UO%lI8KA21A~GX$(6lIaM^#^$K^;LD?0{Y& zDAi1<-h?99aQTcctL~K2mE$FJk+#Whha+t}bv?3e8>_mY>{0G)ut8?hme3FK>&lEW zIJ3|KClaVagn*EGGlvJO@s|$9m z4OvO&qOYNP0zo??$uxuPz1LkUNn4L$AkewJ7zKXAaCMQiwc$Zc@nF;qgQ`8qtDTOu zl5U6aUoQT0!=dg&j;9yTIiC~^ZV`S{p73Fjqqj(WZY~evtn>;*PdqAx@}#4`rbK^S zs%(eY9~vQBWJI#s3=KEkl7f3@o?dy1GQ)^FC_Mm&*9{_1JMHwR)&R-2lmWTGMhM@h%`Dvp9?VpTWj)tV%^WL}(&+2LJt zyQ1I%ZxzfBQXSks6ECso$G9%sH+)EiwlZwxhR#M~w~FXmtVEq;ZDLvZD3<8nwSOwY za#v(f96B7^RQMWr5T}rk*p|=I&JUevrS5${OwEUH)40f>rZUcmO_onLeq;;qcwj_T z6n3GL;_j*$$ZI7;Q?OFLIFdl*@y;Du5&N;+iOk5k37F)uD#g}E2e4YUe<>xB<%MyF zvT#=ELZqMR=GI7MkBpf#G|~#a&_>`^#bVHb=ke%GlY*hp6KFAn=(QFt)83qo>=6oH ze!C&usF9IzaTr@+xx7>)Gu8W?b~5SU9(hHbfLGLNc}1;@i+Q2?xsspd6}1X65JP%Y z+v}Zz*R1r3o-5hXxyRup7wPqyOuyJJ(ohm>bij>$Gaa3U((x6a5$^S-WW2(A(02~w za3#GY8-`wvcE(=P@U@l|o|GVYwSVYcmKG_%fE+`b-k7re7nA_ZMaSgo=)pKiSz$x; zReWsYPNat0XNJ#1V4i_4j^+jUH;L;wWh5Qv;S`%<^7(egq-;muP2>wRBOQ>2psUwg!I5c6{W{3>i}Dqm^bw|9*3IN))4S@()TBPr z;}Jt?VeR2{*Jec~c91u#gsx4D@PKZBki>Mf3?723o*O5ZjaIAMqaE-ySaTXUw!Qq< zaBow?$kIyLk(~Po47c>P8-G%&2RB8mY%Z3J@Td+6esAiq%=Poe44LbvH9r635i*N5 zm__xtsQb1trc6~wp(xo86xRd=j6sh(HeG1mOs(EJ-`{%vCZZEF5) zZvIU$|F$sywle=7VE%1m{yoV2dx-h>F!OJ~{Cl|hw}bijNc@Y(uI$j#+KnNM{)%@k3x z`g7m$qwcfZZ` zwCrHcl;q-Ib`cik<>v*BHFt9E%);cN+{xHwGS*GbmHp;s7u9%k^C#+&%r%WPmzSKI zpHnaq*IB!-G;{gM*k4g@ak1>r%dzHDi(yQw*&w&5sGvypm0B<@J1;*OJIYNC73UUZ znXnx`;hfx@VDhAbqLXqF#yJJk3iGDsCKnWnr#RW{t9EhThBj%{xEWo0ywD72%1U7S1w3;$??|*nVm* zcHk*(OiM zz#e^mb?P1#)>^!Qy?RmQ^yrn-qfbuH9%HeSn$79E4rwd+|udLK7v%-FoK zkiW6pIdi(3`{va~V-NRGu2-MkLFTTX%!T%`(nrQTb9Dptf^ow}n&+|q$tTZ25Y&bU zqD3BJ#a_>vDsMXXPWx}1=)dy%ah~ItnEgACjDyys9p1phhmEwU$Kiaeit#{u^;$61 zt4)S&Dp->$BU~9f^@d4eTkI7U6bG{;4fK#c*&h=MCeAW9$J^^RG3;fnm)FBQ9(mo5 z+uKvS*dD$ZF}cPGw}~*tlE~OZwa#;9f>cu6VtF(4N8FYFnYcU1z8yvt<>n4UqKNAc z=CVPh z7i;&j*CqPxf=8^)9c1L2SZIPw_dLzsib3*fD$1Q!Fg-UjyEtfHG#=ha`qRAJrcKB-@7;`iyyVA?D=wUx7fha-Hx2)KM%0|XSD0Ib zSMIct8vJrM^(~iId{SQi#Nm?$$%_%kD^5Evlsz@s3wUGCEWWZ`(6axoH z+E??cL8_lDF}ij=R@cVvnuurv<5YQ%BV#qNm%cB@Vs~Sw_w13}E73Xex>w^ou{Fs; z-2?4?gi}X$OBp#RBf}e(c3Nh}urx1aYT=Y@@5HIu`R96r@`FWFz0|zPc|mVTQFh@J zFSB4qZjmahYk} zw7g>T_VDrx0>z=i!h)h;ATK`v@y1^QH!Z1%YXZ2t~63csQ5~ zw7I%&$kpYX8!*=%Kujs}LdfqRo0B^+5X5UR(0M{=auawoNG`nY)0P1+-^C@E(Z$o1I5^T-lRP2|JOUhMc72CCMCkthzl}VgFtpLFg15l zFfakx?p)-@e|ycj$kyjhD-6yG$Pv5Q{2g8jxEaWr2V}E?Np;sbJIXCa!uhM+PeY#2 zJtVF$SX3~z=A^~b%>-rfto&g1%$gN6?zOJ=ZF%`KYa1q%uS6Y?epY_jUe01{8V zdfo}yN^8^d;QBRMNlG>&cj7UD&iMWdh`&qCF>2EU6aCHdsRj9y>m(L-g&y66L}3Av zIs3qPHZsUw<#^_iueq~z*7fU{e?rZ22|o!(cYSSgX!a-D;HKe21W6n!k!sRgyPdPz z1ZLsX+?fGQmTPw6IqUKy=9-WQn4L&y;c-GjDGxusqjA)nP?3CJ>-CxUx?G_~Nr`;S z+Xe74!DB3+w>I6B>oa8%fx;qr$dL+~bGe{n{v5oBkVM-z5pGyb;*C$S3HWB->zS&v zOp*C zZ1Q~aeuvAbl}}SE%c(b!?~vQb9b}4>Kf$l ze1{iPD;H8>u5!4V`Z;nf`8-+Sa0B&MDfy_wC#X%U51jY2)N9EKay|JH`6?-sw#uLK1L_aS z&E%)#cjWhE3=@+2WCOAZ8BZpVEy>PgS2B_8LG~njlgE*L$Rx6#!xN}aB!`gcJCZ$7@ z{EZ{C$@3guL|sCbl9!T~lZ(i!$ZN?P$(zVq9R7v+Hu6sLE^-NZKlw1ZoHWxg<2s(B zUPrDcUnE~4-*y-y4ZiSKpKL%jC7Y88WDBx0Dc$bmuP51?Od?MpQ^~<(IyscgB2Ohp zljF&3@*=W?EF~`^FDDm~SCLD|`^m@1W#n?w3}K1uSxdc+Tu;78zCyl5ZX!Q&xP|&- zvK~5e%3po50ojynP9~5o$j)R}GKoBa97GN#)5)P^7I~V(@zmMmMPvzCN?u3aL_R`3 zMm|HXa9B>gj(pMKYt(O&n;gDFy_x)h{E>{2*0cCaCI^zk$P3Af$OR5BpadJj zc@6dTcg{Q&t8xtx54TtSwT(i>a;);U~H{R;U3`621a$Sd+k zwjtY+y&WD;txTd;o%plJp&m$L*7n2ck5qUj%Bl#@3&Y_H`B7g14Bgjr<7qTmP zG}(hZj!Ys)kY|vK$>+%p@8haQGkkiRp?apWE35^^W$$vmt0ODBhtS>yDHsqP)IEVA8 zuOJtbKanx$&nACU53npCr;`_wH<63UuSoAeyIoVVIoXN~kiE!(7n7c{M}40CU=rvJG;I$*@irn43KGLI+;a|AWtLD zaCjEAatyU{9Q7P>KKVHL1o~4RRCtKDmYbn*4$MiQGo+CeI7l z@KVmBRxYBxhTK3_k@ebp=1MrM%S(e`?dArr~5t=Tl!tE++3Gmyi#WOUWn5r^uCL zIk}EpPrgcSAUBckkROo^67BgnB)gKwlHJMPWM8r$nL=Ji-bmg=-b&s^-cJ5Z?k20r z2HoxX98Gp7FDDn1Pm*^%x%<*Eib!^S{kY2uM_D#X!V_MTY5V! zyZvmLNS;F$lJAnWE4<$R3UCHCfK4d@g1cw8uQ^-MNDmj>ZgnWbSFa7fH zH-fx^yo#(Kzaw{%-X6PMJQ*O5APdPLIi1{1wy(C^CzC1UndBsLCHWj#LB2@7M!rtI zO}m2WPfr1nMIBu$B^?$GeWIgTKyPvfrpWaWCl5(yp>!` zt|8ZxuaRD?-QTUG7iVfYq>WFNAh!vWMvZKGPBZB-kP4auftOR_b2Ala7e zN%kR=$pH>?H`?pTBd3u?;ZW)k z3_my%1!`^o3Xwd4z= z=h+IBP4}=OWryXVKU4FAeXD-Bo7mx*iKFEwi-Btx;Ckg^YUO<9^Oen+FIIZounBpr z!*SF~kMFq}diIZ>BUGN(j=$!Sw~-GyG_#9iS$)zE`q!uLnQq2!_exUzS zonQ~he|b4I!J5S7;~5@#^Fm7K(K=mPQ!aw|EB<(&oO7vxrQQd4^( z1>_gxR&r7^t|v#>;PB2MH<0g=0R}@Cav*~tgWSS^s3a2@U)z#{`JFYK+(5odCh$JB zB^UEObRYRDpTp{!=h2@35}O=&?HTTK$=gY{zEtZwgRFlHk#7CxTrO8Gp#FcY|NOJ- zH^;F)(XHPMbNQvDUwx<6Tl&>k{>1Iw=Y2oMW39hDm|A%lbvyF+>NoXyY38IG|LXe4 zLOyT*>-CYEzWmJV{a>$-)b#Uzr9RS4|G(#ZK>5E`U#agmt+)JNudmei_s@KP$M8M< z-%@|+<~RP^>oeW_(tmpWrkkJpZ>jJ6iTO|cY|{G90nB%vMP5k$U#;(S^W%Q?pTAdM z`A6#~S2CafGWi<0k>uylpH^R~-xI%AU#az!`|2m{2hKlQKRKHp{8~SGBeh@sq+1_( zi&G!@-9K0#c^tnF|E&5*tzUG%KfmK~c9I^yL$&_V{XYG(>mvv9yH=S>{m<49z!OQV@bdAsq?r# zNM24ZBDFqqG4(QX16f6Cfkq|^Hb#;q_m1UPa?A%4yQha9PRLQ>ak=tc@233`B(B0awS<#t|K>)RpfVM%cJad z{n7f>ua36$ChVV?N=YW=q|f{9qHX`^#P>E zdfKD>>T9=H|DRo7`>(E_9l-k5KUzQgi&H<_mgVhk{cIwapF)lzCy`UgbIISU&((5$ zWlXgV??0>lb_@6S1sNs3CAB``7wUg|eQ!*Rx!`(aBeExXJb5YU)(;0*&wB)^^~FP} z-TLC&xZJHTev8Z9`eL`d{(q(ZcnIr}N06tJ-UfR={ziJNS2~jHN`6RstS3&>`ry47)*oyA?62#GY`v^seXZ8}DSuV}#{!Ak`rLT){QX{i;1+usUbao1 zyz|NX9cn*7<%2TG^gjc?7kxBek*4yIP7Q)iGTIn1I~4yRV0OsyPAtvr=lc^b9y z3~J?B)XFi`%5l`nY-(i=wKA7lIhk6SN3A@US~-ncSwO8kk6Kwwtqf5sXHYB8r&i9U zR?elKPnI|=rB*JaR$fM3MqcIcT59Eu)HjoVad=g zD?gzAklgI>V`}B6)XLAPm0waTE2))L)XHzDm0PL5BY$-GH)`chYUM6!P2i1qkNFs z?eD*l%ikj3Cf{}VKDF{gYUO5Xr402ff67m(l`;am{3*YrR#s9gtEiRVP%F1m|48aM z2Fe{=uG~evn@o(g=QEDXc9=u0%%xUNrdH-rE6=4?PNP;9P%F=)R?1-B@}~?@D`!wE zXHhFJpjOVIR?eeV>bMWe2-hpisFhbxE3c$hUQMmMmRfl|wem)4<;~Q}Td9?|Q7dn! zR^Caiyqj8iFSYVMYUKme%7>_xf2CGFLals^TDgo``6RV+IkoZ`YUK)QYr&czgRyLwmHl|kYN3Co| zt<-T^lx}-Pt*<)jP@4`-AZL)X$eYNR!>mtPpIX^~TG@zN*_c|nAGNX>wKASsxj(hC zCAG3Owemn}Wm{_H!PLq_sg>=hmF=mOM^Gy}QY$-AE4xrDkD^v~qgEbEt?W*%>`ATc zO|3khTA4(x>`SfePpuq4txTa-4x(13Q7eZ~D>JB-Cs8Z2sFlO1l_ygxM^Y!j)XEvu%30LP z3#gTIsFm}ml^0SgOQ@Bl)XGb!m0@aSgj!ift-OL-c_p>-YHH=R)Hjp2JG_%xc{jE4 zUTWoi)XE2_l@C!X|4OZVgj)F+wQ?D?@=0pta%$x>)XEjq%2m|L)zr#0)XL|nl@-*= z7pRplQ7d1eR=!59+(@l_gIf6(weoFh<-63%_o8+_sg*mamD*9LQ9Jt{P9U}adw{wVnMfW_4kWcd{0M68 z|3032GFeE@A?K5qkc-Ic$;ITo>-&>~$qdr%kA5NBM<`3Em8I0m zOQ@A$YGs64Sw^kAf?9bcweo6e<+aqx>#3DDQY&w!R^Cdjyp39UJGJsoYUSP3%6qAm z_fab!pjJLat^6ys@)2s~W7NuJ)XFERmCLD>&rmB@P%BqaD_2u1*H9~;r&d-_D_@{i zzC^8jg_iE8nM9en_p{Os)KwTKOrp-}nr_*FWFwpWd1M z-iDJ0u>iU!IgE7s8&Br)i^!YFC&+)a|L|+v?klqXTQMdf(*D86Q)~a;bEz*TZzG>3 z-ypvw8?hk$aI!Bsnk*nMCAI&sUw`3`>GSI^eDK@${Qde1pUU-q{e`dK`rq#_Y}4y| z?cr+r{j#~c7qF|nxn!xs#nk)yFWP|E*MHH5gFBw;zW$3gT>jU_Q{C5p(cahp*6~*N z^r9c6W0q82FR1Z=pRLuz^QzW#_d zT=w-xwBhjY9`E&E-5*g0VB6Op(cWKgi{-xlh&CJ&_gJ1njv^?~Xqk zV}1MjBieBIca3MeuRo#<@Bh^CZ2!~xBaXMpp4Xl{g6v3kC0Tu`-Tu8~F7HbYAP16X zkz>el4lkfq&Y@P`POW@^TKOck@)>I7Dr%*U)2Y0K?e3LlvOTJfm+6j=xsvOZ<X_O$1#`GdLX5iODTu5d`5XD zwT`b9YrD64Ey!fDKUwN<1GSC^H8jDV-*9r5!)%T-G=-eTaf9;7n@RmXucH2j?9Fj} zbo`(z?cHx8Am3*9hf}GOHGk+oSc~Zwa`GQ)Z}bo~G1tDWw;%8#Ez1lU>MT9gd?`>i1j?J^QEqC{w7< zB+JQ7D<@JbCs8Y>P%F=&R!*f>=2I&Rsg*_4${@9JI<;~p^(^uNhjXZv7gAqDE^v4; z^(ADOjF6X;SCUtg*O1qdH;}iGx01J!i^)42-bJmvhg#c*-AAo_kXrdL^YiKa>lpe{VjCE9kqDyq&z0e1LqN ze3N{~;d|7|52%$NQ7gAlD?g!DenzeQf?64+R(?gT{F++%Ew%C|YUOrnm5t)XG9?Wf8S9NUfYst(-}%JfB)Qn_4-SS~;Iu zc`3E>GHT`J)XGKF%B!fA*HA03qgLKPt-Og^c?-4jFVxD#)XF=km3L7q@1a&Mp;q2c zt$dJL`7pI|DYf!ZYUSh9$|tCmPf;tMrdB>ntz1d1ET>*gu5tK0wX%X*`2w}_C2Hj> z)XELi%GartZ&E8aQ7hk}R=!8A{D4~d5w&s)wek~c>m2Ie%2T>~zp;jJ7tqf2r z52sdkpjIA9t?W##>`JXXnp$}bwK9=f*@Ifyi&}XcwXzSjGMQT0k6L*GwQ?Y}@m5t)XG9?Wf8S9NUfYst(-}%JfB)Qn_4-SS~;Iuc@ed80k!gCYUM&| z<)zfh%czx?Q!5uyE3cwfUPG;1Os%|wT6q_>@*ZmC5^ClB)XE2`l@C)Zmr^SqrB*&p zt$c!7`4qMCX=>%O)XJ6A%5rMubJWVU)XH_#%JtOB7pavmQ!8JkR&JnHzD})tlUlin zTKNvO@;z$h2h_@ssFho&m7h>6KciNDL9L8ZE5D*veod|XmRk88wekmQqy6qJ^bNR7kA94VhPU`&e|LlD6I&b_G?yrD+ihPD#PrgLHL+bqRQEHw4 zeFya}vR-@UFUUp?_oHq`CXg-2)(+cJA4+y`cqFy5GqtiSbvH7R>`wM{cmnkRGR>ho zzktryuDpo#YRU!F%8RL$3#pZtQY$Z`R$fl6TtuzBiduOMwemV@rr)QY!Gu`zbVo0e_KUSt+Ig}ji|dA5~*)_mK`xc?1gB^k?t?0$am~`js{)EeQe(pn9kgxM`kEYi7w--_C zeB1UWWBzFVV0FKjM4dtoCbP*&q+)};jGAg)!oy1(y~vSx&n3(c8FO$8*>6;Snr1UQMneH>jpj&=%2Fo#&?)ZUz;{&YVcB>q& zrhblGOFmEPyvRzw`H_F1KY{JFbUx%iI^VI*51!BM-yq*2KOjFMqvTiQZnD~8LL(c| z{?+p*=ddA(JD>UgmHCvv=k@CUhGzdE0C0ULnnyvoY|EAuP=!0V4`YU5>nvH{tYY)&SS zEy&JfSF$JBn@l24AXCY~WI8#N%py-EN0Z~pY;qD=KwdNZ6PX5{B6a2{iaylbV=T{!c z_TR(E5#$-i~TqLtoflI>`wM3`;h&}6w;mF`6e#EmAs9-o&1^H zP5#mOps(s~&-Yq#F{$%I>wM7FT(0v$cj5fcCzIpI`DB=Ugj_{>z3lOHzG!cl)qe9u z>wM6i{N{t+X}ABg$6x5Y%kH-;`LCWIx7X8xH&GH*Gj9V*TLN zzkT(YHXM4e z9<3+Yn@l46k%Pz~WIA~gnMIB!Pb1GJ$B^U5Y*NQp|G!?Jxs~A&)70LVef60(9QM^` z+Hg3H^?&2ZY;qD=Kwd8xG|y_U3cc&y(xPP2@j2{=3#^ z&S$;lzpDPyV|`##vN_p`43Ph+^_BbTCvANEPahBdKc#;1ynqcaIeIB{r_L}gTGfFxUW9XKF^P^p70IwUsa#?|5{)7zg9oz*0&|H zek_BWPu@!YUj3T(kGqxq;}(XV;;dIW!SS7_ zD;(xHzCq4-f@~^(rShzQMY};bg}*#96O$isMVy6%NmFd_$e}D$nH) zc6;=+|Ncp8Ag7XgKQf*5DyKQVEM4I+-|-D|)~hUVe8Y8x!$QY5!db8KJjZvku5ei7 z_)c-wt1RXZ4Zo4p^E9BSgQPAVMeQQw_)c{V)YBc`XdmAU$9I~KZ>Hlr-N!e}@txu0 z)BeADy=VIPwmADM_wjw~_*VP)K5=}{`S?C{d~1AspE}|LsvNb$??7EtXKIr z$M=@5aH#D_H2!UJ)~nQZChB`fS2$#IOiz99I_p*b%pdA|PggkP=Ty!9-gnlk+|3`l zzYlbULv1#xz7L)CD%t$8=C~i}3WsdoSmT?iJ9d0*E?DEM{js-^pD8t~>-p@j0hjA) z{XE%wZ=To4@io*99Ajh0$IlYS<$3!#K7L00%Gb>CHT5}eyyI)`-diG@%40kJ$!t<9bYdW-|>#`I3HiK z<4f}K^>ciEeS9Z4zWzSGfsSv0kMBgsm*V3~b$o+-e1jdI&J*E2AL)*7h|m5`a(qL5 zd|8e!)5ka5@eT9wo$UBV`1nRTzEgaBr#ik-KEBf&-)JA-8IJFCAKzJyPv^yO@5dO& zcec;|#yP&RKE7T)damV+VkM9Y`x6H@4-0?l-<6GhQ zp7rsqa(vr;eCxPe%PrPYKkxWoaC{Zi>mA?Aj_*b4mmJ@#)VlZ;{ozEc4UX?MAK&Ya zZ=;XzO~?0!k8hLXd&|f7j^lgV$M>G&d)LSJf#ZAM$M>P*yWGdO+3|hki9nK@qO<2KJ)Q?>G;0z@l`s$sE@D8@qOjv`^NEo?c>|(_`db={mA9|9DPsygX8}j zwJ!cie>m}er{mk<9v@!}FSKU0Ubu4|^&Owiv*g&k298hX zUvhno9G}k1-coODc5(f8_;j8v*VohW z>HJ%+ub<=7dAVHQNXK_!O~SCZbClz|*vB{8@r8YSr#Ze$eSBv)zAJouXF0w_KECme z?`j`kj^n$=$2Z0CUGL+|b9~qN_zE1~Ek3>?$9JobFXZ@c^YP7heE0bHN*v#PKE8#H z?_nR`rH=0rA78}rJ?i7T%JDtvA1st$9m6uu)bZQyV3E2UEf2FPsbB>eGfan zFtzLZtK-vo@m${{j!);sbA6A}$IJGvqTWEN|1oEOS3B#~_qgM`#>cme%k{WAKJvAW z{|RS**E#F;xKBF1>wSDrak;M6dGl`If{o;I$EV{W-N@x>k$Qg5P-}d- z*;%i?XSrPWw~Q-par`Ts{oU%U*Zr+@e1Gxrt#W*~`S{AYT+eSY^(M!^+VOo)t>a|t z`K@t$I$z^+&i>X?Yxv#etk?ZL@A&Ta@vY->y^edR-*WsF)Oy@|o%MR$^^R|ekM9L8 z*W=ztePnyxljV!f{_gkL-%E~9=egW_Z=UzEF#f{AF49ga`O!FPST9N*7A$4!j2 zTWb7Epmz7y-SO@3SI=+@ZzFv;6m5;Bt<7@5XJI?VP;Nv^q@g3;n>*M&^ z`1q0>Ut1qvvg13*$Jf{K9qi-l=lBls@%49nhx+(VaD0dP_y#z>c0Rs=jxXTjOL2Vd zeS9Z6zQcWdgB;%xKE71P*TKh^=J-1L_y#+^BYk{B9A76NU%KP#?BmODd|iBeLmgjN zAKyui?$Cu^!y7~BqIlg0je8U}|&eQCsYa<+==d-_)9bb%(?-a*Z&&M~? z@zwY7jdFakKE6{OUjrZCXvf#k$9J0JYvkiQ-SNfw_|9;AjeUG)I=&`8zOx+Pem=gl z9bZ!)-x$Z&%*Qv@@iq7HjdOhQKE7>!L@m=cUD|398`S`AIe3$$9u5^5he0*0szN>tE*E+sye0e0(=MzMFh}w>rLCe0;Y#zQ6eRZg+f(eSCL1zB_z;cRRkje0=vhzI%Lp z_c^{LKE4MW-~B$mhaBI7KEA&?zK4B$k2t=iKEB5s-=jXhWsdK0AK#OX?+G8@a>w_S zkM9}B_q301h2wkH$G6Jyt@QCd=lE9p_|`hUH9o#|j_-LN-+ISa;p2PJ@x9>Vd)e{5 zfGBe0=XazW025A3DAde0-Z7 z-$y>aj~(9@AK#~r?-L*2=Z^0)AK#ab?+YJarQ?hG_^KS=S3bUP9N*VIzO9b$TOZ%| zj_*4k-;a*(2OrLDI3M4Bj<1Q2ubJa(>f_USEwx;)xsOlhwN#(ZgXxCL1n0OteD;^)_!|JhB4&_iztARa!wfeI+;GFq1~+_m6F87|ZSo-d`w<9!6Uu;HS>MH(&!T(sfh zz{MJ_Jh*a(s{k(EaFxJSG+Y&Ml?_)7TvfwW2bW;Dn&4^}t~R(@hN}y%j^XNqt7o`| z;2Ib%30$J#8iQ+OxRby&G2F@Eni}pDaLo+Y0$g*$wF1}DaHoQ6ZMe4J+8C}qxORr? z2(E+SP6v0I;W~rsWVkcIong4H;JO&D8@RI!*8^O4!}S8!({O#j^)}o&;LbK&KX82w zcP_a8h8qZOfZ+y%8)Uel;D#7(IJjYk8wqZN;YNcSWw`UejWOH>;LbPPMc^(pTr#+e z4VNOr_3xJMl6oxoRH^lK**F-l&)4bT(hN5N+<3!ffSYKzOTk@YxJlqL4VMir%W#*0 z%Q0LYxLm_c2A6NRsoLyR?q0*)4{oL5 z9ssw>a1Vl8ZMcWQJ!H5?z^yUdW8fY&+~eTZ8g3o9Ck*!_xb=p63fu<6Jq>Q7;hqKe zjNzUGx5;oXfP3C>FM``_xR=4bWVlzsy<)i6!M$d zxYmX{8QiIcYXh#6;o5@hY`Avd&M;hiaAz8>1Gp}R>ja=<-fxXZvjYq(r+TMU;6?hV7`gWGDj z$>6pbZVI?PhMNj*ui>VF`_*vM!Tn~q%fWqVxGTVYWw;sOemC5e;Qlb&T5uZ;_c*wx z4Yvc_Zo|C;?nA>J0C(7MpMX1JxX-|SZMdAIqUW(=rPlLT?Oz5i#c;Xc#u+XTT&m&n z!KE2)GPrcZO#wIFa8toeFx)h76Ad>VT!!H;2X~3#t^jwb;bwr#G~AWoCK>K3a9M`C z8eF#Fb~Guv|80<3_dD&s1MVrqy$f!m;obxHwBdGwd&Y3@gL~F+yTENS+y~&EGu&=) z&l~PTa4#5c54g>S+Y9bR!|en2lHvA)d)aUwfqTVpAA@_X1Gtly>7UJ;I?hv@GhWiZMHp6`mZoA>W0QaWh4ugBka7VzsZMZfqiyja3dUSdm(0*HRA*pq| z_S=CA8?HUL2*Y&%7iqYT;Gzt78n|e~oenO>aGk)#8m=?AIK!O*uAJe{1Xtd0UBJZ~ zt}D0-hC2&fMZ z;rfEBWw?IeY8$RUxH^VA7hGM#4FFfqa09{BH{2j_4GcFJTtmYR0hegFq2Q7XHw;`O z!wm=5*l;7jH8I>sa3>jV6u72_8x8Jc!;Jyg%y8#{JH>G4gKKWM3&6E7+=bv;8tx)+ ztqgZDxYmZd23&#RW`Ub&xH;fv8}2%A*Bb76aB~fJBe)w3Hy_+Q!z~22z;HK#TV%Lf zz};-PCEykt?ly3@8tx8ow;S#*aCaK+Zg5Ktw+!4phFbw{x#8{ucdy~@2e;C24}e=` zxCgsF>?s0Hy4Yv;56NY;d+9!RXM<~MxO2drY`DJQni;MixKj+*A6#?8oeQpo;Rb+fX}E#lS{ZH-xYmXn z4DM9J4FT82a6`ehHQX?8?F=^@TzkWf0N25ABf)hv+$eCT8E!PV(+xKUTqnbw2d=Z> z&Ifmf;hIJIXLNdA=cLBt!71QEhHDNkY`7NSA`I6OT%_Szfr~O+YjDwqI~81v;o5+U zHC$V8afWLLuAJf8gDY>i4&dSq*AZL=!<`1MqTx;lSIKalz*RO}XK+;vcLunshC35n zHN$lQmteTA;Hn$$EO0dp*9}}v!*vH&%Wyrw)izvDaCHpV3tU~p^#)hZaDBklH{99a z8W`>za19OD7hIy@`hiO_Tz_zl40kTL#)caJu8H9Wf;-7@gTOU4++c7g8!khhDD?TG zA3kwFog($~@_}K^-3gzM7%xuy>YQFU9>(K*gbbG{Ic+ZtZla8D3*R??E6m>|;^M)5 zuMNxiJm~A_k7c;_)aA1WvD0f^LZ6aJrv^)9Z?$`^9j&Ji7jV5_e4cdVLRdx_y6! z_Vjzs@Oy@?gYWUt@2yg=?IpnDQXPJuSarkU_k`6n9DdJLHE{YpPUvcYbF%!pUUdD< zmEi@_4;k(n8GgO=!-ktF!*7s&gyCk%@EfHcX}H-ke4g~93^zxH&zF9*;jWe83#6}~ zWcY*9A7{9GW%xtVPc__q zGW=obrx|Xg3|}Mtbi>^*!yl3Uc*Cud;g3pRKL>*A|X6M1sfXTb%!=VE*-aQlDSY zzYbo<>-md=<$kvW9}=&}*F{plCpm0i=S$bm2hhGg-&*r?umq3uvsUKkQ^{fbI6q$) z?d$VDuAgBgc%2_z-Vr5uoS#wP@%%y8ueN^_d=J@Ab$kl!zgqSLH%>=DzZbYv7_Vh- zaA`UM`hCEq!+0&v2B(i79k2a!z)jE*(C-UQUuOVw{lV$$40Pv$yA*-c1HkFyANfFV zlMqNf2%NqiKt32;HUg=KfXgx5P;i$SZWy>+!wmwS(w@f?pWcNqIdR#`?Kii!s;V%e-(}?dgo&)!_wF11??AVIiTrr zEu?n}fqy3qF2Zp7_NtDK(mT*zG_)6ExL9y;hARiIyy4=(RWMvdaFq;K8C(^^RRveg za0%e58?FYpnuej18!;Z6g0y5Ty5JHv2ig6m?quHeoxTsLst4c7x) zPs8;B*V}M?z@2TlbHMdAoc@1<9-s05CG>FFAKE+DXm0?xfrc9dZm{8ofE#MKVc>=v zZUnfIh8qQLwBg2pJI`?EgS)_R7lOOUa2JD1Hr!ZnDTW&dF4b^p;L;5@9^3@OO$3)= zxJ$rYYPd{rlMI&yF57T9;4U*-Wwdt#xY35Y z5!^gux(mSVH{3#S=NZ#o1nvUE-30DtW4gD18*8+;7+k91ZUvWNxZA)@G~Dgr?vNUG zKerTIw$a|*;BpPO4BTYHEeE$kYMj4&!QE%LmEi6-+$wMd#{4}1Zne?ggWzTv?X3a# zh|%7o;N}|bJqB*A(ca_WZZO(=0^E&;TL*5vG2JJ@Z7|$Z;BGdiyAj;eMthsUJ!iOA zz`bU;S4-($2ls~2-j-6jt>CsB?QJWidlTGSMtg6A+hMqOz`bj@_rUEm-232m8SVpc zyAAgtxIKp33vQp`J_7f#;SPZN#Bc|}eQLNv;65|l=it6D++lD>4EH6tuMGD!xNi*i zEx7Lt_q`0)!+`$(mi`@`K0o{b?fqo5_hTvD&*1)NwD$|RC5Af+?ghjB3hp<<{SNLA z!yNYJjV0xLV+98?Fwxx`wL5>G?h&ccT@OzGE*aeo;2tyDn+I;Y;TC{<({KyH z>EGYt{OR98X*0V1^zWMV?}BcE_Vn+)u)UkXJ)sQ)yan7k!z~84-f&C6J!!aG!EG?y zZQ%6p)nGB)?cg>V?cD)R*E6$vd_IP3BDJ~(T8>;h-)f4jkbC^fFd2l zZXdY)hWiNI$A&uq?i0fu1ox@o4uSj3aG!(w!f=Pd9WmUO;Jz~4*WkV}+_&JqGu-#! ztmEzv;H=}&&)}^6^nc*2=dGjQew7;czu&<9Xt>|O{b4v4=}$q=uZBpC(+z>&T!ShwKrS>xDJM^4z8o&YJfY)4Ry}aGBsH87>Q4w&8NXU1qpk zaCwHy2RGSpQ@~9%+%$004R<-XD-1US+?9sA3f$F(D*$(m;cftTqv7U(n{T)U;1(Kg z5xAQScQd$K47V8E62sjJ?l!~S4(<-a-3jh4!z~4Ox8d#qx6E+M!L2adz2NRM+)8lw z8*UZ22Mo6w+=GUD2;9SlTLbP9!#xV_F~h9|_qgGn0JqL?>%l!~xDDW*GTcURPaEzT zaL*cU6S(IL_dK{44EG|qmkjqZxK|AKD!A7S_d2*OhI<3tR>N%rx7~1Wf_uwwJHWkT zxOc(5XSki<-Z$JXa32_MH@FWCw+Gx_!|emN-*6v+``B;?zfg8?HOJ9K-bhcbVaOg3C2rFK~H=>kUr7M+(U-wTE9 zoda&F(OzG0(+t-S+;qeB2Y0#Q&INac;Rb-4VYq?dt~A^raQgjPxc&x%yV_`P2)F{n z4Fz|N;f8_J?=Qpo8xC%k(cTDfvkf;A+#JJ=0(Y(9^n2Fy&u#R0ip!(dd(i(E((6Is z^6K>-)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa z)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg z(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa z)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg z(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa z)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg(CPIa)amsg&^h^DS9Kxyo>%o@a1n-! z1Q%tvXmBxxiv<^FxN_ji8!jGP1;bSYSIKad!BsI_RdCe|mjJH1;c9@ZX}DV8Y8$Q& zxVna`2d=*18h~qPxI}PChHC__vEiD4JIQcO!JTZlX5daSTytG^hC2=1>4xhBuCw9J0C%S0x`69yxU;}@GhBCYJq*_qTrb1*2G_@M zXM;P(aDBn`GhBag=NfJRxPgWn1a7e5hJYJtxMARi8*T)+k%k)uZnWXXfIH7{=YzYz za2JBR$Z!{fOE%nCa4Cix2QJlcY2eZgHy+#s!%YO2VYo}cU23>YaFYy|1uolgIp8ic zTrRjg!{vjUY`7`lrW$SM5t2X4OM7Jyr5xJBS@GThDJZZX_qa7zq#s|?robM*UT+rr=b-Ud#; zuT=k@U(fGv2dCdJS`ON~1Dt+uD7rhrrO1TzIv+aSyTs}159|219NY@2wH@u>3+_I{ ztpsrPlGk6);;m!hgn&G;EJKb=7!F4xWKX5$^*B@L@!<`GRm*ED0>utD!;QAPDhz!@) zW%~K)!t1xlj-}Ua(U(`noQ%-xwOB4BBlJ2gmecFHoCnJ>)L4!SzzsLtMc_snE*act z!%YM?)^Hi%QVe$qxN(NN6kMv|GQp)8ZW6e3!)1Zf>saaWNBh~}CK&A%$Z*~NoYeTe z6xV;luYyI5-&RTyr zg0t4&JaE?fn-9)fe+$4_>u(`AYyB+(mnb!^XT3h3?x#tHyBXSRWVlKr`I)9XRW{Gu%5>n>v;vZ6vN#MZk*xn1D9&JmEh70cR#pv!>s~0 z-f$0qn_#%r;H>rcAUJFNJp|5Le-DGR*54X%*7|z{oVETQ1!t|l$G}GzwV+W=16)AK$(k9bO)o+qNyb~lRC_Zikot?g+4X>gAl?ip~pUbG$U zKMU?MqrFWsT#pC396JBn-t*8Nj#u{*w3jb6`j^4!_lKc-1)P459J<%QX?wWcUKgj^ z4V|{TMVxN8T&Z6?f(XDy5W8Yr|U)A(f%Lct~A;^Cc||->vHJ)YkN(T{Cm0_>U6yJn}f5itJ(tG zXW9Vt$AZg|8kkD~cbVbFfy*^qD!4qurGd*gTspYPh8quVis2@Jn`*d;;HDWa1Kf1O zT>|cM!(9sQ3d3cBn_;*~;I1@W7PzYnmksV}!)<8d?`a{~;dV%k``=UG-Z9)paPJ!K zX>jiu?ip}94fia#_YJoR+%CgC2kryIJr8cT;a&juq2V@z+he#F!R-hT8(}pyA#C_o?Bwf;(imZQwpL+;(uE8}3bTUl{H! zaEA@|Hn<~(b1jP=586nL$Ab{KwuTFXYiGC!aP18j39f_TqQG@DTr{}T3>O3Lbi>7h z>twh%aGecT4%``rD-Z5W!^MN^Vz>(6x*Dz`xU&pb30ybBRR-7Ha8frhqt_HZX4ObJ~IfknRuCL*0gX?FwI^g;nt}eK94Ob7`0K?S>H_&hm zzzs57LvVu)mk4f%;gY}&HC!Wb!wlCL+;GD+0XM>MCxIJjxTfGn8SZ3oqYc*#+!({1 z0`5G+H3xUT;aY&Zz;G?WU1+#g;4U&;Yj77Et^nLMhMNg)mf>cDn`5|Z!Chy#x!|rh z+zsGvG~7IJ^9{EE+(N@G0(X<)ZU%RY;TD5iVz^tu-DbGk!QElFJHg#$xTWCkHrzen zmKkn2xD|%G7ut1MfZ=7Pz+!w*%ZehI<#>dxqNy?tR1U0{4O8c7yxSaC^Y*HQYXM`wjOI zxQ`8Y0Nf{rI|%Mm!?{2FSH$|h@_2cHtbKjG95P&n0_lehmkBOHoW3uw)6>4T8(D(W zcB5drdOd6XT$oNix|FUOIQ>2?{2r_X!|C@B>2#|b4!;kr1~~oRD4cFha5{hZeP~I4 z`*Wc0i}sLO=S%yI!1Xj-V{p9;*92T|!<_`KkKvkvJKJz4gFDA?&A|0F+$rGt8Lm0F z{)TG-?p(vQ1UJBNt-uX5Tx)QH40kHH!G>!CZiwO9f*WeMcHo8?u06QnhU)-sgyA}Z z8)>-Hz>PB8>EK2it`oR1hU*OOJj0yv2H)A#kS{E)1@@;Ud7b zFkB?KmWGQ0*UE6w;946l2HdHJiv`!laB<+;8m=6;c7`htuD#*n!F4cP1#le=R}tK4 zhN}ebbi-8!*U4~Iz;!lURd8n*t{S*A4VM6}i{Yw+>uR_f;Lb8!O>o@|R|{Ns!_@}Y z!*F%L^)y^vaJ>vy4_t4<)d$zda1FqnZMcTu&M{mfxW0x<0@u%QjllIcTw`$O8mZh=Uq04(5oEG@WIasP6&C?P&{h1rqdu8d* z4lfTacSU~=w&7u`j}NW9yz+8KL!DjG!JCx;Txhtvv&qa82UZ_6Xk+G(XRMUaC}tZ z_?W_b#S=J$Q`(A-D_h=Ahuq8&0k_ay>9Sp#yTA>11Kl~Um+R)vbe&vB z*Uq(}FRpIkn!9GMsXNIvagAJ(OLPrg16QAZ>bbhE4*k@2wdkiN{nVhJ>hzP~{Zw=O zQ`P&a;`pbs{8V!OPeph9r-D2F6Yq}yly~^U+sgmZ=l%cs|GWlz$mkU5_muuP>GzU; zs`PtHKTZ05q@OPRv!$=^pPnQ21nKvczJ8yUp1A1eLJq(4mhxzZmleSIHygw*rxOu&J>+y4LY z{omNXKal;q#QmRNw(2<&pEv2tRUWRtQFNbwgO=}er^C7CEdSztuJM-!(K$tNTb@Ty zSIzIybHCs9lKw2|*X0JOi{qK+KF>ULQL%nMqO#wwo9Opjbocua1%AJkH%E@nCHw{= zyt76}XAph^F?7DbT@{z;^((pVUO&zic>Nasth>hk>Z7v?zk&MBZ-CZ=*8nX~A_wR= z-ktl}@$A>5-*WWZn|`_G=PsU`cg93<8A@{DP)aBwMCX8^D)h!E^{Y@_g~nAOQzh~H z2sfspbNpO4mVP_mz%jqBTHU!BH-^0J5l^p;*Mz<0jG^b9*ai_U`oaho_hp2OX&32Y zFN}22chG6&A9TMZo$ArGkm9;UyO?L9UHLw7F81O$7dNiFi;j(V<@U$Bn1?F3=p7YZ z=$ncz;>JoYw5gH{AEOmev$_l2M$>(^rVBNog}W@#h5t%&?)(-mMBkeq{)Sfimewv@ z{Z!{>w|C+09bDw54lX>gqjT%KxbUK`E~3L(&Ta1IA{KRb;ewtnRJoUPFZXs)ul8}_ zU(a@-htF}5v3*^*OJ5htqZO9j&xN1t=b|1x*G0t9lk@e1UDVJa&K<~d;oNK&^;Ncu z$jx!#4|ANm;xZQ=Kr5i{Oc!-*rgJrJbPWx6F4DjTg93 z_XRFu!2%amX`zdFd!Y+`zL3`KA{TmQk#o5>xzMs(Xmc%g5tl4>p|#YHTjIj^EODXM zx6;PG&4tdn&ABGG(=so0Zp?iy^uT@2HM-x03hsB2_ulU!nyqq?Q&+k0zE#e3T1#!L zbrFLfcdp+PF5+N7kSZo7qxCZt)rtZYRs?B75wHxGkJEL z{^=q|{zcRI%ehx*cj5PP`^JRAb7DfFA7Vn0O=3gg)YwquBe9{-yL5kjTqq*5d??bz zhuqR?q0l?kLXpiALT*~CP~>N=LZJz*LlJ+s4n^ji8VX&0YAF2ksiDYzZ9?Hk+lJhp zcAix1Dm^Bv+#hIo@+0lw8X)FcJMBIIV*yXhaKo-theMAl$fhPVphz&==t6;k@NhwH8)GXZ;AQh$J6zc zzfIiv9&|Fr2|mHe9} z=8JA;p6`4bG;D%D-xrsdKfb(cC^t=V`u>@{o{#4aQEr~(W|VSz3F1PRduN3qJs;%f z$9nX;QQG6B^E%u=WiWf5*PFy^yT#5M#q;{%d7Lc%9vNQD!+9o8XFdJym0VpbC&Sqv zqTkoV>v6Q$bj0&~(W$#zBfh%~FXp||;8~Fi=sA}=&JCd4ddbnN0l&lb1&=Gv&8FOy zm-_oj9lGyzCFFRyHjz!v^m9oPD>k1poIRfx4k?4LN5`ff;^}p`-{E}8U~Yc^`PQXu zpO+o?PgW2=z*Y@ID$?$)g zpDyIvh^M!={LW~fAD5ZrD~caphU3^u%AJzuuc!HR-|KKXCpd2IBYRc8pX)~FHYd&% zKMzWv$Mu{m{M>$t6y@H?-v3S(Kez<1>(AOQZKR#}657%25-+|qj}zW5U&?yhX0;FdJ5Ogl{az{4Db4ZW z5cwSO_gd4D;T@>Y=P$pCA82`)FU}31T!pLr{kUft9`~~;*L$X)TT#mC@p|C%mo1V@ zHFL+$Z@(s=Fw39LEvAp4F-6bI_}pTyNv!yM7M~u!uhne6pIc|<2*LI{M1wX-u97*QMRUA=@%vh<7x>dN*Ne=D zxBrumUFds0#(7<_^;mp;%%_=~Le z<$WezZhl{Dtaz@yt`y77?`vHsIeow6pO$+B`99(sSksZ=JRh^k>v9~k{0YuOHc{@V zOy_JfS9Cji+n;h#xA@!fEi+eqziCN>?vh*!bH6G2J_t`QjdBYX`_tQF=88Ywmr}0p zt$r@UoX_I9os^p{xdL-~#UD@c^d`xRxB1iCVotC4^6~pxLvQzU3oA*m*nU;~{Bs87 zc0Azc*60aCDRS#6m$SjoO)%$^RstLczoy(W$+a+Z#rKycw2E(*oc`TXvHd^Nn_l7j zU%cHfq}+RwyUv_m@$I*m1~q!B?8~>EaziC|uQ|Qq+dY#0)Bjn?>EEFl%U9(6nl6<4 z=3mTbKIQ6d^q223bAKs5pKB<0;B`NDpSgU+x5FXIUAV>1)uDaB>q@bo)uUbgtQ~%C zv^l+^+mDa?BPe%~&dSbe~syj@5f(L?l;MGE<>(K zJiYHMxg}<<==MqwXT7fI_Kv?^b#oNk-z3lLX8`@y6wg!fI^2FTm_5I)_*v#xcQ31b zUY~2|_dW3)>Au%t`zJVWJVbDZxu*72l;bXs=p_g zO}Sqr*W1h$f4uPPimHjknTko(wc==k=d3$TgrI^zz{y0mc+-S+s zQ@Y>bc9X%pU-0XSR^s*l^^47)c%H9U$X66UQ-&Awa9+aGIYzlLk{f2_WVpBd^iaKA z{6@>4U^;1(`(1K3(Yp7#e_DR>7rf^`?&wfZqJM?_Y2s^@!v9RZf%v3S_$G87Ua1W8 z!~b9Y<-7j;^WNZf|FFFLy5eQ=`gaw@wx2Y^+igAhN5t#t$Upf*8fg8wt*f)=;jyappj`)}zO>UHQNi@%PTP4Kk6er|;|9mpj}^Va#v+>iYB=+x2g za6V)(uVFU|Igr+rPgcWLIQ3;7gjKgn9Z zGMv{>Ci!9FOWJfpKeZv zAAm*QKhC5%dbIetbt{=O=&#}Slk`K3R-Q_LLi0RG=4&8E92i63S9 zqSN8^!S8$alH57;SogXT_6yGaOu1oS`SW+$=~k}z^Gi#5o?qP9|MRl$yqdWyHofAx zG|DY)>E~AZsT1V*Oz`-6Oc009OFaMe==XbR@8nW0x78kRFK%y3D}VlIR{ai_O9rza zK)?5hFYW8_E6U*4Q2S%Vo9|Bq=7*o>Qp7ir;l;K~!1Mn}j1=Fe6ut}jOT>3Ch0i2^ zxp?z+pBztleJ&-xRJ{2*Tc*o?JNXC2m-Kg7?2nOOC|-B>e_B8MI{a4g=JSrs5ATos z|9f-Auae=#+CRZ@onMFlBDp3sk6wrS-3fC1Ja@3QzrQ|G%IWcX;ODu~r}{blJHq1g zNe2gcKaQX0=7`tN!4~r}eO?b~iti!At>t0gf&9hdOFCcimY;kV@uNz)9GqK9x${r+mt%u9UnkfPc2aJ) zrSO^LkBDz?`M~+qQu1Gm?`Hbq%dwMk zKS{2?nIk0ob0i(yE1d4H=aVci!+E=OARiY0l;vUlaxRl{Yb1B4`M556p2F*SCFNRn z_UCW0IX!*{#6NG~zgu4~#c!-B6DYPEMb9gEzWD$5V$b)NW0Eyrf#(_iyY)WePqw@a=k`00?;_rO zUt2scM;iGF;%}GX#f~rVJ`GQ2Ddk?5oc(^t@%?x^`Pd8m@&~2;*5-T_ zeSC4Q1MQ-_B{!gyIbNPj%6%=lk!CKi{mEC6*B9lW>D^>3;pf2(3~DEOyKWocs;JCTx!WfA(@QdQbnpti-r?=Al5zzT{oGhHSA09{qulBY zKX(<6=C0WGD|-Co=_QaIGS$zGFXi-FQf>g{uA1iOO7r?;2Knp6_vLxxuGst?KOU?h zzf8RS|7V2Y^Gt_m&})+W+ndOVrc*puk52C9PxqH6R{w*f*!&e=e(`yqUVU-J)~^irwjbSpQGD-G_!(s07f(+meuwKv z26Ovs==Txvd{pzgfAIYJ_1ZG{cv@%4W$^s^wNn}9Ka+grGPKXHUym&Iw`XaVcRTr) z%Ha9+>s{i_$B(S$lJ=AJ(oRX|eY~Fzpx@iXzaZ@w+ppktNlDX>mi5}lZ14Da4o|;s zDZMpaUJibI)RK0ln$s=%{L8r!^gCK|_W6JD=Jbl@T9SK(e*50)??)y5 zzdZY&>Gu@zZRoz&{lnv|3GGMfOZs~dZhr*%SZTkc$33sF+2jw%a#y4KUWfAo`wQnb zk=-uS`Jco}+Rr%0e`m4uHh+D6TZSCJzccK1KWD!WQha~lzq6Poxua#69{)ea>38_k zTWRKspAYP$+DQ2cqV$_fzk~G8l73(550n0d(jPDV9O-X7=Fk5`>F+-3*L{CG zzFf3h$+sxci|4Qm#rGK})zw)58qw9Nv40rq`KGf-QzbDHPBg3mppT1kl z>vl>zr^@hUvY_3i*7oleKS+ja``60wb+VmD$@ph#`|WRn;UPIc56ke2#ow0T`$X#T z{v9j(f1EJg z?X1Hm%XWJZ{0~)qzYd14m*Jaa_-oQ%F2nbLzd?qNm+5{i|5AKU zX(x2EzhCS8ub1P<4DoR?eu@k~Ci_={46iEf*OOX@|0$2NBxwI@8IJq)SXrOAU$2qj z8)SZ(Nqb{ue@~>6XDlN`@=zr949?zgpMzn&(;3t)U@8NW`3<9?qg$Tnzzn>y+tTut+?PPd28QwyCgbdGs;X9jB% z;ZtOIe{p`A{+>_Pm)6+l<=`_YT#k{_9?owEW4@}%@E2shE|vNCuCYHwTpw@Aa9r+1 zG8~sLTZTt1_SdtvKeCbE{?jsC*V733z|l1_A9@^4kl|az>v7>PdE?+#@%lLVREFOr zeyNP_Bg5B8?au`rTYrtvyC>|gmg9~df8Lb(1L+@-z8<&!kXoPjs>f=tI&pwy&`aDx#jtA|fKTP_1KBMO;`gqsJ_bcMwkiPC` zx~#o?pv~4TJM4SAk>GU{toK@L9NGOZ9gpMZ(9EZ^Am>sQJtO_Yps1fPuAM% ztFzj{Tr)Y2c9-*T9Iy36IRDe(*iV%6gheH_2j>%8_+=$^d*wJTPyhZvy4CSVWxPCX z6&qh()~kQ?DI8sxuOQ?3IV#v``&COAUsJ~8(L?ifWxTe%Y=wXCO&QMf#lPca_(RfP zC;d02f0gvly2sCNmi|$BVZKP7k1i0mSNeyf@2BWFqq%>tjr7ly{zU1&A#aSgyEWuN zUN3xJx?hI>CH*I)Kj;jsntq zmnV0$KkEIXSMNEqyxSYGd=`(oP+=+iyJP(2(*DR;zrIuY^{V=HAL*a?b+x>B`WMrW zZZwPEDD*mhT~yZjA64DY$GC!mf0b`OE7BG4B_wRX#a_!Z!zZS|J(d^5fSdj(7(%jD~)b`nCY*^q*;Ey zjr4Z~ju(6g{3vjo;2r0X)cly_`b(+#_`~)0QuE`M>tCei`}})M>S(FM@;K*d@%UJ& zdEIbbQEGlyk?RDh%Sl~FYWlBA@4PxmYTh?_9-2zc=c=4)q`;YIV|G&2U zxO})iaCz6!+Ye^8r!7D@E*f^=XCOlZd~wBud&s7stoN{9blWSZ zazS*hoY-MKF6=Riesji*ZnGnDM2~_Bu{pJl-;C}ts!I3dLBj`Rr>10PT%MlRJ3TKo zHzOxMBRlKd^yzNsWo}XT`Ma$bH)>ZQr46E97kFgYbR%@u4stcKdj%g;@nl;a8(HD1&`ZF*)J4VXMG zd0Ym~K27rQzCv1!+sYnyNosOVdTw5J7OkxO>B&>t5DLzhPtqsl(8$!3)QRb?V0Ep{ z5s5UZ;HW9yN^%8r3$woQCNL>)!tnI0wB+#_(AC4yskEB9Z;r0D$a|Px)}1%p$gHWf6_SUg z=S`lJo}8Ua_wpy^W>0mC++}^eEjuZFQfdyZ=82c`up$1|&Y^uOf4mMH1G~WZl#EQq zV`X@5YD&J^iQcd&d09o9$f3dX(8$bA<=`}`#^xZ!8=w zyA2QAj01;HroFZukJ?f=DsOsLYI1s3KJDlf9O~ET; z96hF7*F4vA9Icm2ho$Farlh9#(h*a$voa>QYeIwF$8{szZu;-zu=h|$mz$nRdsB8U z4xbU>R-Zv{;63i$oI`QiMUveDnva+18f25{uj?}08*vlT^ON1zae3~maw+bK_^j;w zsTmo(_OtlWf4Fi^ zZZ@qTddy~K9@{|0m$Btd)^@t{^JaEsV}^JEGIwoiVxT z?zxz8<0g+!&d8!IeqC&qyEk^c`y@7>)>$4sINft`lTz|iC%U-_IVrg`>yuJ0O;66} zhrr*prqH2~4lwTeIxd>7=$SG(lU94-@{G?+nc)72OigjmR`J@P1><9JX2zrp+Enyp z;}%q0l~G{N=J*=~MpN>2XdTz`eoT1nwGlI~{J zapBC2tV@$q($d`4=-l+Q$#jT&iY_>~JVLiFVuJfV zCd+#c^&h|fQ_q*xd7hH9()04u(~>WnOvmMn@foze@2%m&{?2esEN$Cl_c67%&1>)V z$9R&Haxya0>4RZ8)7|~mBHhk=>3z${^r`Nt*vW2h)oiydfsPV&87REHfORch;xs}xrlMu zY17@qaasIW=0~WzwMO2=6k4sclK5#P*J_=nbs!7y;dR8z5W!D!o8+&$Na2ZZpMU(H1lbfOs0cFDor?f zVtNX#`0_cq=~Ds&wwBLKAAbV4CjR&?#amY&59Si+O%){lm+0^W;DYE>l=vy-OQ7e(|tEa*tzjdBP_e%Ll zw|pay_=9e#i5$1Le6IVsJgsBzP=2_)`!H!aKgYPveUp_Kq*~`U;s-Q>N2nVKZG6@aMBiJ=W+! zLruB+DxP@jJyX$t{^1pJTSY$Z(k66wSB!MaUgl;WqFaA;JzCMNr@`yI!EbuEd%cnQ zxs%hA=~;sJ|EaXs(l+7a1RYEH$U3Xi_>@elOmKarNO#C=ozQMOg>6QW{HgS;7c*H+_adwNc!VR`P3YRMDn@RyyNL4%gj3@!IsdysDVXt}PM zccgL)>FKBN@byMDdHTAM=4Y!XGt=qR@}p|mbOisN8Ywu!GxoN3``({?|DKtAZQGw_ z@$HlJvCBxeo&H8U(#@L}Nw;g~^X=}1eEX4i`xV{NLENoPNOr5~`NKP_dLe<%&fRNt zOn!V3(<3)C@=jhR`Nsr0z`I}RY2k0ibjr!cwroBjO6G&V zd!#zwb-z^iw$suYw4IXOv6|jl8$Z|HPgC1)3r}Zq7N14aW6gi+b01Ytr?zNACZ~H( zm(&iQbsVZrOF{wK_wMK0{SWi)pL9#xz|E||TYh&f-skyjyaw%T+i4QdKEi6wqkQ|2 zcROz_C1^)-yJ}=+XJ1OM+g8=2XSwwJbhoa~c=uYJRQG8e-j~xda`_e1O?7Dxr_+_s zXbQRc?#o(q$fSL^pr-#!wxkZtwtx3YlKg7WtNeqfw^uF~dUxGO_w&mt68&(&}?>*39!?wH%^F@mIdTTJqfYHTel3H+{UWs9$PEx(6v5>2@5Y1|n%k z%FL#7nmcNF&%DcOrMQP{@w~oED`E>>|2NXT>)jR{o$bgo_8dxWyp~7O4wgla2`}|q9e!xuNaOa+$sP6j&?)n>dcFPgd-q_&;r`kA+YRZ^@e=)~upe-r)$2EW zaB`+1L7mvDZ5 zetkOHy;_mxeEI9%?KYZnM88ozhS57xgJ}tdrMq|P2j7g4fjb)LyAv|t^9J-7NS~I| zIyv2aUO$gsv$Rfjb7|l-I#;6C-t>CrSbaJh&Y$jPHlRg3ScxV&mu_8Teo8LAj&d6t za#>MIGbLQ4(Q|VBewYu1_$_R+F@SbXVYuTv-zdh z%etkGk=p&Ir|8y251Tx0y8ESJkKz4>yP1hY+}y-IlTuRi+{VOn-1CY3Q>LW2eTlT> ze{tk{@3!D?ZazCNW171yF+Dfa9ZYoLo+)`5scubTpK1AY+(}P!Pf%(zNy-*frrXVQ z%P03aZbxF)plBb#F|$7V#B7 z4=o9mi;F84msGLQwV}c3tIMyC>D6&r==ac-?}zRPoigh6@b5XBtF8>K4o6q0(78#U z?!&s)IK9y-n%hT07w0`1`Bu~^Ju2>s+z{%TIG}yE{wEy_ZH!nPT3V@Eqx0TsH|gXH zZVz2nuJwSC=QjH>v?jbTRPMAnG5ce7&>|20B4S1OK=?r2&%>SjCjT9}t>foD_&2563!y%Jral#VC{(3QrP!6>x#4d^7ayh7H8(UrT&-HX|A7rUDen&Mx+=IIA(&grYrYxegEi;%^N9J9*IM(ZLOxh?UO(r!MDki|KDfUOqJhDh z^ZNNoej|d{zt);>4buF9)6eU*iS)OJ)|wAKeg@INV9j~`9AGcWYpwa<@ssnx zn)CYk!V4s?wdRA{kMqHr^ZL2PT*+&#`EjuP!J6~>`N*to!C9k#S^*ZHT^ZW;E z&gd<6NM38rzYo(7)|}VR z1%D)Ytu_B9ZZ}LrPpPwP0GaOBIqFC--0rg!_KMVC#uLEx#=eK%YV1d9oK{CCRp?OZY%i(lGj@E!Q(UM zgEi;%^P?*zueIjy@uq%!`oWs>`nl9SlGj@E`Z+hQdHTVc^ZI$$7+Nsi-?V1W%O8Ax z;(V~?ync?htK_xTe0OStJFYq3oeS!?=DdDBce>=Y=J7oJP$b=OpME(XtU0fr`+ZFE zT5Ddf|E~F9&3XMiF<-%@>**?sf79ePNx5*-WR zKeDO6fbU6O>(b`+^YXRg{rT5g^TG4wK{PN}^YY&>(@&MW)}_ts=ldU*yw;`7N1W_0 ze+Bx$5AVNPmo~58N02FbtxKEN?>X2cd96#64<5fORV;eE9uD;dRP*sW8s5LrL= z@|Rz0oxbeeg^wStPa~fwj}7jz|EKxsM?Nj!hf~e-69e<3pG&PvZ!7Zl&|2r`G`>R} z_jrE_*1SI*Y37Y~XGmUa_Iy0#_o=w!9_NEK=k@cj7fN1h_M8ts|8PE7b6!8s%WsSF z{A;awU4LA2K3H>JKL@-(@>*-29;RNW`C!d?{rvEqlGj@Etsoz)Ij^5PzF+cMYo2za zBGV7noY&7AKQ4K#H9s7lkAgMl-)QZ(zf1C3YhFLr&-Ea>3D%q+)yB_%EqSdq-;K^= zxYK;F=KPY={qeQvjYi&nT5Ep4Ke{j;9&6&bL`U zCwHmT2c(`Xb>*l12CkNRt<={`{rxlk_*-k*M$yj&!zP5X$9wPN) zT+^E^2jqn5d9LY8UfM+YJMdPiS4(|R>a|jTBlSk9|B!mK)N%B-JGZw*>Y7sTkopv< zcT3$_>H|{qR{N*p?Evy=-je$_qp3d8@&5_=-hf0pkn#SmHMh^lyWsmxyuSu(-rx26 z2|7t$Yt09bkDL$IoY(I$7$|wIHJ>EQz%}QCHRtvF57H&CHG7`_A&?K&oY(J5xLopD zYyJYr2W!sj_a-cqyw;lU5BXrtdHr67M z=f_*+JN?JQQK}Qga*y-D{i_1~$3<{|8VL1hs!#NMKK4w%(T4O`PAlGj@EGaw(VIiJwW2L~muwdU7AK3H>pv*h`}#rvPu znxE!BT@=oLu;zTHv;7Iwki6EV&9Ck2=UYl%Yt3H>(+}1>{rGeJd@spst@(Yh{K1;@ zhb2Eo@>*+tCFFxO=jRRZL5AeD*1UYZRpI&z)|{_3$j{G_yw;lE0n-oG-uz2`mCnD^ zn%@rjV9ojUa=?3D@>*-2_X+N}H;8V6HRpHB6UJW2Yt5eb|3&o6o#ulz=O+&J$A2$* ztu-Idcc{~Ru;zUJFn@duoh$IXY0aLe|A0TbFdwWrUw60<8cAMj&4>98b=(_7H^G|o z^+$N4T^Gq~&7P;gUFe!0_pu;zTqh5q<+B(JsR3-}Ionh(~T|3r4k49RP) z`7M6DFdwWr|KPjWyw;lEUC|$}`C!fYPFMQl zmr7o1%}?-07fwG|bAFlRACkP*nr{L5V9oihl7B(+T5Enf zSbNi#{4Slo)S3@2?;si&tU2HIYJUO;C9k#S?}h0HYtFwX`ClZjwdOB@e6Z$x*8(3z z&>!CL<4T+!J6|~clhJak-XNLm&0S>{0D2!zbg4;$!o3oIeznn`C!fY{&)Hy zTk=|KzBS~7HRq>E{&LA{t@&#pAFMh5o8;$9UTe*FhJ3K*e7n1RuvGF|YkmpjwO&Qu zdwqLPgeRWXS}uJ2hSUe7-a~bww8g!jcsxDld}6%cg0F|eb&I|}E>HD|UJt)6%kwUc z=f{KAx;(Nw6>iU9&FkZB$sdrs)|#&%%fR&@x(U{t-zWLMB(JsR<>6E~{b0@cuOwfu zo9_xRvT$!o27dP~XcxaR2xYtFZle8u|y{-d?#>22X6`C!d?{k~QHI{|+D zXs!8~kPp_J*Y9Z^A$hGeFE6(W_y1tc`KrtO30x(4tu?<9rXQ?1zg6-pC9k#S-X`FlDyWMr$1xxI<7e%tU14Kg+G3({l9lfUTe))gnY2({N5El*d%$aH6NT`o_?_AyncW17n0Xn^TGAS z`C!d?{eIu-4gKw>wdRA*H=GaFoIkq4pa0&H*IM%_u>8TA^JC-$^CHP>t@+^jBTqkA zbN(gCPm{dXnooe~2W!snlKf)HYpwZqkPp_JkG;=FfwCu;zS<;s+&0}L=Q zK_f<`iWMy`1tKa0P?Ny0C<(jb0%Mi|qS;JlSd>6;l9=mdBDP4iwJz1RzP46vD@CoE z01{lPsJtx-MYPmT9IUAe#HHr@Kj%Ep%$=JF()Rtn-~0MGzue6IpL71t*`Bj6Q?ISm zf06h1G;JvIteE5t`jxgXWO;&xf1mEI$HQaAM@o;CkY`PgFmS5$c=R#t|D~tt^bjom z_t(~O|E-w9|0MH^m@ioPXWRHzO#HtxKgfK+!uQztR!sbVF#mSu3l_e$y(xg96%)UU z`J0$8SorVS{I_Bi{$Fbc&q??h3*TB_k^fdq{2P9w`FofzSoqfTCcYIDzn=MjXTD(J zTiZ+GTQTt?%qQii{-fZdzF^@8Y2n z3;(yhlKECl{PoXh`wy8fSoo8)b-ezvV&cEfeAnq({{;*Gd>h}2iSK?^J2;N{f`xyN zjc>)o|2gx&%Y4DY|IEg>V&dP|q8&_QzF^_k+W1yX{F7U?gR7Y@Sor^K<6ANDKVp6b z^92k4P8;8fiN9`(c5oB(1q=U78{dkF|2XsSV!mME^Kwl*|E-w#1GZ`p9%jB^;ZLO( zeCVqH|E!q!bG9jK$5YG~OzxqQjvK~ld*NF#@n8Bv+ds#A!NSks3Q+h~OngrtvT-VFKcL0O!!LLr+|zvC0iMtMh;j5N=l5J^B=;`{0;lX>aQJ8+GPN&{GM4atM+ZM1 zJ}W*_|K_hY|2x=!`+02n9hE1(qx}~w{`aw^j}=q;?(3@q_&oCk3*S1QSO7ySCVq_h ze`dbmqvdxp{}A&93qRWyek&&bv-o#o+#_`S1q+{als<$h{8mhS`Tdz8%oi+tpJFHY zR!n^P-I~*wFIf0FHog@T|4j~m7V`xQe~yiB#l%0SAGvfm#xq~A@GrFSt(f?w%)gZR zf`yMEi~0~Qz&|S{{u<^NGGDOp$J+Q-O#DsEZ)Cn;;amF?d}g!hFHP|C!By zD<=Nx{^Zi(c$)cwg->OgKJ-QYTQTu}GC(_ci}`}dlyvQ3JoF( z$&}*%vW;)W#FyWDTEu+8!iTZ?5GMbvnE3KLQI*UWEc{#>--?OfcnrC8IMy;>Fqu;L zt^Hy0--?O9f%*3_U$F2mv&G+viT_>(xkSD(U$F2uDceN;TQTwPJx=pqWWHeGTgy9z z--?OU?43;z-u--?Of`*?DRedWv-EPQl3)Q4~Z{#h~c&tm?3<_i}7 zJ2t)*6W^0bE**{l^92ikv$l@cKUPfqZ6|04^~@J6{0%n$t(f==_<-PT%oi;DyZUMY zgbVP`ii!X6sbqtBDCP?$Q!0PQk|jQbiEqWk?@JfS;PX851(PZ9zfG3-5GKAA6aP%+ z?`OVX;a{QH3BDB*|0d>t!F<8OFE~L9AWZ&SG4Xd!AREkEVB(1CZ^2|r;V&mkdyH1h=u|56*@iiv-a`8$~}Sor9cs1IQZ zzZDZd<6^QwJHmXyWJ>z?Az9)>nD|yq{60Bk<8XY!e8FT&{ByK*oNvX%KQ~u9aGwMB z7EGqZzZDOC2$TO-O#D{n4`IGw;al~E_*P8(7ny%1^92k40_A(ce=8=wGml(4921!@ zSopZ$Q+)`N|5i-=MjzSW9uejXCR2+4pKW|ACVugB%`aiTVBzm1;rI|H|E-w#V=f^Z z>>FafU@|5D*JMrnhcNkX#l%maK{n`zF<&s5lK+3x)^WZS z6aR3&cJLtc1q+{>r#Rn=iJv)B^PghAVBue*t>b(vCjJV#hzy@L<_i}7{(;Im&bMOX zFIc4cZ!ll5@E2?AINyqi|BPQdILLg#!ncmM3t(u)#6QgZ0pCS>Td?q_>EOrxw_@U7 z%n34-`GSS-xACo*_;)jZ4D$sGzsttAV&ea}kX$+(xy%SoqI!7zh*JijNfj2O!TH{>Ok*g@1J& zNyfawxjOuU#eeJkFZpl96#lKuzlHgNzl#4uxTpHk(Z{9y{|Vz9#>78T{2qdPYy2Jo zP8C1*T9Sl&3&!a936}6JSGI}%mK9U{)-ZoP^92k4cQ(Ei6aRvn$R*k><_i}7LpHt@ z6MsMRA7{Q`;SaX)t(f@oyWd-xFIf0cYxN;qfPYp@eEGfbmzXbD_+A^|iit13Gro)Y zf`xCbAIX0!CjPiExkSI7`GSQ{eK7ja7xAr__*d6!2Y+Y2U^1oh$;%OOz7-R{q(Spt z=V{r3h5vWRpbug4--?Mpr;%(hZe+e-G9~}5^V`I?V&Xr_{1MC-Ed0YH93R5Ow_@V| z{ARL&9x`7rnUenxkR?8ZiEqWkzqE;LFzjc(U@|3s6ItRznD|yq{MVU3hxvkq&(ra7 zz7-RHzd* z<-Y3E7|Z?B;~2|*()o<#e&}l$%YDy5#&UmiGh?}r`Dcvfe&y#F%YDgv7|Z>~hZ)O# z#>Zl!fx;{I6OUjl_YGgnSndzLnz7smT+3MQ_kDn|+}FF4vE09#Hdgy5_vwyhEcfG9 zGp2iQ=yMxmxxe9KY{%oc3StZ_Q*Z_py#F%9Q?cAL!YP<$ljR#&Tch0>*OxW<6uM zPxB{?<$lbk#XZht&}SE8xxex~#&SR6u<<%Pf8ha8K4ZDRFw9u)BYc*z+%NbEW4SNz zk_lR#-2ZnoW4X`ozZuK@ddE-H?&ZF`O2%^k-6M?UK08{dqV$vd>3odkzPa^`<^H&R zjO9MK@fT^n-0yZLW4W)bopB*gh)=v&yO;aWW;2%iysl;}_j4^}Ecb2IFqZqX)-aa) ztZrv4_w76^_Q)stY+)?-;k?OM?zj1XvD{bV%F*GK`)5vLEceMwWi0o@EMhG8p_DR~ z`%RWJmitO>VJ!EL{FJfWC-NlYy}1tcd6BW)_wg2ExxeF|jO9L#W5J{RmHRc$WGwe( z@|FXl6r`z#hSmisAgVl4Mf+%N76RPY>6F_!xvb~Bdy9o}aw_cgfkbok`{g;N;I zeG1u(<$i=&jOD(AC5+|#`i+d`Jo=rC<$U=s8OwR`&5Y&z_nVC6Joo#I<$U(1jOD!b zz)76GwL1PMF_!btqZ!Nj<_V1Dyz*4BU#&E@gaQ zi}rsNW7)5_k+JNbdw{X*hx-*{*}v4nSoRbBfwAll+QV4(`y5~_`*%KJEc;Q8$3T!^~`+6vOc+pv8*@NFqZYh2F9`;^<&1eUi1sb zvfi?Vv8E6=Hx4tF^@?6ob$n(0;dsWfo^TdpSs%E7vCQ{RV=VLcS233P z>{7-uKOJN&^UXIgmidx98O!+i=Zs~%`zT`>ziwtMdxOV>!RHUflC~!H*cr`ob@S&-PC;mi2{K8O!+VEygnbdY|y|81KsXOfa99>T`*< zm-UEr#H|5V!#%GdH+{;Bb) zjIUw$V;R@6e^VLfI8X`Vvq1Qa%fvn7Rg4|1zw3n0_%3nJ_z}h}?B8?3XLZt2Q&1^N6oAmh*ry#s#X(%X-sn#&TcR z)r{r-uqwuKA6XM)x!>#_#&SO57mQ^;*$&3CzwH2HS-<~;vD~-P#aPZWq|eszk^5{$ zFqZw=lNrnY#d(ZnKNO9tNIzwN(v6H|zte4uW&hTLjAcL8?-|SfoL3mjexY|5%l^&7 zjAcJg|2f)!*`Gd&v7DEymh))?=IZdudDCw(mh)R98Gpq5JjQZ9Xf9*f&s)w|_BTfu%YOL>8O!;c z#~I80tAAuH>+2sdmh-6T^K^J+{c|{DS&zPmv8<2JVJz$2OBkQR>wk5O)Wqso##_{!n`8vF^eleJ_tVf-}Sk_m@GM4p4_%>tNFO$t!*5jr#mi@3)k5KuO{e9(( z<-E*|jOD(jTNumw=N*hcxKHbA8{-3vKVdBQqnvcP_D}9>xrnjczp|9E+$Yk&Snfyp zHDkH&XeVR2KjtIGavzX)f%Z@CCmO?8?i(s(EcY)}GM4*L)-iV9ujBVq#&X|8D`UBT zVJ~C3&*2lsa=*mjD>(iSXnE%_misTJGM4)^t`W@cn;2ik>HBNOa(}@e8OwbLA2OEv zd4^o6{g?Zm&SU%smN%cV+=sG~@gBB+fU(@y@*Lxb*#2F{av##ijOBi%zSt;C`X=`c zoyu75Kgwb(_ZdxLEWaOc9b@@DhX`Z2-~S25@_P}x8O#0shZ)O#{HI*4!y~`%Fokg= zr*{!!`8}B%8O!e*eGeGX!Jqy-tg-G4!f2}v@3Xo8*k(U?VY0j|8=h&yi#3k>S8KE1 zV6%Tj<1`8H3pV?MHv7*s)}3LH1}{?Ki}Q!s@VPeZv*EcmT%vJY{&E{OZSKEs!*|;7 zeKt(;N+`nx$yw`@`v*9mo_!z&EAD4HU4Uf?{?*Bv^o@~Q2YcA+6{=IMYQ{Uw&M9e5HsxGWvIcjoXS)i=4Do{OYfs#5oP+ht#P%^nNSU74D`9N}% z58n+eE?-exUbJ+{l8UmT#f3|Ymj`Ofm(^637M2u^$_tg2m5iER5e!t92TDo{gMk_w ze`JwzGADo^d#?$kwwzgXZJ;<<^WBQd>hi*}Q7gt>;J@I!QI@DwI{d|z{t86ZUtCyL zR#aGgo#VS#B^(S({08|#n}zyO^MoP&{P-~aljb(Vn$jBrHlyOoP({#YR#sVD7{u?O z=LW~yZ2}cbf=j!bTYfG*x4OD;Wr9Z8G^{32SY5o-BFt)9gP>YHvf5P_RxAnFdF6#c zCG2c#>J(R&SCy8L+myzE>gvks9xSIXL8b(Xk#%3~;7D@DmnH<2BM(Z;N-KI2ncD5Y zEhN|j7KBRa(a%Bob>rRbIiBBfmcFtHcP+tgfl%1ggpkivyFSt@Rf{#jmrQ ze)p<^xpP&GHzJWbV#G4f9HwfynTxq3P&pANM`G1fA&vhf$9XIN9WUanveNQW-O?US z@ce!i!14bot6C>)+}Gu(^dyzXqna-qUxSWPaZt6#N0(BmM5-$0XyTEI91o8rD1LeW zH+3LIwDU-%jyj-zKL<6ptnB}V)U!)H>TrEks3hI~Q-Rjh$`7gPJVntDhZYpR0rud|w{}1GmJ-8zB-x>^7${21` zprUw`qp+s9v~*7DLB@RFJixXIPOD*Bid8LCRB;|LF zzi1`(O}e`+FDgz5>~39EO|u-qm3s0ZSSgA!X^y|ZclnIz1wMx#@401FOAFOoURhzq zb?R+WMXR3DKTkL5bzh%7TRz!q4KuG7@VsJ=X?PIvS%LO;LG3 zYA5;c#;4GurOCh0)jKyrT?R0E^8>XkHw z1mB=9YPeZrc~`=wLjwXOBa0k<3Iog6G0sXt=O&>sj3n?0F*FplhLx~#9Cs2@YF_p= zr~@P-s037`%5<*yq1Pw}WdRJ{#GJ|nRT4>ts4dC7BCwpMUy>bD*+8x(3<rHBkrp7nc<-(G?+j?LmJ} z4r-PcR{1Mbj+c~T)}x|0fQ&_6>W&xHw*Ja0tr9RtW~xa<9wCxmVYZW618uCaKUf`r z3RMSCtrZ2Tsn#wpMEjv(paeFHp*I1{-}|oP%~*Di^8Dk_EDby`X|ZWf_T$TH!ja1j-QA1q@X^VCgx;`x|7(6^uAnZk0J} zASTlIjhcRbg&sq292OOY7BjA>RFnKj9BOzdkPb>I1=wy$b!Dgu>RuHLRYTRF;((kF zXdcmGQ#?g;k+p>tP+qBTAo98ZGP<1gSOk<+R$k{X3M|EBoET~Kpqa*UO#5lwr0P$5 zP#q{EkI=Lyyn|e;VbMw~hiLnv(jWq=-=*ZJ>_{q9+8$+r%8LetMK$b=6f_+yEAj`* ztI)&YVx_ZF%jNV&eeb84hRP7?ZknxR^TjBvewrD!V1Cv5P#q`gvM9YET+zk zf)MKP=OK!h6_%;?cI4R6qtVeI#ikNh1Du8437VzC3Z-fz$Br4Dt*iLSy4I4`d`hCq zBE3-k11JgFudhR$P0_G)+Y_2k?K4$UQbhx+k&8}Yvb9#=-EE0mUAkmxsur2@NaUw> zqg29=X6Qm9o3VwS7IZevLa zDzB*emf1%L6yqMcAmV`@7p5G2Bs(EliF$!*uI{6Z6k>F;shUaT^(-lcUvlc&fGXXu0b@)gTlC#F2$D;15@mH8ms0jHP9*S$T6uo;UiubE&JZ)&##6?FOyO zOUvO`(Tc0xV%jPp{i&LYDw=~>%r$yp5Zf^-9HT-t)uT!)ipxS6E1^0?cWD&&daz)u zDiWJenqZ*>ToL$sw7V1!>sX09jXX%9Qh**Ct;||v~+o4bqTsLw8zEIg9z$Fq%anb)gVyyF0DDF48#fbfmOe|cq#TDIdrF9 za@XppTi7dU+QTZBVxMe+b?`)Ha}2ea>dV^VuDbPF5lSjUYPL)(N1}A9$g>};0{Nt1 zb4kBukb2Ek9!^0GT(fi%8l912vd4|nMKSobsL56Y;{}lhBPD^d(24*>u&NNv``00g zIwDfrP@mTi9p~P#>cU8tf4 z+q=+R)1IK-OEO)G35}9KaVhrp_28niIB2m`(+(IxmX=uNh~m3Tsw%5OWf+_!rjJOd z!@oE{6GbZ3EOufZK#-~sLY{5W^Vh{?g*8||q6H4Cflkjv^a2=%P-f{C7^#jbUgYW& z)_$uolk}2QXOpB-hNywIn%M}@966_JQZ`vfI+#7J4iq9bTDqDa(G@C-szEOZkx}8d zW)f+HwKCTJQua{~&+1Z(OXwI7An7NCF-BnMP48!fjo-Qa`mv~ zg6wgatJdDno=cfLOV@B3OhM=hkiauk0VWyb)1*nH2|3jUnEaLUW;HvvyCEig3zwC~OKg$|dq3PRJJAJ)e{-n&DO`p*rUYkJfR@0MvA=Wj&^_WVJ ziHM+#kqGpH@!HoR9V9A}6pSt9O-&=C@fvw<7Ou@z-xr+ksQJG?LO~QH*3z5#if)Wl zB~&|=1<+R36fTCIFsQ)k8r0)xmvmPWy%p8T#J9C?8I*orLYi7Ep_S4lGz2$2?> zaHYC+Duf9$J&vtLg+_aHgh@Stl2R-~CVC*;Y9`#!ydQX#8*us+})#jPV zLd#rTsst_+Eb%|FvHzRH63K^>{wLDZs?qwBO=1)EA*YgHX4BvX( z7^-Fl;tp(^JbN-{(*Lr}pWke_)D!R+ZT`C(F7;sGE7tt2i_%9}RsRnc%#(aks{sG; z`groncTWr5-PbLVD*yUQ<=0`|P%mEno9lvKwbb`jD{@IIXR>r;Sw#957sq;9rxM9D zZN%$Ji8Y}A^~+61xlWXN()Xz6_;@NV)g=r#`1Q@HohwYNscjsq?JQ_#M?gC;wNkaoQIh^gSj$Uha`>q3-YK`R0=zZ#ALG z)33T2g=CME^`Qd2v!?qUE810J@)}EO-R@!0Zm_0=^`xHdlkQmQeuoJKnaSNPIUO*K znPT&rc0JVM@4vWAt2Y-ErMh1Q8!K#gp6TLcIWMJZr5+k8 zZI|j?SBk?uyhgwaHMT9GS`uv&OuTqMqV9bvC>vX$yTD01?aCvBuQX2f6Z zCzbd_R$^n5S{Cbh2MMjfTa$|8s*UBys%?+0>^(@#1lSw|;`?S*I7yh^{;7M)-8K)C zgXHypGD%9-gaI8$v+hr@*u=LuB$=hyhLG$T)yy1k?6RYlFKI7Vl3C)!2<-?=br6s@ zv#OX=hnKc;*>`9qS=#n_#qDaW8++7FUu~7xDylV~wrHg~$fo+EJ?v0acBC2{Z-sl@ zz!l%B74PDv-qVGAPqlx{zEO+1hp(GO}!|j=RI&khnXQz)6Q6yKmIA z?K;JvmJZ=2HidWF``yh2IuSbQ<5cojOuOxxQf{#ov4;(WY@Kx4Q@3zQ+Z4s9+g5B# zwy_(F0<%d%UDzPi{_R9U_PpsbKG>lhImvrHRXmahr#j_0weI7sYSN?C7^e5qKH zN`Rh)S+5NCLJpByCZSd)jS3bIMaFTAi?oA=Ord z)Y~2ORtD`)_stJU8!p5Vw;qxM*jb@A@K7%}VMe+`J4aLPR1jl*geH0Cs^X!H9&vlC zI7%fPTxHy&@KmHDFlg7KHCjo#ASFrke%pkzRQqocFts0*IhJE&G+Svs?VGe42$dgB z=&1vHM|%X1ogeM_zV3I&=(I~Zc3DVA(0Df~4h*7J0{3dEt3LaW|N&{4? zbVG>k%&F~6WWqzMW2ZOZiR!9h|wTitwx!djgs zErCgN?GBLN6s|;u+YgebIBDMFvGJohbuL$Br8v)>2!uG&d*oHZsSWhqT~G=8stQG< z^`QG=-9wEd)^SCV{~892TrgMNKZT=eC6jTS zrn*!eRlGESz42-`Lnd7c=BjJ1yO~Zd#i1hH??LBZYy=;jbnRx!%fhLpvE_8Ska%wV z*4acDlGc>Fi7rsx+iu4CBJys=bNR@R3bl1!rC_cw{PQc8y30 zWKy9zhD7G&HB08|83PNN8$z^c6l*c_FD_jX!mO4uLw}a;wZZ}CB!d++ti_or9W?l* z*7@;GRa(hPTy|Cy3>Eo{=&t2zbzA>8|Nd8{z{{V#|0Vs50{svK{al?F&oBEq91V_i z_2VEr@go#||2*FU{N7N~=U)D42z(R2Hy+~C$L|l~Fq3}QIGO)II)1yM!s(#z_zz5w zLznuE2Sr4oT3KFHS*G*{CiXB4#qTQJ0(1I~|A+~&ySJ7>VWENvI<@Z-0 zA9Qw9(ZZv@JAVW@1mEgA<-ze}j*s78R(K>CBf!N^$~frTDucpuDha>`>A2XM8TN40 zgIfi6^lg=)$o$Xmr+tbE6T1w@eQAydiHz@_^TM8=$?5Uv{b`OBkU`%)%P7KO$;8JV zj?q6$b8Kd7s|?CR`Oy1P6kNY**2NUxkHT}xPyUwt^sp0Z_G)Shae*0*bRrO`_#P4t zzBL_D#!0IBATP>lm`?_F8J@?|9HbNUeIyxlWK=$O8Rvm}4J_%~Dg#EAaOg8!>g*{j z>@qg64EpX_2E_$(mO?-Z86SgN2Xp%FSq2V8>dXAl1Y_RLmM6hqr#WUp27Mn{Mj{|~ z8QZ|U3;9CdJ1a};)==+E==-7-psE5-vwlv)j?#GZp-#yE~@pouCN2QyLU5}?Z+>k-v zJ;|V=KwnWp|X?7O{G z8rf}6f&uw+!j~UBbLmMJ&AID={y&&Mq@->*%+kqm-~RO9L3PtLc*w2FhZAy9vz_Do zSAU@;o<@@_zu*FyB>z0CeCIttPJLNVS!vNIJo?9AM&^w~$F;O51;=rq8;3f_BXfnJ zIaH0r<8j=Lh|WgG5#likmky--wV8NaD8H?4ApZz+yzebdvIhnH)=uJbm;KtDwt-qgtrY{ zi~%=ck+J ztv~y`+l&r!)A4HOqJ+G3^%_2ysUp0TzNJrG!z`GgC!9wXEf-Wi9+y z14g~F=vk?SrT>coQ?mA5mok#u?n-lbH|e~DTRw(nZ$LA*1Et=l+5UP%9XA+sOCyn?iNu6 zu)KL+mGrY|sHLa!I_ywFNf{rro zrZOLWYbhl}w`^-j?fNl`>l9hwBbH9HxCg62F`F;c^5W^gR0&F%{d#1n9i~rl&}?q^n5rUlIt9}AvDw(b zA&ck|aWw=rv>0u{QKm10@?)mUY+g%lxDcKX2k2~2M}xG1)FJxM0L$UKIsk;uk>l2A)E^CN`9tgSbj4FuQR_zw_}F~weIr}Y!3xn zx6;>Auys_TIYfS3h46w2p$=~Y`UdDOwLgGZn7$^XVK@Tc){ue!2p){qLBYufOF45o zHbjSz%m(Vapqip^G`A;QMLSE#)&*OteGUOdo*qF6I=GYU@Lh**s8mBEdDGZH5gunM z?~R5pzJ%NeNjD-6@?-uw^X|Wr2UjC%8N;JL0NK2q97H0S@uQP9_bTyy(v$pc6T;+^;j+|^djx;c+ zySKj~6Khs|gp^vljr2`bxLS8MQSzxM#8X1`FC(=ZDV3l50j2J3Du>=6Zxj7z(ht=q zxr97wrUGJaRO`l%?JcZ(7dCDN!Ak!nQFt@a{# zaJx!25`~0+0w&?7m6inuneqI1t)3#I%g+Q~hqu1ypIu$i$#9I)9X{w*y>BJp&p$%p z*``}(YkL~5O-F&+jYNt5^QXw%Hlr2|Y3cV7bJdWhb9u(J;fCmJ2&US-kgTELR8kSR z@f6&Aw>jN~=%kyq8Ig%Ms))HJDHWnvsp6&jp3&uhK~Orof^*Hr!5gR~EM##c>+gk> zw)rqIYtyy34w7XX%CsqGw^@jf!z6Z`nctzka;cn}bQcv?sr6(`b&jrnbkv=yAZIqT ztUM0Gr|((g9W8`R!*?+Hmj~i0Q<3CCwR@B@W632_MhQry%rF?oQzpZ#J*ZRWNNJ>c ztkDzRjHl5MN{i+q@>ka>(HE|vG@1jGBc{>)%GpK>@iv%rOQTbu8I(rnNUy}&Vp41G zLPM+iQzbVc8Av_6B$FBm|7|+GxRDqO`H7~oM>#_w$DHamn@=G+N9q$lQjmnVks%2` zDOvcNaF7sg)nRD4;ftD$cPi#Vw5sbRSW(icd%>i(%Uh4);xHFxKyT4_kt6ne1$nM3 z7RplULq~JS%#IW?i)iMRi>aYQrI;ZS@)GKBL3uy2H#rXc`sT zNxbhd5zZ!M?+fisM9R{=kWqkAB(wRU=0wnXQJ_)1MmC=N0a_le>Aw6sDF^cB*YL;O z_%k9<)yQ?~%L}bqU{^6WRF!KiT><3X!796fLQPurTP@JVDqDXbUMzbrQOZe^W)d749R=wX2jI z&Rx}Xc3nvnZ~fiM+0)8dB*~ddsNHa;#|0-lcbd)4B=41rO>m()@LI-?lVo&IVsD7c z7>cn-k_2TR6bU-gZ%|k^K1_1ZmyR84HYUtSRUHQA)d6GqN4DaqL|P86ULzv%}vVJAbKCrx+L>E*F;yL`MhLOT%x4C}DsuPJls;5m(0G`&`^lqoz-%8(F=~F* zBJemEXSW%zhn6<%36+?4tDvK2WG?J5hN92EfMOf`d0p)X=#QZ%<}mL*0dzC}0D`0{ zZS6AN3*82Wc{c?^X(Ea8?WctM1uTruV|nPyb)M}zfHI-oK=ltKlvX8J9m!~p%TOhg zWH>*M24EGg-RlUVv$A`tQM)_4c9*yLBE-vBcwoEl1N1!(#ClJ~o6~H3jC`P8+WZbx z@>JJRm5GxfhDI$P&!+fEgGgxe~+9AZ=0w(SV+D0kB}I)h9C1&O;k|+Ok+}JzjGM{@_LxZ zvrSj%&%>f#Ds;^&Cs&pV{bz7O6?!R|TPpNsm?NA)vdh+zU8H}@$gjKmY1eARP(l*6 zn)x)7iMf56_NIc=h02xY+5$p`%4ZXK)A=wlYpJ(RvwV6aM1>F1GvOe1MzW8tZa#iE zpL{fSTl(vX8M3CqNEuzTr$_4cb)v_Rsy0XQ(4&l>LRj~3XC!-1cS9tC=#mm8K=B|+Y+ENVA9?~wFP?S5ZV+Xp>@5P2QSfaa4Js^ z#(Gl&`la&w!nj~neY`c7)Yy34=sXkiX{#qi@VWbVccxsCINM}GsiWdE2` z%TTp8`nHq?KOj4-oT1I8ZhX9cf;LlpHg%^s--;H2gvxr6a`6~>3Uy}Brob+{)7#iU zH8rJ(3KSJUC7V(uUQ?e)o~Q64>V(DARMMk!NP6|z%I;ef9jaWF#_3pv4p59+;fyNR zr>SzKoKt~}2OxSMiD|3ujYNozRiP}WSR{oqx(bfarI0kEHXwA6q!+`&!1Q-~U}!0f zE5gW4)y;x7&;I1A3S%Zjr6`Q&Dk;f@@!>Ce5EgxXc1j`d-((5O%OCf^j@Jv3lv0qi z`JHA{Uj)d=|H7=hpM-W>R*LvKNttFHNyIiVm58g4Bw}Ea2wA)1P^=XZ$0-qN!Li4{ zY@J1^VqXPhNn=G)+gggxktMB6k|b+TEa`m+P|;ecB-vMtIAtzSBJ9f*EaD*%aqf{s zd^9tW%cxz#ookk#sJi1f z;e7cq-rv>F@)V{yl=Jq3)X(^IkoV?&c)8_{^~=&6^?SSxPXR?9rP)d2(Rnb7JbIpb zU!dOST~Fp$tM>=g`!(u)ay6NksCQQly)V`7>*&2qy_eid?^WvkfxGBEsNR2j552EY z?-}>f`zrPBdW7EV)cbJtUa#FhP3BGNeZhnH|Jv%ZN!jp|yp+k?)g&hqBZ zFkYkSlK7f_xO0&A*0&HC4|F$n^Ztu2pU>3Q}gNaMyw$bYSoGN-h zPra{F@8i__P)ds1CaU+n>ODuhUqj}T)%(O|dY`7=SN(|IXQ=mechmbU^?p#j&r|Pv zF%U3rTcF;*Q14f3_rE9eYt;Mb7wEkN@7vc>44meCk6FK#0&ZZXX5m&9^Tb%%(}pNR z8`Q8*+N<|aVTO4&6eDlb4Xw%U9~y)`4cU1vy{ZaHXucdu63yY|x_Uw3&~392hM3b_ z*_XJ8=+4e__e|`SYngi0!^;I2!$j(~>_BvU(Kg?HRROumEY$a~j~M?6j6 zUezzypMxRUg$v-=yRNq~N0R(x0J1WXBrpAIvHpO@cSj%V7C1k;SZ^f3M~-z3oE&Ye zF|<7q8Iv-nW6vM^`6uUV1ldT8C~__ zlnJ5zt0JavH)hI_ugKB8;m+~ib&DiFFG;8T{GSW?!2clRuOb1C6mpcCX1@gd+N6NT zuGh(m@vuEvp}#s=LqV0KSRdykJqJlTTqkMz5t1}CQ3CafO3vGD$vJS%2@n#g$}~dA z>~xjc@PsmZC(YgKp`{Edd5*BnHT+S`WJiB66;({*EtP51SFA_%?1((GXkeP-sn-$i zSif*vhN*1LnO~@`A&)*gd``!up|>N??7ISPNpsApUzp7#M|zMnaCjchAObGoUlbCf z-%pJXQO&wyOzgVk%nb)kyP)RIK1#r1?GlrW}7f znLI2?cz7~-n4>)0s5}gg&+3ZxF&hcNry(8|v+kn)`c=vKCFF$LGS_yYU*rhAy1ns- zaPABzc7R}LxAq_wsdS^fz-Xv~^4(JRw{kSiEur4gGgZ$XS-oC&09`aM>VZbNyJlq= z+l|Lpkg~?jFyy<-R5HxEKS4%>Cq8Hxj@+LN09l! z1d3AdQPk9w9S>$bkMzcv$W)q?9c*$1zja;c4y;usWxrCGr5m%j=UmtO;HS;%^ zGa|n<=hsC-zc*{|GFE)tmeWbqjWO*D^CDv$dJo~2j7vg)0jn3Z3fbq|fL3P11YeUk z@>}Z3)vkA}`C$z63=}7C^G=xkTk-k0&KS$$AW_42RPcbsX zZ4~>0(0=SJaay8YziI=vpCB2UCMZ?#M!v+-zuMw(>(%fj_O@u4(r&H?K9oU1G+WmM zTfd;r*a4MnzoYm3%*b@N=+peWjM<%SxnHOPjgl8!?=rH&tr=7dC#0`>>#$Nv^islb zp(>B`$a(Gwp$u;rBLeJ9pt4OJJvEYcVN!uBt~LprwUW~7uhD!JwBP_0EN7^fxx!`C z(u4$Yu}wwSK&sqe%@H+Fq&A8MiMlvW-(Ar`nm&dV{Os%Uq0I9$BQyHDQEZXOSHxp< zHKKC@MF(;DtCMP$^j^NZjE1EM^#mUx@k`2V4tr~&+TEHe^q7CAD)!cKs(d9vzrbZI z>@XuFlO?2MR+Z~$Dygax<+#t*?6Dm9QN0%4l@xwU;Ny9Lz(e!zaPExt!q?hu)SAdr zzGamh!;OQt)R{}DVWIW!(P&*>Jd7N#&7=hvs>PAS3*B9FF~1wdd)KiDr!Uw{+9 zjUeiEWXuIerG~n1tg0Z7ZP>GVURKL3o<2>UzB$=jL!ZQaG#@oO{G~JKZaB1NNYIZhMSTIDd0;Jw+Q)O1&qGyLVT-dpJyJlm%`JEwH{b{TCG zYSXK?p})PIO8Jgk>b5VY^wN9J(7!1GCEB`&v|@*`b_*=kT>8tA=BqA6XGHZQ=IJ-m z1`LX*fpSD29^!O7I|y%)O=%^ViCMVA`)nVxpwqnU3uFFH^ZO*pnEw(bt2uus3Mu;E zFQFZB?m))4qZOcsw|i!Wo;P-HS7CA@bY>mVBKf;P!{p#D<-KZ3lqTjNm_bZ*drTw9CXM5xPuKpTrAlO1Vl$g2|_qhRl*=``Q) z#OyR482j94$0y`_YSQb*^$!iG%f?P*qQ<9YE>o=8PGjfkUmyW4+>L+UP0rBS#`e~~ z_lacOelLujAGW@e9^QYkchmK~BCf{P{qD$ybjNUVnVS~t)%uRxxl?bopNs6g5Cr6a zr+SRBrS-l3;dd@JwzkI7FKyb_@@^mZADgmTV`+6;cQ;+(Y|2fmJJ74{rM*psy*8uY z=ZN)hayAt@H&gqfXGSP|7}00%ST@?&a^?%hA6x%^it~@*cfUOI!|-R$kaL=M(=6xO zcPQ*@KiiA{A$Kku_X@XsY2W;>Y6{+{jSTTnhCn*yYNYP7MaW`Q5Pc6(qU$L#Yw@Jn zt-;<+=Ncc?@4*(T6{pwT;B({SG)^aA+ZGc^Jt{P2Yn8{q4+7)W%s%4(sOd8eY4y8&wcNi@Y zFr^F|oCBR=$|=MDSNJ2)5r((^Lu4gb>f z(&-KV($nx<;s%;d|D48n<4TuNjf~i3dw)LtWR1g&Z2p$s1|@`ho!Y~(?U z4;p!>lsb&OjBvIibW(U_x+8R)xzc_1N>^l6c18q2M{jkd+Z^A}6*?h&1FVlV^W10W zxgwL(G9s5`7?-$=Jh$4Hs+A!8X;<*r@Mm4YLB`I*JF{Dt_i?^p?8FQZN=TPVt8lH` z5gZJS&~rTDmOD{Y-{Zbfq?N|90 zo4c9X_t*@rjlRvj30<@qCypJlv77tS*XZzPy@HwH&(eY((!k?3yUFy#&Hd=>*v)iy zIOf?*hn6wTN9U~+~{f)S&RE{k=Ee zkBIfEZ`y*duKk!$C_q)#5q%M!p_|$?7+yF#&1Gl}y!F(rH`-!*v$~!_Y3PcjA$;2T zU4RkKxbW8g%4z6bXQy*_JMAbir$Ei34?4}&F7q;X@U-mDmSv(whK=LQ&z_(NL}@o^ z`-6DH{@nZU1t*_SGn6wCDoab3>CQGZUaz)?-*y`L(Fv>F)#3Lm`G6(P?!0Fioc<7z+zrnu6A169VyOL4)7hUY_lH=jyDc#l|l6T>S!X{-7xXT5S=v0d0x<;)3px@!-H zS2aQxKiYgcx&F(cDZPi8Q{2HmsH_LZ9!5tStLXDP4&~)IL+Rnwo;2@0T$MXxw`%2U zg45oyo6OajW`WyWgo%lc=xGQZRA9 z$R`)F;#f+v571$zG&`THNPshVK1#l~fd-z)W^{~SCaYx`l+GYL!vvQy^-S?Tvb~*@ z7J29lR)t#zx4#G9;Fx_;Ib$&C6=mgG`)L=-_nL37{gm!m@z$3?7T!@u1V`cH{mVZ(x?3fe6L@E;Esm+{}e@+9-1Pe67?Kf$=Sfi z!F~ds3t*N!$Fx9I1L$}zbDM+0tzU#c?Y;b3b6pe7PC8q=-sV!>h7e%s_zGR7-;2#c zlEhv{tlhyJ=&o5X+{izOIQNMZc<8NVjVtT<*vS~f%|B?4$G#VH;!_P>tNWS@Q5?+@wit)+HF$>cgK%Sw$fav6jJ|?sU_p6iXG6=1iQ3a>Yz(xhF1TG6+Y#Z_>5kyZu#5f9TyDL}LFT#JXoL{Byz$-kl0DCn@YQRCwi(NYBS!7tBWI`yJs4f77U;w1N~I0nhUKt&3Xdap9<5N&_EPtR+=*+pQ^o38 zizOMFi9xZM#)K&(E59Rq(6TgR(4+}|_o}w`b74jSGG}H4GY;jtoZfmhHGaiV0!`gi_o=(LFO7aYKpz>e}Vz_QQ@=;dud+f zZrJ0kf0i6x$^s~S53+=x!6N(f&?_LsUd2Aqv!}X@KCwP+eJGM>lN#|AUgL4B{>Yq3 zD^7?W!gZ};qooO|b@~!>jR)RS0XV@t`3VHNE9*7Y4>^1|d-pO_XKxvA7=vQ3!-H_A zD>yOSnHC&N)&7r>4$fd-bInlWqS$&QNZgCQ$_r%S1;+BBbu(RJy=Z zZ&6GLZN*+Dn~ol29rzUSj)#ME)Ejx1j4TSidaEuPFTtq1)s}kY4`~ZJ%Lm(UA=!f(o)3O#u1ODfbp@9x-Psd6UZrG0b9RvCykfj)oE&Ro z&AE^?XB;%g+b|fuASh|U{^put#zpN;G~aoV$taA1YOxa(jFnAUFtQEn)Q4H4bPU?>1>M~ zZRDX(c^E?da4}zzk|DIed^Pu^n+T=vEqe<1tAzhv9Gv1&f`i!5OuoPSUtS1 zz~zEEu^Uw@#@49{Pt=Ldacx8j$>V?moCN#;o(w$ShW!dWA-tA79RYbiLj1+B0}_czxSrWoDHtyUM++sNuEXHHUIM&d`;IrsgQITfp!d2 zedy-ifpDRY8=zTHedtvmR9>HjFr0wrG(7qI#KUCFKNv5w+`IAK{NHee{6}G>LV)4m z9x6Jdq6ec};1g5^!%v#MImP{gx8Y+r@3$5G_*3BwZn)i_h3QEuNF*&>+u;bNVOXiU zV~-iT+o^?7-G_weCEZ2e30J4?RxEG*IsjDOFH^BWHjPuxouL(3T{I%_PHu~pn^RmD zst)!E7gDAL@r5i19&;h}tb+s4JG|sV$1vpPCt3)_sDlc}7-(?p@1Q@J9(v=peU5Ix@?5jNkq!|!JJ4-IrhcZ<8992E&e2%xRC5wXtwl!-Ulg?`bku%L zTB$P}4j-%wo)O;RHYT~uOEWOcM#vnH*+&)J)qOXghNO$VQdjIc425f7281}!1m|Kr z)CWIZny{vG7^Ytvc(fzcVu zN0#ex(CT05QBLp~nD#si)k#2Vn z!ZQQU`TP{)J30Jb?VGpZW>_V{>{@;U!u$@*68-tDkWRg_zRyzH#c*iI+jP5Tp+f#M zs%Ismz#YAlT%v0qT1oDMZBtZg$F7S;_aonA7J3EmN86$J8Iq0k|;HKjiEa!k?F{>Z|+qZtt^q`G1^)U3-u0Gpk+U zFUip%I661{B^;?4`xqSkcDZ)ck-cxtPqX)}`o8Hj`)9XS-Co8u|M%33vnMDvmSrGP83ty^&ud^u~_19BLiV_u6Yt%ZvowL!GTp9ze7)%ZoM^ zi@7VY*fkWbbtGqKYyuW`$D&16sy%IE1yk9bB?pzo#dU7y)4IH>BwH)LWPXa`0a(=#z( zr~TM%xlm24K~qvY+H%!`M_Vq`lu(BLg0eas+jED)B$Hm-U&B9Rr-{gSWT%Cmpb?_l zdKdZ?UL!f*qWJDq-v^*9ml&_!GC6A~JR66v(A3Bb0Ch`|nud!;CT3CI49)6FSKYAK zfZSV-pE~Z?$W_kJiP^2I{^3Nnb|A>c_UxB23YdRzLUrboZsN zqv>Re*gl*U#6`IhC6%JR(dyGKD7R|m3^P2Oo`z&G%&mpGl_klq^yVy zKqt`q?1s5(C(Hq?c6?j zaE22LlGmrN?5n55zm0t_nEQ9D`Om(aRX7Ie2E_Yp{jBT>*g(^P(xVq&C;^-5pn46M zEAj+A#twm@k9(83q3@Ma<;g{^vC+E&3&9~z?D)vU!N%v|7oD$ukR80kRqZl9jrE#p ze3tz}^8)^1bcZXb3{m`*PoS#6M!LopJP2UT#9_6SWW~ymi>T926 z_ERgW*dMh9QAZNoj{6df*6`c=Tibh?GX}Z6_qTe#2hlrFJ!2(4n3|8za4m}d2m{gR=HH^!HU4}$`peY1(_|G=ANK<2^t`3% zCRo)!AM$Lkqc>-?16@yYY1ypGI($phWpTIk=8SHGTLcqbjQ*S7K``2XOq!ifGo<}D z$H;)XTgVmTk89thtXTUc{l`pIIrW#S%@8WL^tK!iP?x#LV@#Xa?{(vi@Y{zEZOQRY ze$kkgV^mFU%b5i!j<%eo>Z`5_BJ^7@{zhVznf{-n>z*84E#**)?l4wNOZ0D4n~pI8 zl%U}dD%dss+t8Ut%n!u|L2siYPQ_YoUvwe{8Oz;mQa#JqqQ}QCgeTtWSbYq75azO_SPGilVGeCJhHlKuh0%n9iL2kDu*`y5sERkM zMblpP-v43E@uuf@;ZILl<5eAt*ZL92VL~JZQ|ciFDZSl5_-6Z8pfj z(WXZcDTFRRYWACu-w|?00w3!&?~^bHXJr_cm=DEFsG6kp-i&SMG>P>`e4$r8lQQEE zNNN=4hWlZrrStd!eP5#@iJl`m{Twjh4W3A zVw!?ks18ifP*Xuym4sL4I98v4<%~nQ?z&+5p(#!$iq|Nj4+DL|l!>cH)7kSivL}^} zLSf&5>kK%FPX8rl@93@lBb6N=BfD|&0@^~?T4QPkd>oOI{2d~Dh)i$o6p*@Uy`7kd zLI#*qGS&=u5}rF=f2ZFToXg$eG`1L*WtdaO8B;TLw|2^COi`ILJ?7=mlaEms>bqNL ze}ht+=xf-_4h36FBf)jW@FZn8hEq7|e}Qn&TPzEgQK-?G_tuA?a%vdkt=F$8^xpb= zlqpolTfYIXROHp&LyOn@5!?zqcOl%=1);h68az@sJm&Q-GuIti?ac0^MU5A$U1qP? zcbqLahV_{-$!(5N6*_8%q2EI7&38usFpxt&<2$Y5CF`X_*&|wdHR_7n+@!8VXKoUP4!NdxEZJa-=gy%Q&M`UL8E(p zxdRmgB#tBcBQ!^-&TDb&404UiUTk@|^UF{*RT?>-Lpko8V3Zb?7r8O^h32AGdo$Xx z53@Lnl)_GO8z04n>ioWtrVi%6t~S@aPebi#YM87l=mTrJ9K$d`qrU!eZGEUA(xcXo zV((KIvcT5IUwe?M1mpHyP*!7y(LgH+N>8q!UAg_dH(%{R4YY1;HdMOn?Y4#;u%{Tc zpN}S;R0VsM9h266?tm0;#E001KVP%vB(s48(z^FhRTn^rqifb^=UM2*Y{IP zt2!gM({{vi~9yi=m^pVIJOc zF^I+2syoaE5*%JJ!V&6!2s@9x^{cSxXf}`tGW9l`4tE$Ipq~`(aJD~pBh3d+Vv8qRF|-F)!zBcpu1&C^;)#m@@sd!YXa1Pc*L|&1J7^HeEPC+M*Kb zj}0x_bIA5K%+x8pp`|^K{C!-pr%c2opz~GQ*@LkYwql!?O*9`Tk5uOjl3*Mih0P7I zt!M7kL7)m|y8Fz3Wbg16?9k!IG-F!mQtg>~zZiNm@Rp%z>msEGb1XVxx>Ua zkJEcAZC0aeWSvi*f?V|8zr`CKL`J&oWDL)GE$VzT0<2G9bqYSiQ+DqE z!`k`4M^#*lf0rzwbj=j!e0I;fyB*9 zZY~#WE3ftyE3Nbu-=nRzKqK-eL7ISC#6PX5Xk&}I>!Jpw5X6$-_nf)A34g4%pO?>P zbLY;TIdf*_%$YN1&YTG`;rECSN6Y;KVuIb(d`aD})Y>bS3&~oE%ZM7eE%he*{TbpH zq8&;!4IYT~9r5GKm^KwrRuajMIqik!k1D0)jA65djigz~C72S}L)k zUoaHbTNi|Oi%+KA)EWDA`blTU{<1QL|F@CGGnB{j+DcqY#7Y|d!ams#%#GeEDUkC^ ziS-1cEmr&_zPBYF;0<=bLdHovDy1iu>;Dz{Us@$~5C-G4$nbSNjb@rE^DDcYys5wS zmXd@FISSx<0upNyM+35vu%s6W;u|Dyz>dZ@NI8Mn2-njBf$N(lCEs~Qn$Vzt0$Ra# zqoaB)&ub@l`UF?oDmu`ckY|rAE78*Dy_1>5G5|*yH0$%}p^@7hZy9+r^=y`~*Tnx+ zJq>Vl*1sz*R{d*Idu^JdQ=H_d*bQ)})iupGJ#=)kRerJ!lB_b+mJlSQ$(@9t;O9#S zBCht5sA;rzUSy!OdUEWuX8yVx2(G7imjh=tIpohvBnffk@s~g~sQQgy(ZSN!?p9RM3-c2qY7pHZB^$J?dKPlx>f_qZ60LUZ`kbXQGD?=pu$cLI zGw2O)i2=B0C!M{?n>n^GtY`oYp4vzC%?$6%4!LWj>zw&ve@@#Vub9251fbuw$GX3p zUYFi0bF>o;^;(O>{wcme$-^F>880|6)M29IGF{j`Xu1dE@3xs%{VH`cshR(sgp9Xz zkq;+!+?;d$oM(~K@GR&O7(x-jgt837FEnh$MauE{qLG!?w3Cu)JmRj=<`Q{!jpP%N zmd5M4YN!lo;SE-UsLQil)zx+vfgsnPMGaH55|6?5;v0mnkY=vXSyrm@&soQBwn`gh zSjSb0=W@YAo8f3`_`s**?aUBHP!wM6dYS|F_S(+{Q^7j*u8vd*rvD}L6-(*@%+ z^*8xS>?(OK-_~8_*c7)1IHSv&uTGuSdN=JAv%m zKa+W&Zi|T7y5@Hi0zd}XGko$fhzv;&)&)y;GWe1rV*gZNJWRsWBT^jesj}OUi#Sgf zL8XzAwT57u*xPx^yE-y*f9fYRi=jKUf4WH+T;#WC@k*{NUGSDHpKDmH7c3Z%(PA88 z1^sN$IYhj3a{*~3%>tI#$0Wd_{DwSJ=>GEFg`Cwji3MQ(f`Qre3MrqHozJ4Tj{B(++2UqyH&JZPmWii5TwB_628d)KW6s&@%MX80f->yYN(2SvKJc(aT!~Tfo*Ri{2Vw8Y!b%I&&Chlvfz3#CRT2%NI(qD7>zwadq7e$N?}T}g(jx^#-WSB zmSOaEt5B%jTfBq6%BmLnh(AOPJ5xVmSeshOzLZtZIgdbmE}q%zZhj`?MoL~JORxf8I^=^@2K_rKUn zqs}i&iPfrf<^YIfLPRJ^Xg6=cz^vYe2xoF0M6y+hq}(SgV5VN}ZcMg1^c(|g`7nK+ z?T1S!2UTOHBj(V{Y+)kgi@g||=?Lt%Xh>S(MnYod8F<`??nr9mBueWGRhFfSv#*>p z^))=Qb8j}Puh5NZx&&=>)`c|LiCkHbs* zH0P2zLRdOzjsQH~2mC0>vQWCQi$B#XB^EXA8l`JYh%;*)Q`3R3(bts)hGJ9sAkQBB z-{Cj6MY?}W5zuGzzVC!U;KLJ*E$=GQ7<~!)2XqvuKG&>gTsqG>8=82k2I8x2l_Z0g zAyf0el63L_lsr_0-BwAf%bU`0TcvL8v3+eK3+2&TIh^l9P0V=n7;7Gr&10f@TyGvz z#G4sr0jy~?Kmj{1s_txrDLW{DY20zq#udJ;2be|vLxj#7vtsC={w|EtC zj<;Ist4@i-c@SUn;(p>FO16h4<%;5MQl13oXmB1u%_cI)y^oUL?Hljp$iqW4sJm2} z&bxdL>ue2-b-WcC$Yq5>z^#w}#lkXRr?IEaF=IybOh!wCZYd#5(;X9WbaHaXaP(A! z5KJqa2X{;0K`rAaiu!{O05s)*MN^lq~|vWoF70^csk zh?rV;Rd|@XUy9cdQ-nJJC*fpDCZ8c^4%#hTaLfBndB+&!L7@*eBODEgHS8}SEI;~+ zkf+=e47>*g3}xRhk0+f6mywU;iCL1|EKN;G^98bI^X23Rr9kJwlCQ|OYTAtwu&(nSY#`u{VF9g>%4I`*jBJSOS+X&*A+Bf1#$?Zujgbv; zJxi8D+ACx)+?*wIAC!&~(v%)_6VeNA!+NRIHY>3ej_r9mFjQ*w`9Mm}a<~bhZkC(; zPtUS8MT2eemR^;0hgH3r_-~n{l%||@0?ti@$aK~{t2G?faFd27%S56nqrI?I@8u?@ zbjOUAO@h%#S=v;hzL0=4^Nsxls78x^PR-vF0t=hziTHDJ5;}?ycSdAWmMG5l*`B8f zjU+C$Fubi>k62A48R! zdYt^u2kzCZyrlc0%6(_`@wu=U05EVOrgNPJfj+X?bDw6>$Hqr5r?YnbmvgoBLU)5e zXsy4fnM6VMpn1$YYm*G8RDtkT{a(9XzX$Bsowk&k%cG_K2>OZN#R;lK9fUUJNtP5L z*HbQdm24O}twqe9+Gi6Y`&)Y1-|#sTJ&_&X$p1X3eV2$~i&5&oz#gR>XMJENnAT8aLoY8zch69-a_?lLBt*C3v*4$0F!N_;2#D&JuH)gh(tI1VfQnf6+?>Qg!@`&qeuL z3OYw`<{Yo&pF(MMhlIpp8^)Lt(yhnlJucSY=+0Z0%`5k|Wm;xND1EI@ts6R%-QFyL(oJm|J00O>uPHQwS;D#WHR;}9Z8>QB>8i@sWNqk=t328ztNoJVvWvp zX4dHbfbh@AcuVg)$WXXk1$xupR^kG3$2T(KAAM3~CN!F_PT5LpUaq3T~SfmZVMZ8{Srmcl#T zzHa1R16>m|NP^yoV~pfPj0CE0NPo)>J#=KkdP#V{Lb9(u=4-8d-T1VCu}8U{B#wGg zIP6`Yt|v*No|HF}IC+jSwJNzGJnud!{_jjAu6}V9aWhRggPcjB)bFw!S{lJh9FPiQ zZ-V&3A{VzVl@S)XGP!BnCqF=?;LMMt?#|}ZHKNYGYno|G#G~!L+CjLtmH4eL)|Dre zBT(93#bmI{uBNTxb3y?t(U+ks%lP6PD{+XXH~N6Rgh;|ZA40V-UUzgjcJc{<+RQL; zMu$_+km!U!8QhweO}q%({5?-qPiZ#vi|GEsIARqr|>jHm($L|`NKW|60wT7Jtoft+J0w*&)l}Ad-b2(qo z^HbaCDMzG0T`@14x#y<|5%$@{?DuqcgEZ+zA;rw$q`lEjIh=G555WGwXFrU2c?${g z9f_QHlh5FyUYjb(*?x&4vrQX`c% zO=AB9l~10S{h($*t+f9SsC9*w5WPOwKl+5`7{a#ZDC4yBnTUSw)p_pK1q;}_+l-kY z8p6K@8+Oz;$1bjWqw6wY7)rQ2oG!}Xl_^TUBu^K8#v^bK!*B^8-Aak6`w62bIE}gS z1sLu(`UL`S@>~h~{yWQxKd_|DN4k_9`VV0*8;C_R4Pz>n0O=PY^V%g_Ja-*|F`kk#NGMOvY#A?ymj*f6T^AD4J zpSW5oiU7PegKWpG&40SNF^GYxMG+UkNf=CZropZ%j2e?zv>0{)B=z%RM>c3Lb z^|anO(hfUo8&vpdlgIPkIV2m9hla6}97&}5Hg{&Kli6dkI6FR;L(ZAOC z^E&^P#?KltViTsfIf=o!*z|=r!1-|h9$^Lg(klpJhx*1w#19RK4T~Q-!R{{~K1kk7 z$9QA*F`jT3amd2i2LJjyA6dWoGYQhYCDljCD5yU^#l0?ct6R1I)=!|Xf35j0ISTs8K>uXg)#fX8s@t8aT}k1E*UPy> zR701_9I>cjm1utCAbiy>WJkBUJ=sQM$Q1UfB#>APwsyhfUQ2BwW+e8gyYzr-d-A^Z zH15O^{e!J)XlPaJwedaMjuOg?^UB9xAWIL9b-!4&*I$=PQ>hk{CCvkbGZ}R1lse+F;~Cf9 zDeDJ(ieU}5!*|=Uqr`r3hJUE$icN4StmbyfY+mtGR1zshB#N!iDrO zR^OHE2ZuMgrtQL+X7F_Z*DOaw_&#li_yBb6cHQbL9m2Z%Wtt!zlXhY%=oPzj-5|l1 z6nm2`FTqstw}f3Or`9UN-kos88GWTCapHpIAZ$_Y1c5VJ${E={_{%<@cKfR_S?W&$ zjgu%s8%ZaRGrjH6>B1tX!y;2M@#}JBm>e=#cQUW(-s^Hro@BX{U%e~7S!$WQl4(az zm@BwajQ)c-n6297-5F;38XyVhHHHIrSvmF#^Ewn@o&h+}2iWmvt&n@?Q1@EB&E#Nm zzD#C=*bITLoP(*i>2%F`iphDBpL4C|Y=%T7FfJ*mWcPb$qrhEgK=_c~)Ue~;JU-ZkmoOq^|pDM+csVkS= zkSh*uWTnfYjF`pR&dys`MC#NTBw6?QY-kvv^m-pC4RC>hNCSL< z5DoBkAGDn5RgAQsWq~1s`X_$uokLXczmwxCyYPW@C06En8wK@;LH$Zec_%3oU2~JE z+X$??(iD@-@u6Si!x4W^JLSO9i5Nmg4@&D^AHtFyy1rJ#49*}QYn;2T!rll5QPRLf0uoU^` zinJuvBV+${pCdLkmA7?+C3H0*?^-UU*@4RV&rbD=@tSAA^!Fn9OFys&*=yd3&Oz%p z+v5i>w3hso58|fdviRXI&AS+gn7QtX&k-Lu6e(LQ=@a5}3Iq0DURl}(lmQDGukIHN zti;(=nDdM@-}JE7p7SJorRuYMf(UAh9GaKX8q2<$nmbDMDdyX5^^4wUnI6_%40wTD z=R@8q6o9vJwvxIV0KRoF*+2@!RWaw)L&B#bEDA2-@~DaBc-JsBNmg9p4nLC>y%wV_ zUMPi?_=V;9g?%+sSYi76@?9n>L1rJ|1ayf{j%?FusZzt`$fxq{Oeq#PQf#Wo6vk|o zZK_9o7zd>P>4ly!rur~m<(slzA9X1|^`@+&B||P&)Xc@Bvm#@!OJxlg2n>^ zUdR|3vORe~$mB%Eyi!2@&wxiFL%lUSgRxw15{sLvok9i+b(>nVI#n-nEp}1OPSckh z9eh!sJpwc-V-#h`7IShFkh_Ww#9IMk?~Jz|8rf`ejF34mGt;j%8;yy7Fk1x=`*jE0 zjXpTBDI8NWZRfnFQm^QoZcmDX90$;ZJaC3|S%&N~{c(#A@qbC)vk@lx@joQql%xKe zm=W>C1m@!W57u7F{P?pSrY^S$2oWgBq@&Zya(L&9YrnuM20!VlaTqd1i# zYyin(r+Y)LT?BH4v}qmxl{!gb;2y5HZS*L5Fp&Oo^zedVG^0DZ*o*vK zviM5RtU3FBJm+;j^ZaHwpkIijPvyGjO$@x;l*_MB{@_ zmZ)6(5ZDMq>q>o55=+yTX+nR~pGl?;T9keMrJbVd!F$x#vyA=oenESIAY6QMD85-R zb*{>URPSLWe&MI&jB4kZ(rT9v zm9?oHVPkFjMzCQkYtz2#MoK62UN?e=RC)P!Q{`{_xvyf5YEKUEOTVhSbSPE!z@>dl zG9`uJ@||*<(CCw!=nU6Q2284+VRCc%G~yi|YsfM!J7RA$xx zQj^LYCJqv(hZ*Eg(34#mZoSnn{2D;W08e#ulI4#Ibf?v7DCVPA*{3Iee31pc6n&Z$ zon=0E`Otb3yDsWuS>$8c0ba_bi)4+PWn+z^8kojVTz9#jq0?9DZ88;6vy%4Y89wYs zh+TIDNi~zwOU4P=Ob+3*z_FI#C_g|Lor1OG5vZ3i%3*8CR1@aEwd7(G29UKRpK$!( z0&5BDWdfI3OJuG>k8CYjp#jTU@@oPU;s^U$3tJ#|j$!SjsIGQS4HN<*v5H7VM&OHB)c&RHXZMSp7fppa>fzK z_xZFLCU)Hf0sSRHzK?=Lj>Jy%0eDXt0Ixw@f}8Zp+~L|ILZq1(`xxFz?7B&U;r9tKCj^8b za-r2P@|(=B5V7Km=)c<0d&xrNGJeZxS@S8vfC z8i<|t6o$TLG=KzzEK@nRD{D+1`Q{;{2lZ%*#$dNp} zQ>NV5WHChFN=m|~E6S&`7b7wl_m7FjmBSJON4B&zEBd^S*`SjM1BgtrHJ6<9Chgym z5=X1<8d39NiZQ`WtRlqmuiDrps+unk+M`O=>>@HY*h?sS?2UK=7PVpWw^W#=w7w_* z2Zkd9Y8owtd7gr_7C$N#3&|mW_4fPP?w%6MD3Z1%?jxywUvobpN99Rxjl?=@cJklA zH?5PL_6M!Q=bhI01}THBq4xwE%|-F`YOPEK|AUfJFUTi@-WaAG_FdbKfc9%;bM|iy zzEs(nUYPEW7QC&pP*Cy{o0_A{Mex#S>VAd4H8fMJ`>5b4*<}-$aKF9I_@QoD*~$?y zF(_!O98NNPP!3qrBq=c-ymPq5%Y2J**Y)Nx)jYmt9=Djs9p*7b9vu2(8)HrM^NcQal3Z2ax~elIy3iNhI0*tzR^e2!>lQJY>j z)m=JDQeXGA_=f8V1QwhS->^sm)?zUS1$_==dWo1Ml1;ZV0?F+gC`Qw}-X0Q3Z*vuD5Q@1&^n9WlM9Vjs zo|Mu!Pvs;QK{N}*ud=lWCZG$d9Xtgq^3S=$IaKta+2vj^W@K{%Y%km}vDfr6b;Mxr zy#ni>#S6($*Ct(FbO7U!2(FIL&~%@h?oI65RXN^FwDy~FK}FbA&jK{f=|b~VHhDHk zOM}&k%K;f_vQBpLbzh!%*O7Rqpw2IJ4~5PjbY;;2Yc1N!%;(a&$}8=6Ap$C7)&tEr z(A9pJ%)k?J7O!{^oAjj?H-~q3%~&byv3Z2W?7Cl0`5nW`Z*$70pde0+m!#fA{>R&U zQKbQ+Z;8KA*ssO8{Fd|_wypUPm_HeR{EK>bNYW!3=N)GUWirb#*oAVO1}$)DyM*u4 z0&&O~DtE?Xf3L=eUXoAg`?F;^6t_X>ob#Ge?pEhHr~DQ<)_H?0SJs62#GpM%2JK6K zVYDkFra+&)fKRd|spOiFO;ObYQ}yI@T!Z;sZb4rr6>$Q^p5gW4xW&r@s$1IO-OPbp zvA2lsoOv!PzMbe;g{s5uz|8K`-IOVDT-9RtO-Cg;B};xMQp{WQdQq@mAF3=-rdxA{ zVW#fHju1$wL2k9g*yUc4O0C69Xfu79lq0Hh~|ua_#=r@Iw}+>Ibs#xm)OeY+Uokl?Sf2+BAi zkv%yw(v5eBfxVeS`wM!N@DKBP2$|iz*NhGmlhT+N)y<@NNn$FCGp}1UL2Zu&xzxaH z@?E^f5BWYyXiV_!9T#UL!fbA(Q{*KT2S{d1Qs#h-3a=|R73*X=xyxN>3b6Y)9W1+^ z<#=bEAM=6J={(z3D{u1WXOP-+>p_=quq3 z3j%H>&QInyK(3l37^`+JjkvCuO}o~a{b-M_Q-d8C;ZZA5mAA58rRozusR<* zgU<2FCGewjjSyw;Nm%72Gvaerh9|E$hKbBS86Qd1q>WzeIyu-m$=;_|gft29Se0$Z z$rvfIb7w@v3v=cpAb6!!P7ZdAE2+qxxf>J3_p@cmj$cHI>F*a(>9o~eh9Veya5)H4 z;9VI^5Aa5JaWvYSfIm5BGmgd=yeE##|0u0veD-DG;nYTCkq^`Tuot5zb~;bimIUk% z@ULOOUGa(FwmUnEdIHRN3zCgtgbz6}!tSEn-BPThGE-)OA)Jx>y{5(cFeRTBNnZ`Q zi64`X{Y&qTb4le3jP46bA?f=5^JD|!ZDG8;d~V(&;szqSIS)dO;fAMbH*c!_XfUgR z*{2_2WM{1n#G4CQ7wD8d?aA7fhiVTFo_)%(iQ3aI_q_bVua9^zIpX$np;h+qTxgS#Qm53O_E5$sXs--SRkC*T&g4PdW3HX&39Ex z%IG++;IfjM@VtlPHTVV;j}oj1H46@BJ!i%tITHB+Q z3SI2AYjS7ba8xsd<1K~G<#@i1^=%B-9=s-FfhaDJ%c31K_cjJfuZe|9XWDPKjn2~& zN9PN=ZKDgMVD&$q`UfF=LOl6U?V-W5&pEb;c2mR(DPpGmVEPxe2mfM+Fh)B;Mz+mJ zNj)YoGscppobXI7Ct@CXrqq1%t>7B{R%jkW&9~v^+X$0kl=)U_zTt{ckREFy$4inX z5pL6Cv!zNxcWkFz5~AAeBR_;X({Ghbd>|A{ru&veI_(eBtuc2zOtNK&zu zH1iy_^DBB%^B3(1wnksKDnC5%ddnMN(>K^MPPiiO%Z}nhe&tXpTxzYg>bYhvf6mE` z_2J6B!9YWfd+9iZmlk*N!uWDIpfbQ|X*{*z!WBzWX9K+4=Xyn+P6DlZxtPz z(D^cfjh#SXseCiold4CDIcL*W+#yh%p|4io^s{U_8;6aA7|L1UU!w= ztMe@sXHe^`lo{FMGMYW~HgVIs+OyM|RGYP2f!i4hF7 zz`Y4<81@(0YA@#t(~5-55`X6n3F901fvYHR1dt^{cU~R%a@`&mWrl_bq~whM2N0T) znIZW=1F)DD7|6w+D?2KW9U90ezm*1|PJa;Ns^ zVT-}7UG4GCdcF#ik9VGGE&P%B`V<4re0^iVsqyB!_1oR%+jleHn$L)Lo^CBvScOg+518zsmvA{dw8TN>Ob!B;i-tOR#xFeSl1Xs~xXL0OV|b%P`*n{i&b6OcJJt#Ak)T|*;ML{5L2#l5FOy)o z25*tzS2TFH1Z58P>V71_LJe+|;3*n>L4y4?_>Kg-0+P1(UkUEh;1CI>G&oLzG$9GD zmEa2+oF&1n8vMBgH)wFZ1b?f+_a*pC4Ho>3;4%%CO7Qy{yheieYViLNOwae~mdkUN zSJx!Z?|F64$@5mP?j3pFC*yT1zh-_Say`m#CBNnT9^iK$zXpB+XO91r@NN9K zNG@v5D%9qQpH@|j%JNZrLSIaNM3`@;??o{mdDheIE^NtYE3r%5z6DbN5mn^lfm!WyS;lSy}`;?mlwjhB_G_V zE14iM{8+!-`__9h8|)M=domk0IU?lbl~mag14xdu2AHSYbJvarx6Ym@V;! zGs-I+yZv%|Z;%~V950{3etK(QD(M;rHcSqZXBXN$Q)Wp;{*3xmj4t9cOd2+CB&zz= z(hMff&g~i`r{gi1w1*?{v|+{Rw0fl%$ws|G%@v?!lUV*$wC7apkc-P|cBLN@L!54^WCcTDk_;vWSbC{E~zC09>(uEll(aF3j_n!J^!mfwtCb1#}A)o zEfGHJ>}*Nqo7P+{-R;(F^~PTEe2{4`LuCOw6V zO+JPxGIEB*s7Ot=a%gE``!Fd0z*M*9x zS=iGi47osI#dB?;^Q4DwQxW-fIPrap^lSDz7Y~b`H{ z4EsthFvV*pm1a80Ez2%`aqHS0JGMLM`#VSP!w%jMeBf=i9)8aH!IRe74}%?};~y2; z@84uDJ%z|Pf>Kt@UWuGoES8rM65^lnMz4qO)f>GYzE^MbdTvs^(d*&+tT%ddo>B40 z9_YbNLS05Z_XlZZ-~G5*Qaan&TewlKy_kO%mwZ&_xdlx)L9nojU>CLvW{~^|x$u0J zJMRs-on`(>IJca{T_klvfn_C?k$D|i2PAs55g#SWJo?E0c(*>n-^+;44+Z8I2oSc7 zBWkH202;GB%11yH|0%Ww$%wHm<-3ZqH%Ar8+nIXKUOC4!*$- z7i~vCl0CLPje+7m_IXOp>HducgS^qf;=$;aHjB10GBA2@#yipKcB@`gb1I7MR_t3# z?BtAQ)~XFT!frd2U^T+?p1d<2M)Xxe94`b>lKug za2vw7X<@m)wbShFLJI>7A}<9Gr>}fmae6MeJ$+_$yH!7x*9nbN`*#%=gk$faV&&>k zYwbj9dJsRzd#rd7WW~XY*P@55dJ*EUY@B*AX^SOoaZc!QO(b-S{&=^+h`PEH?vQ&v zCUkL9rfN5p_97>iRE1}Ak}4N_)vEBYs@-%1>En;f&RZZhR=tQ$xH4LkwCbNFrg2A_@d!+Z?{r#lM0>ENuik1qgB^(y8=P&Cq~wwlvbCqz zD$v+`1Mq`xfbJ$K+AUr3nSd4^0raHX5 zyEV8q-7DDXw2I^4*LdfP6&DK_wnVEshUxH-g~UDYi5YPDE%DC6SP7a-`nh=a8vsSR` z7YlrluA4`t*^Ia95u6yA_NB76!B(pvVAcPgDA@U|lVxBEL89uRxYQ4bm&}=1P;qN^ zS`{CqXJb;;A`rsdo<3_5ZGka_TT=i|x-Ba+m6%3=@DsZQgFG}uU9qd2gL3KhNY}hGqM(6;} zOhTL!t)&8A<0G1BIoud{jp2J7ZdH++qdmgPP!!4sitzWnQ}5>4lM)Zg&dWsy9kUT5 zm#F+e)=5s}o{a6p1Z-XgT~Tz%S{phOet{El`Cd?W1)4ry=icVtaEH@bw3CHjv}2Yq zFbwARxOYkeARCD_OxLx=&g(^o9lIlaQKc8TDEjiuzK#8gBO_vaxqZi~F9Zu~?Fh+s zRjDapSm?1H`L8Z6sYqJ)RFDp%gAH14DJ3DsO0L>@Bc}(rbx#n}R?m~XB6)q|Z%}7N za^_2^e&p4BcQ}wA_8Jwti#io&NZ!3+ytVK*G+~c2uPau6fk$w%4#UZIBY5KK`IY1x zwc(F_(>Wk^J?ex;s(uT%9$+dCJkA+$C;_}mSR2+aA;3Mk?#xnp8amwNQ*-hOF6m$! zc+9aB{%e4!K1wOq&f}pKb2JAG+KS%@qe^{VKv(UFKQ6sPTYR07%`t*otVNByn_kLT z&+JBvL|Ug#(h46IXDX`GVo%GePf3P5OHIY4ur6+RCe?EiZ+cd+uhEMG;SR}v;Gjrt zv+7s)Ny;aW7i;;2YNNvGiTb+lF@=bF(R6`~Io7$-3mtwhDCPKjnL;z@AB1cU53`v@ z+tcIm{qlftE4!od#Nx1hwoZXEo8@{l%xnf1?C74&V%vL=g4|KhV4VV@LJjLg*M?s`=`56hZf_LSk<0(4{-vc7q!z;x990dVpJ&e_2E^hH7Z zh`VC2*>}rxF$Cb6x_Q^RV>s(!pA5i40B#Hm)MrqfrBC5>1}~Y@8NvO@HliI#9=m{R zQ=)ro^1N%i(xGxdw1pZZZS*O7uY=25nG0?~ z)OX8LDoHY@YUzS*`4l;%$yu(O5mF3^cYs3oXZ?1M^8CpijRch9NGE_*4Dz5 zZd#|C1BD`4M;=HvX_2wl;V7GvRR9@Na#QZSzjj+GKtsNfhL{f^YAI`Ru}I-?t9>^7 zc}mM0y<{=mAINg1wKCMw-b*O{;Nx`Z1<|cF?B<6hkw0yHNW3KEc9Kb<9`Ubgd_<7% z%ReO1v$^S;vxA`q_d0ZdjR?~kW)0j}P6}@DYL|LmX~gsYLIc<~PWDa$Mq&>qU#3RR zxZG}o6Mx@ItVJ*m3*oJAV}H_H%$i~r7WGQ8HUd3b>S96XNl`UkuM6qV^RBrftVh5u z$DubDM$k-*!K`omnn?^Jx zZeKws^q4@(nBtgiH-?8<$qS1d>Gmq>SoiH)Z@u*Z)`2a_Gh05&ab60xA<)PwlC|z0 z4msOrLC&&sHTd?nq0;X`>PPcTG($9Hc1)QIfzBz&q*Cb>$j(<<8j3>mBBE$ z`S#6uK`uSP(vQ1+9MFdyT|Ww`Y~~d3CK{^~7X8y0s_nWKEy= znuK*(kJ4xvT+A_78E`j5^(rqk8e$iFEHoAM$Z#w{mQI%(vN~GsURCBSyaPFy2jy-*)7RHsXnwy_OJ ztfE9~)Mt5#Cn@H?O?p>@sJuBY(co6s8^Z>7sWgQ5gT~h}Kd{$39R9Y~!;Tz#y$e>Q z_c$BoNP;*IEi`0s0L)qu!>qIF;!j@(gt$NS)t=i^n)WDJVYTUw9}yS zxh-)E|K%^W@O(yE#Y+6BRIEVfj?zs8`uKkgmFV@Z-Bi>XKb%)HO0VkDYtLM}UI@bj zNvyVMqZY5C363@d;Q|sD3F5)wn!62!st;xvhv`N2LnfGv0AArtkHjn1Gg7w5JyBxR zv>avq7Azoox%L*vUSTb|4Ge=Fg3!I+6lBjVpsOlY^*Rp1{|UkT|FpDEdFZ7(qwG3~{Y4Gs7D^NuLs@1K*`f3bkr!>J9LZ)HhEt$j%b*+>3G zSg9Y22wnjYdKwh++&LqxL@%I7WmRFoT)hH@tra_}t}mt3DTZXPwJ%a)Y#;KkRfbDw zk1XB(@@Fd9Z{<5FF132_5$Kw}k$yNDU80casplN+%Ok3HyuN&i4AE9R{!1y7C`EB) z$c@(Uzu0BK(QLKRiY=^w&pBR0tw=r3)U3tSTJ^6YpdL#ZD?W|%R%kYu0}F@AQjERa zo!^6c8NglF=B56-M@dB_OWmRQgchv&e2MsKCZg6p2@!mMS-)OZ{o%9uBG-~iKcUQp zzX*pgL_S%#f@lE>HEUR^ns`QXSQ%L146Kk<|6BR;_fwCAwel!fiA9p?SyCBNi8c2u z`RLU3|1AlR9eAm88Ro9Nl6sU(&$a3=5}8iNj&1-OL);rfla_j~-?@`SzpXa*tUGOG^o9<*tt|brHpge|#X)Qv8L~|*Irmem|Id1{*`2l?qu|a= zKV}<1`|;5@Qr$FMn5^zj@#mKJw5LBXJ)K&9rr$o&AP>0J4XmE2KXQdr+L&#hwu)7d z0;e6)1%4w9a%&!l&grmEjMuCR#4hN9gq!zp&EO6;^P*d46?&7kspj}ig?Zrv(d#?x zmad9b=|7Rwt$yIv_(v?U?sKmmx?lj%tcO3cez2Lt<9`j-KOY-XwDlNy(gi`tI)pe0 z8P=sw0*G4$o%eUkSUlb@OB12W&)5x1_GP;vEVGDGVZAg5BFF;_CJ{kW3)pqM6_0(~ z{{!9petOVQjJ2t?L$h(QW zRZr+^t&R7%Y?b@pzMo}jvm3iGoJ}SixvMbD#=V$1F(yniWO!aVh4=>1={M4l9Y zl!Ri{-+~klU$xxTB|-8ZEYSQ};~luev5gYxQ&L5v-29muSy0HzP)~XMDHu`$t82Z}Cihg7>KDw8bNM-DmDqKoCcgveh zIW*l&PQ#{qvjYwvfgnpo6ksLaO;0)YN(gGkYm%U9m8&;H@E(;0R%(A#l{-DD z-9k(0Pd0x;0E<_kL9LK}DXCayEi!gQtAJLd#CFLgEoYU7EO#bH@q z+FLoH2%wUR6*JyR|1RFThm`J|elAm!CnL%&>uu)h3c9A5=_(y6BUOq0z|3<~X9^0F zLL;9~2S-Ogs(IU;#)z4E%?Z(`?f2!Tn5q@&7u*v$Q`(PBxvf0IO!YbA(;I0A`*Gfp zKVlpGGpCOjNGEgyiS-34S3NF?*Q^M{98rhKX5UIg(IPIbx0XBvA8-*VsBIE!erPoVWdkA}6^;6aC zRW~I!zMJWg#6HG}nb1Z^v#)pX4=&afA{we|zSpm|SSvBLj*bbQDb;aBUljP{C-592h2^oSU$5vXcTSCd)rT7R{i;rihp?Fd^xuN@ug3b`{(PQ0WnlRBIgz~Rlqe9lk)xz~Wvnk?X@1=1 z+cyBNkJw_>|6Bl9EQ9t_gGi+;BEw+UJ8i(m{~|-GOx< z1tvozZ}ODJN|VHX3k};FnFcEl+wJ#TDKyLi?q5@X2Hog4Hfz^<2xsP!p@ z4ec)Mrc7a`gYNP)ym91k+7Q))Y*obNmN3@ZbaWOIhe+!8aV?_0z@ciO99(TF5OGL`5 zrlOY5P-1y^iL-U-&0TTXR?X>~((~c}b}RiYnXS)Yf&PEfN?teACxwCid#yB0CEw51 zN~d*~c$KouY%4+b^oS0GBNd^HLT_SDU!iSTkG!u7S{N&xcfVWOaQlHgEEHL(byc!p zS(RgLYSC#Mw`r?!6Iz0k$9cVhk)BnO*D~*W+V!6e*Z=o+w#|Q`e6lC5t9)E_Mp2-d zL5rGSmM7fCkj{~#QuwpuuZyS@qYJ?h4WHsjq=e<`{p&E zqPhKp?k4VT-dKyaw~IpHt`Hk?-ayD55^|?C6@6Gz+TxCux?78Wh2RrE#@cnq>is$-E)qX%LGpgv)wUsiGTGm}CG1~5MQ=P3&YeV-IegQUbq+YyxTJe1I7 zC;@xQL&1;I!OMM0xReiu61sd!c)lkk9HT&?+fyg}3sdUoZfxfW*VGp2O(4r*Q~BZr z%U+%C-&VFKAR07#wbS8EXLeidj^A_ZftIdZdp80ox$L(xX)5@J@VdnDT0;yS@(uSW+Y`Cc#$o&~00ptYj?CZb`WhC{Y#oa!)K0*Q&^B z6cQViJwvJ>F31S*eq8N48Z{-={3EvIE1&yd!w(bLrp&(b`S^*l<+) z4Ng^J`(>mNU5Ohx5W^X@sHo==@>qD_2gxwF!fsr?n#BdKt<*DEVp#SqNl|+*e z=7uSVc8L9t3rp6QpnWC%?2TsweSPhmJ;*%2m2b^E>u?(bKgZ)I`rnH6wZ#FiY)>qe z`k{2|Q?1 z_j;%doxFSXwZXkAm#|l^1$r8r4zP#Bc~gO1B?bKp#%}cHlup+`F?Y z&Xlu79kZ@TwMyG=kS$$m{8e}_TlrS}YGJ}G(AUT=Z|WW4aQ4c^KHe;ps>_O5gtLG0 zBC(Qqq54gck=85y9g>kqqgV5t&cc-6jAA(ihRen+(&cVKw%tWZU@zxL0K|vAVHBtf z=aUQVuV=rWK7}UivjPB9 zEAa*M?uq7lOCyfIWnqA+-6@&)UM%|c6AqpDgm-E&a-)jQcKpnyel7z+Y86uOuk)=Z z`0eKX81QQ|@qnk;EbO0V;@QtJ#pY?R2`Nj554a*eUTZ{d+$tLR>t<`lIFh|wu zvP}F@#h#yur&!R*mT6_;Lm6}+A6YqBiGA#8`{?vZEt6FNO)mSQUTB1>l3$Qb?}}Bu zQ52=mgo(+Cu9c17#VBD5C%RUav0k23oU#()e3*0NuhEL}*25%(2BqV!P?)RSN*0eJ zWbp{EcI;K@Z(HP6bDo_wBa>xYT&mW2R+n{gC7Fi}sCeyVSS7kB=y)sT&uE5@J zWFxjK(lb-~LTD}tygX*CEsc3Wq5wKa@>H+z@_G?FiPM?T&(m}iS7tyWGV%#wCA=cl zCsU#qnw2B!N?PaQY>5!HH@=rwW_It=<0` z&B8xQnyO{qT&5NkQjCF^GWLuiibRQx-uFPyY{dUaA+Lf~yx53P>H_Hs89SzubNPBa z1Y;*=>yZ-kOR$hrsx8ea8e*HM#3GG)=(E@dKmII^q;BzI!E;kjn}*92F-TH;Qag&< zm()JCpL^i+rtC%^r_t<_y0m$Pjm1XvPJL6$QBJAN(QTIGR&9|}C6QStl`BE~Pzu0c zk;9E&>CtvROY6~gh+bZqo+0Q&XKY$9QLVX`AvwyNo_gQZCsVzPJ^|aFEqLueYr&1u z1bf+n?$HE))mN$pr61E2^acAm(683*_aqgL4$+7msUe(e{W^*24&}580!#&n^WV$X ztG-4H5xG5;e`KA$$(Lh_6=gUDkI+)f{S^M;57YD+OS&dmz#t8RHu^_rpR~RR2tAh8N<4(y0+*!)s&&nU5z~}GPIytbDvm) z`=+5DE4dGnXS|TN6$I`tTNAuGXLBe)qcg=4HRMfUJT zNi80;IwxBT*9&A>sW2%ZyUXn8dSWB!*4NGYqA{|+7328SwaDBwi27_&DE>lEP4)B1z=FUH5YLk%r$aU$U`aFY7WeBoB6m_Pv>kWD_uU8iv3odo_Nkn|ZcxueDWQ#2C zH%ycl;rR6vshAujON=4V!xD8gc=&6X*vSq)H}gv>^XC7?!FV1M{>psu1T+il>lkN< z#cT|NvKM3^tJy2=dMeZi76qv>)wLGiMUm#@MnT)y#Ub9h+Cq!vQI;`ixQ-Vu!WF3V z2*l^z^Kn<~#ZR=|$a9y@A=&Ly?)f;6WAN^jQ*jt*;#}f}q2kC}oXMRr>d4wVkXs5l zI=94Sa!*+tN_}14*?2VU3H`6s%ALfC>1@3?rlD?3;9&;sx{ui&an2ei`j(fD% z7?3Q!TxwTwUwqCG2;&uzis$EYqAGDS5=8RxXW)pHYWQ|N@9g>`&tlMQtit6ueOdC| z1}rgHvCQC~Yd4qJ^|9Aw8NQvXXsb?07w zZ0_t{47t;_S%PMmmQ>YS^|uRBXkoHOCM>s8Lir}S&57Za(0NyC)Td_aQBx~% z63Lq+qxY?S{sAT_Ug0rNx>9=N>Yt)<1iZ~K)+WiA{`GwiUl0hi48tD{c42=Q8VK|$ z3`3(*Mlj-etet+Wk7QX}h#;}fy^V`Dj zGV;6VbH2}SIf|n-DDKW+`#*qMX<=XdYMelt;a-b>t{_zlL)`hD>JE>Ce$@n?Qt zVYB^u+Ux|j#OLzMoWIPvHfh%Lo-Ak!_iqW~-Vx*H$+@HPT$cQi-USltr}tv*2WMQH zvfBv{oIOAeYTB!#cHYds8|j>`^e)U_-OB4lFZxHCkMDZuwuSJ@klYxZ7sZ+6!Z^(- zXD%z6)vXlw!Ce5_-tMagRZ4>Ly7n8k+ps|3y@467MTvpE+6p+?!On z!^}aGvZ)v+-y^GY1JAnmJ{ld})G$u8fZD9DMLReNU6GeACz4xD#Lowd5!_gm&di7C zjp0J}-0b8>sMH|N!WTqr(_IE85M28_4% zmL;$$WKKKTRn0D>l1+5 z6R}i25%^8w>{CVak(IzD6(^8{I+HYukG^&96ObM99v9Dc;c}AmTMNuFZU2xpOUz}z zq$yF#^9=W1rXTTeHbobE+~}rTC+m3_5J*5ujc_vZ8BkaFpk^v4F15a) z%&K1{HU6^m7a{1IN?Eseoea^6LP3XM$ayk&ND0^OT{5kC#-I7;yl%zivW3skOvO+2 zXr^UC9+_t9FG$d*ocE`ha;0xsHtKkiGC%CPj)~pwM{(9YH$lzLfpoodz`;?BxM%sN zee)#CHtBcm8&!p73SBCU%@C6Gjg%vm`lXbTn99ct^cX!qm4U4rsjO;L8Dd)TTL!vu ziXpxKhmU(u{iy(PUQda`3c=*tu-V6?Q+4vgD9R_!)=FaIU(H+*J$E;;(!KZQgoxdnl2z^5{XJ)mwYC_T#Ei zgtTNN$jMsg!|0)zKh<9RSPG}8#Zn78vU&@3%=4%h5I`p2f(B&FfjMs3Ux6F*T{+BETCi0Nd*7zxoB zj1M2`8}Kd;wBGF1?DXNlGJR(d!V16gF!gv67LY4$f`p%%!FpsnRB=hLP~AYGiN{34 zCHKac<;KpT_Ri}wSNNQfdpv|Yr|u(3yk<{e4l5Vj5@i|h4fAOoOnp{o96x0whte$5 zgk83a7>ctIIlGulZ1Z_0MZ``LapDB`+T78}Nq>-v;q#&<7eBB%U&%rBupV}$V$*)k zEa8tQ#6Wz-P!*((t{X1_O4u4@<-#T`DFi;+S z)_ynrrXVEOMWUw#vplXRbtj16VYrFVT~&wD5N-3=jna0pQ>i@+L;dg%eu&u@aSVoe zt`G`7d-8>7l_Kz`Yz$$Olm1g%y;a&R60O*Wt%F>nJ|wwdo@u*`2Y>auloWW^OG7lI zsqoQpuV&)JDR?-#dBL!{kGjaQ;2h2%Kc}~Fyzp1K;ikRi{hWSzmzGCc7Whhld2jeP z1#o(p5lf3e9^$jZTH9;1wf54=3C^M7ow0X|I(5B(qW*v(HPCjM_(Mfog~43tULA5? zDmuWK;8V@&cu>*K^hws*!6;*kciJCRmPh|Qqodo4wjiqcqb)PU^!7CTEk`>TsYTmI zKL4G~Z^HPkwF85j%W;^9l}%^w;EtQL+H#h?PzoO(<`x-v03HGCeeR49{z2TU!&od$ z&r9cc({tToutU)e`;eoOqg94L zGt=|j(#3A+I;V7TdCBsVB_dJZu7?H zp=?CSsA)1sNogGF7A`Ex*oYz}V@j0Vksf%lJ_9elgO^pmoVVb#jw5h3 z-(tPJaXZpy`(IeuWpgz#3wJ$^klkgCZ3%WhPGCV%OG_$LQnhEs%{@T1e2Ys_{GwvL z<87Y>TwAaPGjq-nCujDpv=T!BE^c}7;)H4Eo@}!m>FJ>$+bnzhE;7v`9c9`?Zlv&A zMLNhdNtINDSPsDss#(R+*w>1W4|ls@5S4j87?21H0v}?>~DUW z^eb=(xg`~Ig4l&*K7%v&Y$fSU2UD2+bP=XhL${nj9s9mL?nq$>Wf6v6yqyh|o$#MQ__PUZTn4&| zKVneoc@Z;&GGEkjYVS#Z9#&y?C-!jm)SJE&FFZ4P$2;dSk4V%742XhNDme?%Oc!QhXiyfN%+8jPRX#w zQMWurlFugz8L)f0$L<~(Bf$@yX&v#d;aH&@gNofDlV2Js>yqW5VlBKAOpqULaBsnLgFT{}1uBAD^U8!~sslF2(En^7@H*c?Eqy3!cN2xxYNvD>l4j zZm#_`@vCT>2|9Lb_Hy z4*KZ<>8H!7Cl^g}OSE=BoXJko{h(R18!z?ZTy2myiaiw?eGHP7RllE>h}Z0{ie1M4 zZ(8-m+S4rf>DC-h42z#=zWj%^q*1=$Ub*a{cxP{HW8}4FSI+u{|4E@;cy9nDGI8DT zA8^(NMn4jaq%Puo#@{QeND2ke5kd_~)G+Vnj>Pv!D&F(KC2Hh_i7myJ+GnoXQuhG67=lD=S*2y*H3H=zm)qzgBpv19DgQ-zy^7_G52yHQs2 zulFXIcAQS8F&B4q{o`APtGM)4KwsPAH^dK%qkD-Lf87`Ii~8>pSH^D`KbWX+3Au|r z9KAej=egl%fBQs)n&{||B{w5C`+Qj0-?fM)Ovz7KYe(gNXPd}R!M!*I4cYIFeBN3c z%MBk9`ECwk!&VWiwi>Yt0YJpd@}Z((DIea=QHLYjiH{`44AWhn5klezVYI}w;|MNx zYW(2&Hmq&;`O-YO1b7D09H7~KDFKGESot9}gdy$EYnLl&i|LLsTEh^Yg!sBnEt$4E z_6mfpE`xQxb2?Q5h@HU7AsD;-i6S7RzZyUE1$(f>*zYNy5>M!GvYmW{U-;Rj6P0y} zWOGhig>nHBQG6h61TFDB4l}3-rxHXyp|f~ZI3-TzIkSAX)Y3Oz=!vD%7Ca!B?us8O zioF!CNlG#JaEV>m1M#jM3Di{h#${{m{9`cku}PoM<4e~Lr^DgIYM?bU3bUMj(5$Aoes*Ji`z3} zGn46d!2N&r-aRm?;{N+TfdBym8#F2^>Z&N>OU2fDHZ^{-J+VND2@7+rH*|I*U8mrG|{6^XvU#%{|qo zO45^NF4dYQF|{kd_bj!REm$0WOCsk>0$h^do*O_B6`38~TgBfbqW6$<5 zWlG(bqPF+c1F-UOKMaITBHQd>=D$Jpo<7DaH@Yv{FpI6pyxSj@10i>i>xbUp zJho+PDmSstMr!zy{nQG1=A^dq=PRD`#7RlBdH?5nk@wB>yZP%*$#OjFVbfqUpV2hf z|Kect#q|6GSvPO(Z(ScqUxfAaP;YP_x4aMAR1XfbVRbow3I_Mk6@Ll_7wC#V1?}Nt zZEihUe>yb{&XXHdrOB6R@Pp1Ms_D$x!B8Gng6jAmz!vZ;siiwk<+)9QwQneLb-rEV z=C89Ad-2U)g5jl^bYy4%AL6B)$dwpjCo&F=Y47r|H=-9MzDMGlF%8Hu)IeGF2LPqm zyi$j>+WOtmXO_`{;CJgc<*vseaLv(!mp&^W__ML>+S?rYOLEe+f%jrN*oEvj#(NVb zMcdxZ2MCPXp&Z>w)yo_#QCC1a>o?BqgSd_irdm&8nAt){^B>HrZP%~E+GDDx`gT)} zX*IP}7vIk>utRbZ&JKySPC_JH_;yn#<~^NM1uk;HW+!Ea)Hpdmax1cZD6SLM+?QL* zyM#jx1G$fP0-1V%vF11P2-FKdklfFB7arLnj~p)PdK2>%iGk;-)?;T?zE_@0bU5zZ zg4o`{i?4`n+#K7R7mD@ZGi-C)Qr?~()0Pfc;N50*OlY1NEkxd7TpsBwFS)$g7hSLC zo;C|sIOSwhS)Kw~vT#dk4v%7c%NL&*+dCu_|FtYe-)`!Ne^qtyDGa~ZRPm|U-qDNu z$My~n#qTmUx3&!Hh@d)(N7=7QBn)2bZ(h4JbjKsyjO`s0ieF}YlUKZOdni^Y|L>B| z>AnyXe$>Qv-584R4#L?H)yo~`N3-IFkpSZFaGP{W7N(Ys%ima!o})V&>K>ZHYz85!XYv6zZj+o7*?6)}bZr2AlPc{hoQJ@xbY6p549QGaDlFY$4C+zNVtG z!zPSMsw&+(a8iB5OMaFtMeW4=kRYS2XAhHtZL`EQvZgYf&6>Yw&Xq~jE~{&(7*a>d zZA$S%1g^aLGlDeplbWJp=H_x08?Bc~g6*>UR4Vk;`-%qT>+NR9jNR5bks@b35613yJij*RIlCqw4*Jk9DIjYG};pVLy%Hf@=L4V7g8@Hwr4=} zVslPo`h>umpMGNsONOjWMh|aGPWFwB?a5i(f!tL0Dp#R9*6|5_T2%)=*_b{haD$uL zBAK8}iX2NxEEz@vvVARqrCYmEErt3ap_{HGImuaSFNSVyDa|d_L;`WDF_??Pr8Xkrj+XR5z&`j=zwBnJ0P*Tu$%T$Y2Z*(J@Xz<=YiFy?J9Cm6#q zPtmh+(%YABz<)Ib|NqZ|xIpMDskq$+V$OELk7-1Ci$POq8XEWMu{8kQwgsR>}#mxl$HbGtv}dHk+d6@I$TMFF#e3qS`i8$WhxNr; zZwTG-Q)Go$>#?ER-ysCC)+<7Hj5T*I2;Ffal0&R%d#trv=oU4jsXjdMjNjTM5AB0) zYF|G<4jM>5@)8PM$^61lgVeA}=JyCS++{9$qRe3~sF;3aE_#KGN?__KEi#QO+)dJO z4NkqGTpl>kemLWs6?92R?#A|w=7%4l#y5;Dh2j^JRxPC+xhmr-bs@o2F^Rp+=d+wP z3*k&fF(?#Yr)S0q$`7&sh<+P~RWyC8swa#mOr5h#Hrnc(HrGxF#b;&SZu?$3q{4QM z2EH^ci$D=1sJF%>C*5l`N#+YWH7O$;1on^*znt)1qlx)N1(8(@2Dlp|r}3G(^{ID> z-B@ea&@C?z{MF7mR2kpj6^i|uUqKFg#74|bbBI!}(WHc=D*|pZu~D2n9!a%~fiq>I zqs%a@moQH|m(b^FIEhEeOQ-OTpG(+*ylpfl+V7y?jS!S#4b1}+MOHW$Qa)nu|Wq#hyEY=-jCa!GE(Og zE16)KJH5;ulZ@p#6uhJK8`Vg}GT$eZzeK_Wnr_3B>`b5$?|Ej#IMi?hk-@IPAsb)5 zGul>Eha;r+D5`Aa=a5I9HoyHm(pBEkQFj>&TG+&-{dTNHuSzX{ox6-$TbK(*3bA# z>n8LC*{+we$nDG4)!+q#AMY`(mq`k&zhZv-sck)DtsB>Wk!4*y#qWLDy6NNCl#A_W zz5Xk$8`sBWSdmXU%0KZdLW|c+Vyn~x)WJU9eO(h+QE#d~F-x9rob~w|DnV#|K1j=ub zT86bJ*vFXPD!m72M*U`0t_2;iOgX>e-RwS?)>&F1%QVTfMfGL=+um??I5(|}ZHk$n zURSD@Gkq(P z?fsT6(|iXhqp0>8B^@$Uk}5?{%v)nVYMR2-8RmwcSn9YPtKY^c+bgAvIc=5S(BIog zG2OQ)lDw^tZPTp`#VKs26K6h?>BlW9NNrHK=`WiHq1fa4X^WzIb6VuO&!^?}wokwC zjy^pvzV8QRC!KIjU^0ox!WA`FZ4nS#Bilu02Ctb76833? zwwTBWEsJ1f-w3fOU`pbAo(9e|3{_(Jk`CgeFCD0}XW}T;+a#r*4?57VJzT$|zWVQe zFKKYj7n#~*K@HIv|0V{OxN9EgyMB;kdwWMZ$My~k#lN8bGqITGns0m7R?^trVSK85 zIWTfu%*0A>R+|`6t2eQjKFq&XjIzCrxo;*7m7Vmty3@^+p)Ue9m4#)|TVtd|4WEYM zZ?fWX>9guFnITknuiv~IuV&)Ij5{XGJ@$t`+%rMSY0BB-u9QDZOgW0IASu+-F-6OY zSsHga+ME^Vu6YEjO>q@u`NB`*^o_B-r$tY4S1P1Ursh(~YKqIU{I?i!O%_Aqi`!Y!RnlNiy<`n9Ca=VMl6 zkISC_ErmRNm;W_COSOxxUn?IlvNt7G=c;=3K6fjYzTg7uEy2q>fAlo>Ty&G%6=YqmAMl-43EeNP^s{xYGa z{u;J5yWTwvDJ1msjkdp2M%`~d+1BgHq^<^t?3YZ}QT9q!sx=73CH5LGxf^VxMh?lu zjOiPtwCKf;I?k+RHn`YJDAhI5s2*e@q1-HerXRi`|Am%ag`3QRbun?4`i{QybCbng z(`}6H%?W87dYkq7s8`M6BKzqOiH&a==JE^XBQ(ce54~fRN6+aAE`MsgM zMB`TfMy{MTm7s~%#0rU5$(^=Qn#`bT5F)ihjN5o?%$xHIy*0*7eB4MJ20qTE#rc7L z+mvHToRj*7ZnTLDaefB1wkj3nY+L!#$7M=nT9$*F6&YuK%V!4?kL;Js?1-u6$C%Ci zJ|~U?UulvgBuD&s)ObnoL8hlnhSmU>rbXGYc!K33}6?gULZpJ0+4!I zm%g;Z6h7)l8F_QwHopjkKMvxdxU4|yUX6^AqdJ5EiPR!R?)CYpbJalGXKE-?l_u6z zw7p+HSxARH=jGOqG+^EEnyRzbNudVmn8aF{(kaI7L+J042TwPz`QK2lKtqOFpQo9g zb*1`ZJ~mLB2sQkQ$EZ%Q$q`;`d6vH8&WvB1a!hY_J2xIA+O}prV9eD?HR%CwJe~Ex zjFFT{R%Fi2jFF^HlQnve-~O^S6^g)GM;@ct6^hr&KCb2DCl;)Oa$rGir zXS?<$@~FJplHm93NT6D5CEFZhHr&T+rfc6>ui2qFb?tBFK}rd=`c^8u)NJhAF;#0R zhcIlxQjkKXC%?h?f+xSqdSbfp4{^h$$9J=yWu?dJFyYV!=?uF!yVn<_=J>C)BMGm| zdd2kAuFwsMwqbvirnrCT=3%;L58-DFUS_ja-Qa(L;GLf%Z0h?NAR6n?ETwl8Unj_a{o_R zzk~bPrgk)34Z3&wes+tjn|h`h^6dA5>nH8~Dc0_!EH^sh?o(O6hf$h?_X1Pj53XCS z8xK=_bT5bB+pYUmm=_X{--Sn!FK1J0h|xsfv&@YIzhyo^LOsmAA2KkaEjEK^39fye z2Nbgs%ubrcJOvnZtMb)VR__X#q&vH}(jk*xcH|%${cfufv0Kxq0XBP%W{?Wm!LI{r zDp<5p%YH@8@s@ery@9_NKBDN7P`uN*$82xd3sAO4ecbDj= z!6}!eeQ?{!J`U4gE0NUg$==OV%olXFB}U zkz4hv%_CLDBayS4i~%am$30T(F~B;iL&BprosQwgq%axk=X}nj8v{}u4O zN~O~@Y@)8D(==>2e@2br=Wr=CIZrD!IZ-wD@0gDHKFb|jlTn-?wNCRU3`|^l zCN5c?o0!tt_thrlKqt07_hMF>4V&pM8scs)b%zaPmJxY2qZgH_2AKIgMN^>7lF0Y+ zDpi2TnR?ndc8B|N-_N|#0;J^-3TFwnfZW|9blc;y#m`GZtdUC=uMge+J@a03BDWLy zDlww4_@(HO*t+hjN>&dwCC4tnyAO+;$7yuh%?Jci7AMWCO*0G7Z3CV-tAsWteJ*aG zqS(y@9LaqVZlz5Hbq!bU2F~z&P&2n}^;aU-=<}VcJo;9|lXy3oN-fFuAL$-i=0*2L zO0X!##HDx(EskBSgbrkESNl1+UZ?aiIqNv3xo)=(f(@BOqQAIpFphAv zY~;t}5jQWkIJf=WPN;OzE^!<$zGxb{g-i0;4i;nRWTdUEkVFe+3!3Df^b9^gfxycw zlsU#5zdcb{;JzMvDd&~X(c~yu@M!MbTz7Lim;EHS7Z2UO;2lyJTV8Za`sl>K!`wYf zby~@wS6aQR?#{iqcx!#GyEomw-2J@xlLhah2CW?|KI{92yKu8N3C**TrLEn2J6f-E zCefVgLRe!9H|L5947|8rhqTHhL9zC7Adf$dBq#%b~3?E_s&^YytVFg0<2@# zy4w<-TyddF*jBB14K-X%SiJFD5YqB;n$$N(H=ew5o$R2sF*$e6X=L(rAGyfhAi0U2 z{Sx`beLvR=Mgy#8ufBVe17#h(cO91*cuw)ms@t83fzQd4ETDXm;`L(ATg9K&eO|nc z9yu0rf>ppywx?cXoWi|4&)t@ol3Tp3j&hGpg7Z8-KIc2y^-QHLm-X4njb&NExsx|l z0py>Dwc?4nMCe5PWa6b6hm;-Cy@;1)9O9h$?7X!Qhm^Na*)gsp-Fy@{wiegQ6+#x> zoWm{`#x3Ph>)44ln-W_(B-F1?$f;+@HL`!G;qRLNK;s%QXlra#Y^{6a`jcvpF>Tu z>JZ#6{-plpWv^(Zkn`$x_m$Xt+t;VscOG(39(pMsc$YlMqUt$s;TpPPiGj?jzrFBB zdNA(E+%y{;aj`Ski|kaFAJ>z=ppB5Pr3$Q|0F4Zie3><`;n z8rqp7M%b|BgOW>D=hnSzKgpJ=+m*`(qCfTag7DR2A=FntayP}cZ)dGy=LPNZ z%4jH(3MYe}pQP~tKBm0AP+u^@4{q`})`xm}ggg5oY zXlcK*H2ZMuYvf_eXW7R^fP=~QP?BCZqb(<`4{|uE9E=ACTQ5C_R)kF zC`!MJ9u}LQ9nF3Or!Qxb60Hkj%%XR#1^)@-o=u#eexi5D-rNzzFL+n&&6^uCxhpTZ zfsq!{_{7+r)=1~_#Mm6>6BfL#UkBSnbl;>Ly($03cq(4Ri(R|ER#Idcq`ct!L z(aSCk#c$)s>a$7R)KC5Aa}MEIzqj<%+z$=iz(Neu{qsHXBj&~!vz?G$>>Y-Cb06nB z8tz}MKcQj9W@2<+a@o_=owDJ(_YsWO zNOP>6&STp>6JFN{WEpYDNaj?)F9#CL6(xRy5S-)Q4=pB+4Y7iH^ARR_d$K}BN6d$a zVybJS5>NHti+5GO?<2(bbT=U;`a-nnn?z4wfqpJ>U6(e|P=e$qR!&S+5~)09ZCbt) zc}tI;Nxx4vrAf?ZGn&rsEBJ|3LCu|CK}Z_8LyZ8vXe~M8&j-;dw)STPo&{v%w&oUp zGWQg3$kx2#U3EvZbIGuch|$Gwga*HX+sW=M_EKKDp05rrnbchOf?wB`4E-P!yMmi+ z=Z?#fO?lpeO}XUzw-}T*nrgvkrt348?8+^E#k*=(UVX>nSL^$vPb=OzN3H*{BWU_N zvb^lobYbxewwx3s@1^@sISCIg{&a2^_swz@lhy94{5sS$90hCvGS}D%#or(kX8CC& zKim8?4nMV~*JYJ!yPQzt53hILXx2Z`^JtEq-g&Pd<$mJRYRvm`sV9>pTUjELMzrP7 z`JEg(pXcs&Uu6TJXGntHtODWyg=WJ&@@O5r=I4 zz?P=54|CkjiA(d`mlGq1o$o{rWvS;?cjSHcs(V#pGXouYQC5jp#d_}xOujm^)? ziFTs#|2EOa^CI(sleO;9%p9yzOG)!!hCnEiej%pE@?i2vH3BDD0m);BS2MVzLpnUR zv;HJ`n~`CnDpje9!N(#v%UE0%(Gk>`)+534@x{&gIqRPF6)vpL$<*Yb- zFnJKqw8zY>ECFrljve^I-Rz%7?fH5=cqH%m4K@6( zb`fT#HM^)+(&u`KiCnYSz+}V})?b(R`;+7=FPMV1?0LMa>9v=Ar;F$3MW4mdWerEmvB9cd=H!)3&RfvP zJRW-6Bl1cv&tKSOZGWDors3^``6}78wR`b~1s}Oh#d{W=?=>m~w7qp}&f;7`S!Dd< zP0~8AT&>h&me_yxXyHc-jO^R*`Op)_`SeWx+X-_psftG1 zXTMfxqSAdiJ=jK1nSGlGO`l=!T^`)?9g?W^HAJn@vQ3mlBEYDYY|<@)=j|Yi-ENkAqICw7qi=g_OjHgu+Q|M3DlvW`@m~t|sHO90%K?q` z9C8vPYoXirVB2dn`T2?Pq#WmI&9bz(-@ABM=;`)EstMsgaPsrXrcv7v zdiu<)iBRj~eLlYKG9s_ZTXCKriDn}wb;L8?qYf-E#pj2{%}AHEw_r7O2yy3){UXRG zD-}H^tEiwSA7=hhjl)X{faXwCY*9SlkjOt)B@69)t``*)!fiGlO%21|=k+J&+eoTc$XI_IH~j0m-nlJuN8RLvy4p}ZJ7_5?3i4_G^JwdQ{40#m6d6XLTDUB zN3Xq$U#W-9gIX@RiLl)gJ%=^r$kL%z(@d}Z#V}tHKPN5pb=nlk%GX^kon1i^~QV4%$i6)9A6HE z`;5O+ukn6tZ~MsQ(wJyav!LQ7sa(z~-(|Hee(m<@bN&a?cp$dxuu#JV$VI}k`Rb%c#bB^=YyrlNe%I%neS5$^g1(M$~tjiJ^s_vT)}#;gxQFBh1!~Ai>bCEomgCD_FVBdX=cOuQGMKm%3p$Q zq*sj5r*FvhuIS^Mf+W#uMUif@nV7Css1UtkALX!ffq9ZX3b|^fdGV^R`_k2BBVGL| zF@7`Br;*5R_a(AN0*UMqTA7}YcJBF$VXR<9>@qH4wZ+T-h3}Yq$zyru;h&LJ59Wc% z@t=)*)W6&8mv1YGwWJ{A!UuZ?!j-9Yi3c-9%X9o`%73yC>M-ekEQd2yJz|>Y zTlITKzRTVUB~S9Yzbc0zje=gI4vF*dS3eZ|vQZHXS2k;vFP z7;h?Ow0DUA=~^uL+eG6=@`81GCDiaY<XAsOXye(!gnx{W z7E&WHUpo~kmo<}9pJfaMw^+9;GI8s~A%$~4pds|HKRj-L^d z3;*iBd>b!&jS2|4#T=sMTXW54%nk@mxi{mWQySZ)sl{RBRgLlYF-BYk2`3P1Ok|i( zxW0QP+cL_j^@)D*^o!#W&*;upmgGU&kR@n;mA$lxl&uVkXrqn18$4PN)7 z)kLxHtd1|+$Pw7FO>AXvWOprJEX#e6>UD|USE8$qDTqX3^ZPi_!;#=}ROl8?^IeE7 zc$8ULwo#UJ7!)J=GsuJfdbdc4eHPq9=*>a=F}_$bqH}KgNbA!2KK8v|>E+}#sAC{7 z(M53kGk1LUS~|%D;Z&0b#U`!TK*J9V0WAJ?+fx;s4g}b3Uiz&1G^Ud?eR*HRa5OKR zp>Q)v)yn z9PKh5>(`0;abZDDbTT`{#ol9{BGQ?0%C4yve5#K2UobTg!PaZ@@)^;|_X^l=@^dp# zb+9^JJ2lWX_>W|@4Oq>LUb=SjJG7lb@+4iH&km~ zKQNi@p(Vrf+qoNtu{rtzj+QF)7D>1d@hcf!kSu=-P zD4N7;(k$pa#wa`VPu%{EU-7o)L`-F!r{~E{#}QG+j^g#EUZkk`rH68|(BGUXy!RV9V`5~7?O!v(VK&m0Kod;3`a^+g zjy_4geuQzaX?|CKC2;a6q9)xRrQm26?r3hXD1AbV6^8L;@*;iywgxWQc{{~~DWshA z)##b9Lz8rt@U`~p^+mEqn6U<-^h`%T?dD5386URCCrNrOJ_^bZ&T~`e$V&&U9y^t=NYSvk6P!< zy1WX?zZaKFo|F2cITpH*Qs>5(>lV45uNxIp^RoYWwwq?OSm8*0Pj4{9#ja55DJpAv z=G9>7s_DZ}6=-`pEnRI-ma)32^bvfk+DE{A#CP~sIXprRx4F4S-qGeC8$4svjZ1@= zud$(pe`#*V_RL&7D7L3~@o}*|$5HepE9~iwcDlJZEpqm1SB~#seP(RK#@L>YbN}Ks zn)v$8cb`;zecJkd;^J?`c8BJ^_N(p3Kq1tm-RT)Y^HU5+DGfXxmto-^vW z>iz5&ve=%vizmx>J=yPzrER#y{$p(Xw}*WIX2?(Xnp;(oaj`wKBiF?C)Q94u&1cw4 zn4J)F(U2U(@7Njz+=>vP$w#kUZ}!e{A2VlU;TyS1!m8d6GrX)pFtE*_1XFTck%ac1*LCYP54CDetuO3Yv_!SlYHp}?ve|7xJ7M6E#d1fCrmc}JXvPDLGw%x z$*%xR1~3&am5qAp312DJWc}oN)72<+kH8bl%6QH9)}P-r-fE~KE?jo;ZIsWL5%3pG zv-z%{p`-b!$uzQ5(h?16ppokmjecG?Uiu{YGYOu!{YS#!O)8W=xZfE!x+m64ezEd= zFP)B;^u}X)BlwQnG4(jVvF|7{&L-LdPo;+AZ9Sk^r2lAkC{3P*|CwB+@sQY&yCl>w zj2>=Nyn$dSdTrj{M$P4qASn+vngYUhlR+Ld2}(}%mu)Lp6p2Xp*q-yFJ@i4QFH@QY z&~=#WO0Jberl9i8-+jUFtfJNS{U--1Ah$1&0;fYszi5p*HtTe?nv8ecq3{IG9<9Xwl{BOf5|C=|6)Z`Is zl~Q_7eeCynH?~HuIqZUBs*S`GBSug^`-^@^Nhf)ps^CU_+Z|@VO$>9>N&Y#kMk`R3 znTg^iy5iQG1HFm)UR;4m|@nZ_{j9skOxlC6@hw-yxyuXfr< z=i=h%ZubHsq-d0Vr97-rqm^<3g?@C0lEu5YH#wK}csNh{j^HQ5X#Ft(#w6$z^1F9s ze#_v_Inl9RqduyHuI=MBD*D~pQ?pBX{77=k>Jybv_oJatgd}$#tB5caftKor;-678 ze4%R*RuU6)+{tJHsO?0 z;Yhz`3R{DEZ`t0a+}-{Lw@lfk+-;bDItQ9L%5QHz!hLCYEqj@ImULm&1RrQ?U{Y@) z?Z@_n{fgdm7M!5hzRzp>WQ6XYlgg&Vej9htYgNol&L~0n@xn;FJnJ?;xFi(6kvIJ4 zKg)Vs>)7S(KwiPyZ; w?oS`U1qD@&WO%|my}iRQ?+HpM+U;oFx$RW`dhy;QM2q| zIkAtJX$A-m(8^p%pG)zgYApCt?7U8%X^Em8q~cnny@X8z$aMWYCcTbjQiaW0ido!q z+YM;=o5ek>5FKBbxOBLid#i047^%xiv%s`nU?PUCQO*j`}c@l^ieQ3oH9c(q_SyZMWtyhT)#8w>Ed>EgKfQrfYa%Y7>#5 zubUmGbE(5_BmPnk7`tjL(Ry+?a#jV@7bXe6I&I0nk#IpmDt%f>?eyt>0pr|f-!gk_ zGk4!v^&3^OS!H#vpBI*u=@Z%M*%ri7o zDS2s&|4xK=2AgQiE18(TU}alUsteXyP`n}P`YD#Hu~)>%OroB^XMlILz_vMiDKtv>Jf6I&?Xd^K@a@L$w|a-AcQDgW>6oc=4vDz zxr6>`X@TD=`x^r_nZ=AlmArG*4N|W_?X)k7q^}Bu;ddo)NC>flM~SH@qg%~DI(u&V zBh<7;SSo2Si_#Fk_{n5Nx%x`ldumca-RrtK(p_nq9rIUrS?pineu}17D3E9W;;k@N z67o#aC7QFt^mSS}X#^jW`mSmPlO4P{1&Lu_FpC|!3Ycvx#=G0|D7A0K=NYj{q3Cm*m>Nss12I5FS+EVyg6^Tns@z1J(1hF#AJvC zPX^tZ%bLpj$YGl(7vQ&c$QcrQk`vU^G`j{-m7_mz7Ntsip6bcZ9j;P=tstPL@okOTr2JUslJ(Z|m62-$<93aI~BR|piDese-PmxVd{;l5i`z5lQqIyLb zT%#JqyNpR}b$_(+ggou;Os=K0nq3wfwvf%1jLOaNPo731L-yC2i-P3yKU6Zf8|R&s zZ2b++*w$0d-zw*u_H%VN<0#W{m$A3*(mW?q;5I96Us89@6qeW`)+#ns=#wO7Y9bfp zWFsx_J0h)+*p}q+-<#YJUnW_D$3gGxBQZ%!|_QI*;PwmdSqVoncK-OObI z={KvE@=GD9cvw)J{Md4rnupo#M=3E2$ARy@q+Gfa_0|7;-i!l)^ojZs_Q;3 z`0l0#m;!DipVjCn5mAc|Ohh{7#9Qcb7OC;QpLoko4V3?fT4}SPVqK0*{R@_a5Xg7*+w@xXCY6pEu(-`o1P^OMB4Ei!DM9^IbeI zTENEOIULPE3+SXGDl6>7-67PVAu^R!ouC)w;rM7hFV8J5M`d-et~IVD1-jPm-soKK zvOM?IzAqMU4JA(EVet#0n~#wt(;l0leqT;XK6$q9HHW9}hLS0{p_~7v7MS<9C5xy} zTgvluXw;Aw*=1TO_d1VR5AZZEIH{NPV`p+Gabe}A-O2O#(K4(724bx4zR43lcOJ_}MJ6Y{bJ_qdS!L zoe~_l#)z$om{%55AR~JD@=D^SwFB_m5PxH7FJXoQG`Mb>NGemR*=CheGY62X8J6S; z7fMdFcT*1#KUDHVwcFVZXR@!}V|U z^cwE5mpu|UIcU^oJn9d^Xne_+G|do`@sb_Mmq%|X!=rI~*AH*&UGiQ0t$D>(5}DV{ zjD=8Ce)Bzqo)a%dqiSwXvRJzXhpB->v>S%nndyRthHi346}XG?`q}0zc0*4m686XC zR-k`EUD8#h?#K6&*N^^~XsczT6sFWqLt>4bO%)!BKdPq0w7y<(a`1EJB__7jM*8FD z={2@-?w5+ILBqW(<=#B~*wCaQa>u`Keb@Ty1oMZdN{@CETFy;;#N;!w>Vf;QBb$@IW}Z~CPiWa&SVk&f!e{6QkuL1T#gNI~ zuF}K(fcZo>FQu&tl0V&GQbo$dhx$>-2Dhx`Z1Pv2A}e9{yjW9SdVyat9(W1}MOHL; zb|lZYpJ&2|Bb7?>qQ|?(YJ=e^c{ssB!gF<`5tBjh>LrScs$&>hWe;}CarzFQtv?{9Q3cWx0A!J2j^z(b!kWfNtnk(&~eo<;Yu z0Fehjb3CQ`Scu1>c%XC737SeVv(`s5Rr0rg&)wEh=Yu3?@khS0t zJ@O!jNe1rdM_KMZzxW2m z?QdIJOnkMz=T6Y!fRi@36AIHU?t~uco$iF5=^gHbaQY*6La+26R{w!ql745o#@;Dv z&e3o@^adp=@nd!^&eLIoZL)mZ?5IYN$SY28+=yAL($gK^?7pNv!u>pA!G6m#Igui- zBeVD3ggk!$vrvkx+A$|sH)!0HVv5r`o@^hzj*unh<*=xr7h|d{%Y*ZDqN<%d-+)+vFylW z$aK^riAQp1R;hTIrRbs8Fbf$nl3Ae8W9Ct#$)qBq#^}gX6~11X`SgsVcM!+EqqRl< z)KS{vHb+q#$vC>)4S_aRV#yPI$ik?LaBN98uZWcuI~VVwmd|+}1+t?T z>|9HXX&OgKo?Ip;H@GFXk#JeN+O{QGaGI5SdU50|rT22*oN%1k!K`ewR-W4e$V>4K%3I@xZLmN3G-K)3(u25KEAO&>{>R>Zb80^{HI-VM){oD`IKP6~= zy>iu5nhU0k=iW*0tCVDlkkZk=VSX=Bp6~AU&f~;EF31j3lt+?B(n%&mwvMJ%L+kI` ztisG~MUjuSNkj8WhUbQEt0h;qDYY!achAB!U`8g>&iBlOmG`80F!X~=pudZ~Oo)2y zD`avla=E6YU2!UZAmOjf<&0HPzt2=SLbWioece}H!9y7xRf|OR2kQ< zISSU4af&txIzHb!xcC|NgZI}W7n)LtHY9J7nB)ISGPaJ&v-y55ek$Og)wy);@)?67 z@g`BH`6ZyQ$@;ANE`A}>i^YX1wK%6zTb>^|7(u99Wp-O8|1+^cYu@HM9aO61b2VT? z<#8_kuJkIxn5k4^i*h*^D}T`mNYuHj$xq#x=~Q2E8|5SZmb*3jae2ui)iVp;)$M1v zZR>#46I=&wp-)Ek$fZmKHQjf4YO0b>?DO}1qEY*@zm^Gc1y*@+N2vPx4|tL=GQ}NzHV5Q?BGhGv(G}}(ww!_(5Pf5mb`F0ZOOF(5}od0lG@#~BKrb@r1Jl0C3&u$8;_O%Qx zD~yY1%gkAFWLA!x-ni&=qCNjfw7rh-a=gp)sXft-%KavCiJSjTqJLZTqw?Z~NoDR4 z`Oz)7l`O>#U)0Or4DlM<8yUZePpZ}tY>sj(YM;4tLP^g#;mu)O`- zHtmF?48|;zsg)B;`kqL7Qvg0=*f^FsUt)h-2U%OM>}!jx&$}66<*|LA`d>;cdAgVR zM8?`}2e!6qKWmkNwbm2+tZL`9o_MPHTV(#8W&WOL{th&MOU>UQ=I?Ox_Y(7WjQKmx z{GDk2USQ->o_xW%@2pa%V#PkQ*>)vXVOD; zQmFT}&g`ozX82lXmg$NSoYtA+b@hy{X6cG4wbq$8>gs2@a&`59u2$&k9$kH3SIc$v zsIG3-)jC}*(ACSjQnzg8JGz>wE2E@7Sy$R#AvI1{8p26kq$`F!oK&f+bGuwVVb8lRYz2m=L78&5os+n35 zsj8{gHQpV4&9#+Nx%A!8&CJX4!KD?|GYD6m3_YA$6RnOo74olBR~f0Os&-~qM5fLh zP#>wN<9SteRm8kkIiqr3?SQ(<8GLF0&t_E0>B@?_jNQuWX~AbrSjU=R52&o3S~HFC zx4AXcM9To&tE;T9mwQgdEP~T2rb{E(X2cy<78 zR}P5QSJsWFo?bJ+nN~GbaZyoclEKEs^qRVhD@l&2HM480W>pTTsg<4j0miMi+f_5F zYw9YeR@7Gxm>r!JshU+)U5O_ngsXB|V0n5~b;Ycz8!DY?mA;?rDrZ&l3Xa##H?ieZ zL?gK4-yJn}NXAFbsIf!kduMcY)r?C`d~(YVrM*|rceyt*8mYKumdy{N#`^gpbKB$q z<-}2A{Qx?p{fkPA2AoxTURA&TlS})Z^QDkF+|1a(`g#73sr~v-?RU=9{za2Z`=6D0 z=^w`fZ=bc_+yCTEg?YgKukppAfBarssC;h*wnwxjlTE-(;0SyF16U*U{e3S74};VU za)dL*7S+i&)>Tfat%y)WtEXHOoj$#??);NSjHojIM(ASlje{0WzEMdSWXf^#Yb(c& zTR1{bMogZARqUO7@|FG1K4re@F65(`65x~`A7q8&odekZw|T+g6F$9I)R3S=NoA+*+?x>{b$mBuwP@3tE;RWMeRcYj!umzIsIDE znUYnd*PDdRF3-o?nz^mjs5kXwrV$~!g3Q|1G}Jq_HT98^s+k>XP5#JwQ9Xxhb6U79 zqlIZgqO&P>&fuDjO9{BwM&J;4w0ll7adRj%KBFh^UwY4-ZehUyZ zoo%k{6U47_!hW$$uozKovV@7Uz~$L~doox}R9)rlnmLu1RMbao<3VE^TpBSzjjR8t zUQKpnLdC3Tr7tjyo^I2_sj44(eY9fM0H-=S`*A{FX``nPRs%o4sjaM|X`VecNEW5CZL(?GMj4meT0=iDPS}}zRsAUr^wOWK z#x&DF`ZmX_1xNbIv<{_%vTG%>`~dQ1+fyF4RRlq0oN***^d{rT}h3V2ag!xj2e2`B_l=+b;@Sd&a7}QoK;bMoin&PQa8&PQZ=J0;*{4_ z)XsD+shL|@=Zrykj5uSW)l(zR*jfsPGoEZy=S=jiURF~#4R=Tf$9H@DxM8RDJLi(2 z&g`msQ)4^THR1YbZEa0mBwSS;j?Ap84^OSBo~{CCBu8g@Mb)fuq$WI@yiqqlOnI>~ zr7sJfhAcSsy08ggn9Nh>L=lOQges?nBQ$>DKG#HN^i^J=)vTBmuC1s;APbw;**^1K z$iCCMCHl@jBu)o3-91mzUR_j|%OD-e*vMmp28(*oHtOpvN;BH{W78LAW9ko>e(L621l@ zz7pyFz)!A2G^?Cl8<`*07f4W#=>#mG$$hBNg*953I#~p0#-{Opv3M3Z3Kk{yzrSg6%CAG3{p%ba8313q+BkWhO`~3`4Zw8^aDWSI% zo0R!kv$%}VrRAHrsIIpBdz; zzGsSjCS|jp4Lq^>g3NuzpW<=<=WW%YaZm4%XmmfQ;wrzC0rz`sBC~c@<-BlEEoU5Y z_Ip;PoNHntY#dQ+QJknKRru*@^VO-*I`ztf@R@d4Aq=vlGM|-k!!#xoWA%LfdQ;&u zBOKw{Iu&wiLF1PjPpn=@Lqrwrw?rgZrt+p2b`9O?eackUJyjdF%kHT4A!{>gqq?`g z-Zo19C`MZx`VEZ|%(-gbiADYAIRnCHIOgK?(@%GhVWYE1hb(DyW<`Ct_lfnrN&U#o znkZGFUkkT|$CQxpSJ}JLnZzK5THy-Qre9;)^r@yzpJv+h8KzA)B@z){ZF;R~)9X!} zZc4o~&$n7pKeejLnX8t4z$E81{5y@XRgm$%qT)N*IeCyXXpnPCxPsP27lZsOhf98Z zMTHqYkpjvK7;_1~l_jT{I54qcBqAf0hfkb#y7@mmAS^kuu4=~2NVw17zTy5wMg33X z&w1gCPrtaPzT&zXC$P&P9;0nW8&4W}`u9C06>tMQY-z+4nko?M;C0vvTFAZ& z${4I11M6WUyaLLcKxZz9_3#Wl3(rB5Wi#fVpcy`a0_Fk_h2vlV zl)_}FhF9S=cpH8XN%#|d44;Dz|I)byq5vJCi(n+oh9&SQ+m2v43EGsEKguQ3BQJCp$Rs@i|`V>VR;+#9e5Yshi2FbIb@Rd z&;hzY2nyg3=mRH15%h;M;cPeu&VynYXt@CMLMVsfa50R8%i$`}GF4Fv5m*W_h(iMI zfIH#q@F3{?hezNS@EA10lkjVJ4w~S3coBXJn=RWh--jG@!P-Ly$cGRVz#-5FPKF}r z584CbY$%3-Fc`{VI9v=PVFFwRSHUEh0u^w*&Mx`7TtJsA4H$#5o|4aIN)3;`{Z z91a)3NEig?V$tYLpLaZgP{+c48?E(42EGa94>;9aGB+5%nG;(Vi1RK!aeXPJO)p}8p}G& zjqrj+x_VpSb<0-Fci|KG6mnR2HULUt6fA|Cpuutr<}$d|lE4(-fN#Owa395I9voHVGK-wiIyucC&AUQ3~q%4EQd$n7tjbguVyW*vpj?O9BhKuVJj4%^La2F z3O(Qom||Iic?Yb5zd{bPZnM}@p$6u_Qn&|J!JoikMNB?)gF*z(e4$B&#Qc;S?x>5*P!sp%x;r1RjD%;CXP4 zbey9=N^={eIES{_y|4;)gA`W|g&uG;gkdNQhmkM_E`!T0S7M4umMNGEVF^4APr$E1 zE1ktN@GNYE-@s;g6<&w8U_0!9PvEc60$;%OVV}jAVmW*RHbWZP9p}>tQ*?nt;84pE zm`6h|%So7`kL6^{)8Gu~2WLVt41_^26h?p)3{Qt5m<&tc13)5lPJ|+;gc{2d%x}Uf z_#r$9KZ8f$30MtlVI6FQP4E(IhSy;${2n?KIZj778P0%ya5j{{Kq!N6!rgEWtc3gE ze)t@|fL7?xk03xlxE)r(FQFM)!9g9iaU|v_>YV#9S5ePDfcYTh9h{#~U%i33n;?Hq zc;Q;8g>B&M!Jlvl91cfAA2=D#f%9M>Twp21EQ7%?1ct$*@G6}Dck&zD0e3+YG{YWn z_EOD37*2p%h`=290*-5?eugr*0;a=Scm|r_1$Y^L2XDZe@HSA=Ich7%=?W)79~b}w z;d~ebBVi0of+b+KY-*q590Nr#0+zr^SOptk6TA#gF89I7%W*nDo}~-s*>EnL2LmmG zFon}42RV#)pd;kNA#f-h4oAS5a2^bRL6*u_a-1rd4RvrM+yrs(;9>YFT==^jX9zf3 za-4B60lov@h5O)pmLFjL5FUb`z|Y`Gc*?Q{a|1jF9XNWg6Lf*DPzZ-XPdEmOp#&~~ zQWyfmEEi#pflJ{BEJJw^*1q!=ti9^WT6Y3VVQy{9Lk;n zgXYBiJC?tT;Xe4O#i5VT9^SEp=o^T~X$u1GIHE(Qq;e{ZF6r(yqlYXPQd%8XZwxxN~IR6#TBhUr8?4SWb6!*pcn z8u$=ChUv(kHSi&P4Ab-Z4IjeCFug0kVGN(X95%x?2;+smP>L5uz;?o#f&$|72pC4& zH5xXPe8sMMxL;ux& z=M?&jLBG@G`c}y9f2xm}-M{=Rzk_r?h&Wb1^C-(Pn8(8Y{Z6GzSDQEfr~S!V((OOp zpHzPN9RAb&N#)P~M1L~K|2z4f_)qmORo>Lc{7?5URlYxm9Ln^+qn{bn8~^V9W>7Ev zZ}&TcdhXxR|NJZUrQ@|NiBH`ju;`^M3={k>?el8Tyy{ zmue^W?_a8K`Tugiasds$`jvM>cE2*{PkskELjB2RaA^DX?@yk?y;AsR{Ymv3gZ8tT z>)oJ*QtC$r?diYTpDd-V6+_@3^(%vR`S;jU|MD0(7XFj{%%ESH-Jg8tSmX}K?oaOJ z_d#L$GjKAT4n;5-vgN7k`5l4VVL7P3xe6L#Go(R+#w9QoVz38ZfH}r*zVWed==A|&fG7)n!RKPdj+wgOE6xPBz*a({;4b5=K zDfs79!U@^^)<5xkH~c&MtxlL?awZMfOrDuM~-tCsDFD(cK>$!zuv$7 zpZ049(SJQqzxMC8UwZ^{d(f{f;`&k;2h(9DTnGF2cLRApr}ba!=WfT|hmeH7fcgo4 z2U6hwtpA&n8bKeTWE_DlUg1PQ;t`{jP1 za)bVDC%6@uH^9Rd%?XNMS>DBLfnA_%q@=gWuPoqnuyn!{oh=7pimsLrrs!_b0t0cV z<#0@KgykqqakNECR>X0Z6EMYzmfo16ujLd>ahl}}OwrGBCZ;&saxUh1Fu*bpQ(Ryv z#S|A>hF}VIyf6&MWbX#&V#`QOG1~GqOfl9n9#dRqxg1kmY2kPmM@+F)V2Y`hN=z}s zQiUn5v&_a6HJ0l!MZG18Ddt*kz!VECi!hf!%o4{G%Pd;>k$}4_D=@{~a4&qJ{25bx49)PVZ(nT8_gMCsh%=QOjIR z!AWX{8!^Q~%VJEi)Z$@^gyjxQai`_$m|}(HTbSZ*%e|OlrR6?MalhsJnBoVPA7P4z zEI-B+KehZEQ#@*U3{x~(eu*ix-Hdq3vIbK;ZFvS$JZssADK=SNz!bl+NEbxBVtEx) zyk>a=Q*5)mg(=>#yo)K`v%HTf{%H9KQ=}|uOz~&S$CzTL_Vyr#+_VVCjS@I$I9H6kRPLOwrwP z2&OpHayX_q!g3U*INEY7rZ~=W0;V|8(i>CswVZ+}PP3eWDf(H?#1v;+&czhPmJ&>H zzGV=mD6~p=B|qSZax3in!$#OyOEQOp&nMfhq2^d>vD) zfP3M7%l9$G4=g{z6c1T`j46I<`8lR|)bbdnXtewiQ#@&T3RA4HJdG*VTQ*>d=PXT_ z;(5!9nBupVmoddFmRB*wYnC@K#Wu@ZnBpDFyO`oV%lnw(kCu-xMaq)K6o0mSj45_n zKE)J&vwVgrc3YfdDW^~XnvV}dZzzIup%gSPKL#`(e>Kd2T3856;1*a8--1=}BX|UY zdHG**z1EUFFWhAG~%yn`v;wY-NZ-iK`chW+RFgZcG7%)zmLs&ga)^qDXU zf_dZ_T;Bxu!V~aS^TjXo>`&1CHGh8iTujaXUI#bBeef%I75)O95YUf@5|{ura4TrO zID4M>J$`4;6Cd@)zVpQ6`JFvadPdZKf2b8=fNN-g)3naOtIXEDHdAp#}q%d{1Q_u<_uBS6jrnId8=W8N3vGedVJo}|(gW%O z(&rfp(${$x0)3r=Fyl;61cPBHd=19JWLOA`AOW{SUlQ?TcpRR9nY|gSgy%qdC?A6K zP-1=2Re`PW7JLDJhutLn7qAyvVgGtv`XKEg54uAk91BI3^D)IL%N|T|!QaV4P(ZyV zeTwY*u7clFEvom#wV?V>`V;M;19X9W2*HtX6dVg-D1q}~kmX8DG08Fovl5&fbgn^q z4kDvxz@y;bL0oi(U_2qrb=cPVzT9GOmU568m5?TnTaW`wamg4)t3K{z4w5VqD;U2tA`;6$&v*`L_|bD zMKO>?1tginFbqS`VP+f#1jC97ii(PeieVKH5ffqtMMXqFM8$-lsDKF-GrE}8|2aM9 zfwSnYyPtdS?{|Oy%QKvMpZfNx>bI+_tGk+dpDsj86-mWtsWH-6wBw-jqzlke7eN<8 z6QoPgUItwbT?t(cT?<_YO@nTLrbD+ve}!&`W=J67^bT6;J!u14YLoOKTIyqI zGg|61X$xBFOX(Z5)K=*SwA-Mcq+ifdf0q(`2S{Z|nP{mpQaQ9#1*sBRs)|$L&{7{tAETu9mf9-)fR@@OCHO2zWk{K5sWMVI zv{VJD5?ZQ?6m=?QRK<3II1ZP}kTTIyWu$UwsR~jhv{V(TDq5<#R1+;#TdISW;;%zc z4WveBsm4-Mv{W;xIa;cP)DkV#N@|UkY9qBpOSP8{LQ8d!4n<2HCLMv6>LhhROLdca zprv|B$DpNpNqx{#eWm_rse#f7XsMH=Q_xbUNoSy?21$d_QbVMnXsO}SnP{mzDIYCW zC>5clils4VsjLKY7wA5qL0<_c<(jv6f)6!zJ)DmeaT56fJ0xh*tT7{N+ zSz3*jdQEx*Ewx5kibyE^8KL>(2-D2h~ww~)wp?%ogWSrKntKJp%u`J&{~M&<2OSbAHNOy z8Omr!DpVb+CDldS5NakhM@zMkTB6+#Y6BerwUdrOdnD9dig5(vajr&P zEKNX5T`EmNOI;yNMoV2SO+iadm8PMkZjh#NK4UD%cK=(sg=?ywA9PeYP8gA(i>>0 zHPTwN)Z5Z}wA6dj2DH>BsmX6Ru0lL{+Z*CVtaYLGP;Y2BbP>cc-T&^m?nmKW4Sfn_ z;)C|T8qeJUxBolix%1$g2+e>NLT^A{K;_n?k|xk$(D6_qbU75`zBeJ~c<%=Ikk4`6 zCqNwEJq6;pZV!CK+dh7|Gx8o#HZ&AstcIPZ#)m+>o#(|_5`E`Fah>}^$RCE{diRCM zpMVxYPeY5LIG_Fj`8Fv2|NmKhK3)dB3T=S?U#N#Qs7%Rt@qbkp>wiZ*tQd#>-!YDv zb+NWWKSKY1AJ6<>IgXii1OB_}WpO<7w@|7QzW;+tL%Xgoz~^FoDVYuZpB&HpNAlOZ!x?5l3|2qEJc7Hp=tJmNDcKMIR|)-}tnXD8A4;1*Uf-(&=Kojfdrdt6*F8f!*ZJZ&>3yJnP!=>E zx*U2CdItKRS_iD%-_dobH*_3S2o*zPpkJV>I7g}r#re{a$f>xF`TumCuoxfR3I8WJ z7UCG`e`lQZj8Z$sNwbdFtI&VvcwFW}FyNfm>uBwKzR5a?yUsW9{cCl+4@&=2>pRE!<*xI}lKCB7 zI$!%=J72>ym5vKB<+&N>JEuv>WUyElV>x17jSUg&W-M2%yRo5SJ&X+#JIdH_v7W}x z6g$S)S;+BUkO}{v|5))nw0s=BG|y%vMAn-#ihQ(WeFC5@5IfFTp;%vIXN&bSRwUNn z*eK-e-vH=B-Wj48VmgpBiqUAvjt_u#jMxdr&JjD&*jTZXjExgJ*%;5ec^{`3+aR{s z*haBujcpQJV(bI4=Zt+Qw$#{1$hi&nZGvmU#6L#MzAV!`n@=FJ<(yG$MoYFL0NPK* zUNH8V*h*uci@j)Ui`Xh-Ux>YA>`SqijeRBdim|W7RvY_9>{VmmioIs+JF(Y|Z54aN z*!N;@8v8+v-<3r0|LD1`)&@ZPqu4rQKZ(6<>}RoejQt|E-WcAl()aPMF?{`)X73rp zSC45nmK{>yE5S4?nUp}hy`*O|%vV~BZzB<9#mX2fFILW2MKQcJY>&!fm5l8sR>fE~ zv8u*uh*dXMORT1`-NkAft1DK=SbZ^$8Hi{o*1*^vVvUS75o>I0PqC)P_7ZDmY;UpV z#`Y0wVQgQqmd5rIYh`SIvDU`giM2I$pjdlj2a6qK>`*a|Ylt{ZtfR3b#11#sN$f~t zUBo&Y>n7IKSPwCdkBI0gc9gMW#f~x7TdbF{nGON*Z{Hq#*P;oXzWC>6O5fK zc9OAE#W*e_;&idojAe*l4k0W9NvCF?O!lIAiCFooDPXViy>@MC@W?6U8PNn{VlLh`nxXjo6#U){4Dl>}|1i#@36yW9(hAtBt)c_MWkgVjGNoAhyZaM`9lu z`$X(xW1os`HukyLXU4t|+hXi1u`i8%hn&yRH)y{V{~j&Vt(xby|50q4v7g0$GWM(3 zFUEco`@69e?le7XuLaf@CFA&|2-X=T<2a@W)*U6|xTXl!A0^}XrU=#}CF6Lf2-YPf zb9s_^k-mS|#H+t_ap$CF7W`hyh|3@dm{}u}h7eAa=R26UDAD zcCy$t#!eNRVr-Dub;feUrWqS9cB8QoVmBBo5WCe_k=S32jTXDz*m$uy#x4=N+t?(r zdB&~~d(haGVh(I7 z2s!U^Dq8;5F5_Xeyx;3IPxgq|G-Hn<=d!Gmd%gH$Xu0eSn&+~Qi`{5!0dmfAoZfVZ zwS5;t_?NCpcoUND&=U~v<7>1xLyRZU@;+|SJlP`T^gRmQD*lvwe>LCJVz(K4M(lQD zi;;7EGtjOPe^%@pv>emOcutJJSG+`QDO&b#w&v-3UhGa|%aHRv=AeC3d^uV!dza?9 z>#;OVs(ujDpt=}N3r_G4ijr&>~OJ$#*Pqc zWb8<>J&bh{Yiz8uSQBGi#F`rGDz>MwZeq=hbr;*qSP!x0#*Px(+gMMr7RHVi+sD{3 zVl9mwE4Ht(USh3`^%mRDSRb+0#*P!?*yf17Vu`VSVku+&#WIWy5G!SDpjf7{oUxO|${RaHtb(yq#VQ&*O{|i!)5R(qJ439Bu`IFOjAe@rGL|DY z*jTRE5M#r{h8i0oHr&`*VrLo~DVArfKrG+b*>RN%#>R<_HFloZ zxyCLKJKxxaVt+Aqk=S@+SBhO>>?*Oz#;y^&+Ss*XQ;c0FHr3emV$+P>D0YLfo5ZFY zyG86~V}BL9)!6M~w;7u$HpAE*VzZ3hDK^{KU1D>L-7PlP*u7%+7`tEWK4TAv%`^6( z*nDFTi#=rQQL#siJudc`v4vs_j6Es#gt4c@78!d+>}g|5#GW;_RO~rp%fy~HwnA*V zv6W&k7+WRwqOq67UNZKo*lJ_1i@j#-O|dtOy(PBB*gCPb#@-Qo+t|Be>y5oH_MWkg zVjGNoAhyZaM`9lu`$X(xW1os`HukyLXU4t|+hXi1u`i8%Blfki@5H_}_Py9vV}BF- z!Pt*t+l=w|6Zn}cK^wu}Qy^nqh6w(y0vYQwMDTYO$XKr-g1@&w#<~p={QU(o)^Uj7 z?=XnK5HVP+t+5=jcE*N?wKtY4cA&ALVh0%;CU&r~;bI+( zjSxG;*qLI78aqp@qp>`(!;Fm-JKR{l*b&AG#EvvpDAvi?*EH#SDBhp}_Sjxsh@tf#SYVn-W0SL_&L=ZPI_?0m6a#x4-+ZR{^%eT-cwcAT;C zVttKWB-YQ^#bW)9T_QHX*aWeG#wLm#Z|qXB6O5%AmF)Kk+K5tO8OBPBWg06hR>oL) zv2w;Lid8UHS*((=-NdRGt0q>}SPil2#%hVxG`71~ZDV!C>KLmpR?k>Nu?EKW5Nl+t ziCAM}dx|wRwwG8lV|$A=H@1&h3uF6=wKTS$SSw@ui?ud(fLI%2?Zny|J5a2>v4h19 zGIoeq2V)(@4mEbT*kQ(w6g$FLXR%Jkx{7r%)?KWdv7^L#7&}_5r?F$jjxp9-te3Il z#QGTPC)U^40I~kYju#tf>_o8>jGZiYlCe|8PBC`6*lEVH#Lh65jhx>t-GX+Icn(^= zmkriDU)Q-}LyQd*8)|HX*l=TKiJfU|q*$J@0^iZj#;zBeW^AU|3}bhQ%`$eU*lc5WiOn%~x7b``_ln(P?0&KPj6EPW&)9=v z^Nl?$_K>kh#U3&CxY%RH7K$w}_N3So#-0*eWb7HSr;R-;w%FKnVoQuYFSgX!a_xGa#$FOzW$YEPmyNwDw%XY1Vy_u{Q|t|6Z;7ojwoYuVv3JDYHukRAdSma4 zy=QEr*al-Ch;1_Vk=TdEJ`wxa*r#HfjeRcmnXxa#wix?L>`P>D)(qfg3l@Y6AtgIMoUqw_E zt7EL1SY2b)#p)TWAy(g5O|b^X_?uYV1`Ulh7HeUwiP%2Inu@hFwx`&>#+r$>GPal4 ze#V-MwKlf57;At;SPtjI|Xz)L1*Qj>g)H9cJu6vBQlWBzA=XBitJmS-$iY^1TFV)@2~iLs_zM4{Ld#?BUd(pZt$3S* zY_-^0W3P&>Gqyo&v$2h0pBno}Y>TnNCMEmnAhZ!@i)9-t5*uu6lvs|jVzD8{MvLVd z8zVN<*g0aujExl=Zfu;`2xI4pooVbmv9pYwFP3NQ0_V{uW2>8$Y`@3Q zM!YKaxUtv778rY7Y@x9?#GWwrrr49l)`%@K_LkUF#@32GZET&`GsfN)TWstdv1g5~ z7h7WNU9snky(hNR*!yD78`~hZ%-BY;<;FINtuXe1*bBx!6kBQRBe55aeJr-h*e7By z8QU!OvawIaUNOdcDk<&&Xd?~~OBrh`mSL=&SSe%e#WIZ@C|26oL1JZ$9V}MXSO>9k z#tsoHZ|qR93dTB$RWx>(SS4eJi&Zvugjf}0M~dxctdm$(W1YpS8S5fe-B?$#8pgVb z)il;!td_AJVzrGOCAPb;39W7SZ*fC=Dj2$ah-&ilP2F7}eH8j>otdX(f#P%@O zSFEwIeqv3G^%rYuY=GFF#s-QtGj_b#UdB!kYi{gBvAvC*B-X;%$zuB$J4LLeu~WtN zHFlalX0bz)PET`xAx*o|U07`sVqy0KftZZ`H;v0IJZE_R!-nPM}H-61y1*qvgt zjol?S$JpIsbB*0Ac8{_9#qKlqfY>}^4~oq<_ORGP#vT=W#Mt9vj~QDiw!qkvVow-* zN^Fs_XT+X1_N>@qW6y~#G4{OJQe(@-mKl3NY=yBG#a0@7No^~^ARbrnZ`22 zW*I9bc89S{vDwB-i`{9gjMyAwWyS6?R!(fLvGQVf8>=98kFknk_Zq7tcAv4zV)q-X zA~w(1ZekA@t133%ST(T+ja3(W$XE@rhmF+~d&F2Ru}6*77JJOt?qZJ{t0T6+SY5G& z#_EYZVXVH`lg1i|Ei%?n>?vc7#GW>`huAa58jCG9)C!tJt2#x`{P2)?I8bV?D&08#_vDZ(}{hS{OT8Y#(FC zh_y6!tk}NBdWp3%)>~{pV|~P08#_*He`9^c+8FC6c7U<|Vr`8L5Nl^_pjdlj$BP|k z>;$ocjGZWUu(6ZGIv6`y>=0w8h#hK-zg5otApJvE+7b2s>{a>fo2D{ri=SOsJ4#3~wVFILIefnt@79VAx8*ui4E8S5Zc z)z~3o)r=h~R^3=fu^Pq>6RT`1ZQjdc>MW301SU1MFu>KW@QR^M1R zu?EJvi#0UXL#&apqr~Evpv7^PB7&}I+sj*|l_B7T@teLUiVtX0uBi7v5aboG; z4A7200xe$!N5>0cr#2h&Pvbv`>A6||FTr{hRQlD!LGlRB$GTF+^1$iK5MvFC19biT z4O$;-SX2`GI=#{)VT}liv+qL;&a+Mg|G&C4)>j7Nd^s(9qt?fI5EaCxi?Q}Yu$#md zVMS5z;%MFPeOQiTQ#kv`9+)6F<|f!uu?NAr$oH5r`q;mR!4^Rr4->v+@{xt_Ij~g_ z=fk%~K8``D0kJP1ig9d7u)fA(*^k9IW+d1T#^Qdz1N#NyxDPVk$5#1x?O9wqbeXR8 z;WbuqOl8@mDdZ4m#@Df)LK^4p<7#%3U&3uPOdiTrM8 zu(4Ul?}2iR-GTgGXo#`d$nS%4jopd-erTw%ImqWh{J)Us-(AQbfC|O9uRVmEQEY69 z82=A}%hLC)SlWyUk1=I+TN@g7ia0jKv8a^xt>AGy$`p^+aopeIy1#hc2461Dc^+>P z_2IRhcnX}a|0!r+$8F({*Wz39^L6a&*|Zan^~{Iw1Kbw=SkEWs=kXx=(|;$<^>8x{ z+=<6}P7sgdMLgcWiFd}bTs|9$=z@f7Z~(Mj#d3^w6B}ZzyI8KV9%6isB3So`_c1I0 zTGl-x<9kR1>mHHuJtTrPkI2pnfVP(ypZ|#7Na!0G04?htk@0;Yf_0C`3Id?*D^_TX zb&u#f+ZgK}krf#mAjbEzh=EAxmHGf4uF<*kI2RtW8EV%zVAh_?h)D80BBkF zh>Y)r5v+Sec5VQ)99K!kah4H_k&tbGBA!J;wlM(OC1RV5Jty{ov87@k8hc*sBV)_N zJ~qZ$NW9-qjIkCH*=A!eh<$2|wUFrh%ouASk$rA#mDm=F=o3W~5)r?gat6{9BSS@3<#dbGVN35=~dSdmB zH4tlPtdZCr#u|$?G1gRUPh-u*_A=I7Y;R*N#P%`PQfyyit;F^-)>>?TV{OIS8EY?g zps|C*4mNg(*rCQciXCR`aIqtd9VynySZA>=#=44iGuB@=~{jh!KuWo(dG zwz0utImU*FV`Ie5F*a80 zH$Jh7aboA1?>w>dja?x27h@NSZ9n#5ofnC*Mn}ZOVwc#m6T~JOyHt#|JR&X=n`FMr z#aQ1X;tDa=_lUSsY_ctTwb;AHt`TD$kccT_tOF8pt=Lps_Byda=9?zQ+8_}(h_Mbx z#EoLC7ZNdD>?X7kw~Db|NW@>oST7{vb}`lqiI^ca6K%vSu{(^-7Q55f9I^4XzPrTc zn(uBg)*p$uPwam4%@boyl86Vy=9}+9G1e)Gcu0(ON+KQ>d&HJ~RO~ThkBhOMNyGxN zh2~o%_LQ-uV#|y@{|9Wj*bC-c@ds?B*edhA_y_DIv6s#Fir8vnuZq29>~*m>jJ+wg z#@Jh8YmKcFd)wGMV(X2)C-%Ov4PqOOZ4&#y*oR^t8T(l56JwjjJ~j54*yqN!h<#z~ zOR=wveT|&E0MEDhogL#F`MxvXw|~I4ihXasAH=RV_BXL-jBOM9(b!L7KO6f+>{nxd z7yHc^9|UJv4=aN8ugFRnWBn^K*29Wm{VOuo!-^;;#(G#0tbaux>tRK({uLSPVMVb1 z6&dScMX>%A8S7z1R2O4CtO(Y>qL1~kB3S>5jP5jPMIUQqMX+`t+0C3NSgVP%tlbpR9s55SzcYzo z{U$Pgj~p>cjP;x%E*Il>%Mn+Iv7S@JWU*Dot`=h*p9t3N;r;Ua+z5UL#o71{ir)oY z3(?2#y&_l-ij4K4B3KWK>|tZ92SvvEP!X&JMfRvM)`KEreW-{V#rVBi1ZzRjx4_s< zV!lmT3yQuc%*T3AWKSAnEhsYo-h%a@$XFjLg7u)tSRX2a^`OXDA1Y#o*kWTd#hx|B zdQe=J^`RnI4~mTSp(5@S<9B%xtOrHkGGnXtrc5`HiEUJ=wofE2-cD! zV{NGj){-J)ZK;S2VjGQZ5@T(t2-cF~vL6{^Eh#eAmWtRc_NlSY#8_J@Vv87SOGSJs z#@bR5UyJ#^`;D0IL#&O)zW6r%Ud&%xe-qn=HsVJy)~|~ANsP6swnt{kee^{ekrL}? zEJLinu~K3KjAe=qG*(*dcw=S6PB2zh>_lVb#7;6+UhHIJ6~s<4R#EI!W0k~CGgevb zbYoS-&M>x{SeCJ>Vr`676Fb0Ib+NX_YKXNnR#U9Kv07pW8mldKkg?sx4mMUttb?(- zVuu*3Cw8c@`eGf8H4r<@SVOVHjWrTG!q^^SM;dD^*2!2CvChVtighuzr&w2G&BVGH z+e@swvF2hujO{IUl(80KJ&o-ncC@jUV#gTUSL|40t;Bj6+fS^wvDRXJjO{OWoUuV- z*~SKogT4V(eD2zZ$zu>~>=_#AX_sC3c6g*d>?vbUi#=oPS+OO?o)cSY?0K>HL=%?y&?9du{C0E8Cxs1&e+>x?-*Mz_O7w_ z#NIcyL2RS3O=2Gy`%vs7V;_rsVr;Y6r^Y@L``p+Tu`i5$DfX4Iuf@JG_N~}=#eue34NrXpjlstDGmB4e$p2-c<|W38$P z)}|t3t*QvtrXpjlstDGmB4e$p2-c<|8*GfVsmNHXDx$p@YgI+CHWhumE-2z4G1jVz zU~MY;SgR_6wW-Kht15!EsmNHXDuT7C$XKf?g0-p0c&+rqn~IFJsv-u8u~tw6!SN7e93K(E@epJj9}&Uv5M&%55y9~gWE>w6!SN7e93K(E@epJj9}&Uv5M&%5 z5y9~gWE>w6!SN7e93K(E@epJj9}&Uv5M&%55y9~gWE>w6!SN7e93K(E@epJj9}&Uv z5M&%55y9~gWE>w6!SN7e93K(E@epJj9}&Uv5M&%55y9~gWE>w6!SN7e93K(E@epJj z9}&Uv5M&%55y9~gWE>w6!SN7e93K(E@epJj9}&Uv5M&%55y9~gWE>w6!SN7e93K(E z@epJj9}&Uv5M&%55y9~gWE>w6!SN7e93QbgaP2EuO4q=WXNZ+DmMK=+SQ)Xh#>$D6 zH&#KcqOnS1m5o&q+s#;2v1-Pui`6hzQ>>P;+G4vKt0Pv|SUs`&#u|t*}ABzCZ| z4q}HGJ5;QrvBSg;H+F>Bk;XcSbvD*TtgEqZV%?4P5If3PPqCwo9V2$Ev0h@mjr9>b z&RAcue#ZKX4KOxP?091*h@EKcB(al?og#LsvD3s(H+F_tma#!%*~SKo|(J?j7<=mXzWt4%ZyDDyWH3nVpkfQEOwQ#tHrJ{Hbv}OV^hVhGd4}^ zdSf>r=jR+=AA5kl_q|b!*OitNn=TgPBydx5lNhfJtsvjcV%cCE1H!lkjPD=5|IHAa zi8f-E*d4}Zi`{8#j@Vts=8D~I>>jaujol}9zp;5@4;Y&-_Mowc#2z;Gh}fgX9us@q z*aESI#-0#+(%2%gr;I%<_KdN`V$T{|BKDlIrDD$;TPC*L*b1>1jI9)V(by`nmyEqE z_KLC9Vy_x|P3(1JZ-~8VY>n7k#@33hGxoOFJI2Mlh_BwJ{0@N z*vDd@7~3rNsj<(*J~y^S>WNi1R$r`! zu?Au_jWrajWvqo5$L>VzBgU~i5iP}<8rxTFPh+jbICdvuKQWHoiD)g>+}QqNdmHN@ z*2dT&Vh0#IRIIJBj$-YM9VXV^*x_Oa8e@Gp?k@)!J5uamV?D(>89Q36v$12ux)?iF ztgEqJV%?1O7VB=TFLJ)+@c*aN<6Dq(YzyC-wlmCdT#GaQKQ_m-IOABClfn3S`=O0E zRcwH<)5VTAmL+zgvEgEajExY>Hg=}iU}I;A|(JDW0#1PGB!ah)7V6@(#9?oqx znD=k8nD_50G4J2iV&1=N#Jqn~#2TZGK688@w`mh&Q^lGZyH0FRW7EW%8RPgqu5T}6 z9N$OQ+}Mp`dmH1}L;Adb9DBHP|2X!L%=^c&hh*MAjy)vv{&DOfnfH%l56QfL9D7LS z{hJ{+2yJY?nPS<-W{C|pc86GwvDsonjNK`gYiy3#P-AzA4Kp@Z%=>q@nD_4|#Jqp^i+TU%iFyAX5cB>$Bvyzvw%@~Iyml+tBVxSXEZAe_2oWzukXb8 zezZo*(ieSxYbPK1S}^u`HQI=EVy_x|TWpN6cf`&ywh1{_yZst3&U~;FWB)z`<74CX zNbz3#u^8WLqtBo0v@H2%F!p%^+K5lZHX8d(>|A4?i=Ag|i`YlTzD3UdosTy5gYU$6 z?OU*|V!Q@2*bnB5$MH8XSQ0KvM(;K-K8~?yBYqScXY402_9fzHu?vj-f}DN!{xxq> zavx+7EyaAS>b_zhg$eB-u|l*F*%{>}j#J#-0&dXKb<9+s2+1d&k%kvGvBD6MNU#QnB}p zJumjYv1MW#j4c=2Xl#YpCSxy%ePC>**oVem6#K~7DzT4^y(IRDv6sa*8+%3UQ)5Z1 zlKr3!+K80c0md@K+8Qe**3MX_SbJlo#SS!9M(iMCWyKCQR!*#gvGQVv7^@(5sIiJ- z9gS5IJIq*RvBQm35j(=zZem9ot18yXST(WE#;S{TF;+vYtFfA5-Hg=|>u#*JSPx^n ziydXGj#y7)b;XW0R!{60WA(+3HP%3^m$8Ooy^S>z>tk#WvEz(27VB%QiC8~lO~v{f z+f!_Sv1VcejqN3Nys_qDCm7pX>_lTN#7;7{kJ!n^T8f=wY+tccjkOXx&DeforyFZ6 zc80O>Viy^^SnLvG6T~JOyHxBlW0S-#H+F^CmBuEEU1jWQv1^P?5xdsdRI%%fO%uD` z*bQPg8k;V5ld+q{ZZUSN*k6s^CU(2A8DcYy%@VuA*le*ojm;6e%h+78yN%r=cCWGf z#O^mXPwW9>^Ti%C_K?`a#vT!S)YxNUj~iPcw$RuUVow@dB=(fCr^TKzwpi?0V@t%I zGqzOhd1K4OmK$3k_JXmMVlNt7CH9iBm&IN&wp#2}W3P$5ZtM-QH;t_kd&}5bv317Y z7JJ9oda-wny(jj*u?=DyjcpS9z*vG}68x;p`Y%xfhBd^3v6c^mHN=ADm7s+6efV)Y zmZg`qeVozDdSP6aL|$!CzxXd{}6buqT5SXX1s#JU;VORT%G=3+gJ?Jahcu@+)IjqM|Lw6T_A z#~9mJ>{w&1#CjRqPpr4G)?$5(?Jstmu{L6TjU6D?&sbZr{>Ivg4KUVTY@o3N#f~?2 zkk|>v4i-DnSO>9_j2$9&vav(OPBE5bmei(Xjmiktq~siHR7S8SCFfY9GJ-WJIma56 z5v)ncIo7C*U`LY$_Un^tu{I zDalx)GJ-WJIma565v)ncIo7C*U`LY%815d ztWg=knv|Sljmiktq~siHR7S8SCFfY9GJ-WJIma565v)ncIo7C*U`;)zJ1^10z+O-XK?F0Y&_km2j zwp{Evx{ILzTtVqH|$L}e{h)+@ZsUk2v$Jypj0@g=ZIyDjq%NoU!B1J@vHH z&&V3|&u>5P{0sha;rNR#zGTA0OD~&r`4v}AzUu00rd&Jqx@p(naO3owZocK#zutEH zjG43Un0@D*yXM|~&%O8EKktG04?gtpBac4z_=1H`Jh|wpr=MB;?2_k}KEG`FiWgSC zxay^sUs?U?Yp=iY=9;(Gu6z5P_3ys-{)Ua4KKSsXk3ZS`>1UsB`Qpp3zW(Oh@3wyb z!{4_3_|wn7{QCFbe*f9DQkU{w%9Z^6?lbQ1-T%`+$6`15e>?t%@BjZ~|9(sR_n+?n zIJMjU*`1#=bb6OQ2jp#3Y016J8N4lgT$bXz=W)BYu;4xT_uh(NHK4tquFxe=eJsd2 zU**xk(&eyjjI*lW7~jQoLOz~D3R8Fw&A@$T;vKUbK2KD|J7iYKC*$$Ho22%{ z!`uxYr5cu8I#Lz)(-_A}tf8b24VWOj#a$*GXV@Ms)$l?-f|8t%uM+OJYWmTp@$V)Z zW@aRPA;$b$GLrc>Bggy<=n<^zX=nxX8nhnz82TFe3CbLwN~%D0pr%kO=pd*QbPO~Q zIs+OG6+!1imqJq@#)`5ySD%!^=Zccx{GOPvV)Om3;ODU&w-3NP_W=g|C+#$UI_CMf z8N9tM*0*!qI~U^{uPj+FZ#@h1k3x%~b$*peX zj#0Li0RPN?Lah>i*<}3qf6L$Ul1%LKh)$gR>H6oiygijRraxi)x&MSWe@pu-CNswW zJL|{xKJuJFDSXbEF}~ct(H}lPWwDoW{r|52vQnjzD^q{&Z#OoTw?WQ*k@-Q$*;0og=kbhr7vx+Y^Pb50IGFcAUS9b?7}Y7kL_O@d2Ig%$Yc9AMIPI~1@hSbt&zv}KM;9r=Z?tZ zxxig)-{#CCcnqY5!aE!~3(AMiff(b_^0td1-bT*^Xjkmo0=u@rt}U=@3+&ngySBit zEwF0~{QqMM+>G<@2cc)67ogXmccCw!U!ly4Qb`l2Ez|=#2^tLLL*t-Jpc|nX&>ZMK z=wWCv^d9szRO#YWvNyCJ)E+t%>I)S>lc77H)zCUH@f)D{{9O@yw6Wt`&LpX+0A zS`(TA?`aS3@Mq#NF}QADKOJq-x8OGzv96sX{IP!b@9d3vo=b4s=iI$hg0@$L)Jp z!}m03AA}kpUx4;`=tF#2#(gvWIFYXcV_*BAPp>222vtMQ{q`s1+wkQZ_apk>#Co{D z&_5kH_t(alZ?FfxCsIBHd3s+5FN1B$s0GzPKe^l?b?}{*^3Qfh?P~Owd~#!qi9_BN zx7`MQ7+Ur{w+Y6QqA$#^!hIesz8^dTly9ny{RR0@=n>@O#4kn8*Xmy|KOD>QHOu^1 zVKDc~O{5Bdm_nE24zX9iSF&H_Iaeu@7BiR0o9b2Mge%Ex@7TC1~c5Q)OTVU4~ z*tG?AZGl}|VAmGl7O2*wQvc3_>USAmrcz6SYxr)WfB@rZ)_V{^wP z{mw2orFy5VtgKPR**Rxrmera(0XK9gfT$nNv89_n3gSD(OTamMb0_u+2_A8=5^LkLLE`MLF5U;q8!SV@Bow z<0=j#9+g{sCLRWs?1With`fRv&UM4w(4yR2<~@;*+ zQSNr{Ntnfk%FE5C_p}f6bx8{z` z$xS~wS-E42i?Valw+{dPt;NHO3eMq@d4F(Q(YUPK{9-&sxV`Y7+&*?hdey~o^T<)d z2IS@s;UZ&qVgp7OmaOaixM9?|{G1(kF+TN=ykyllDauOrXr0~`IouPn^0P70TR#3y7h_P*rQQOTgecy7+>pIexhos-)&Zn!a3fW?xTDK4E{)Sy%{ z8z;dT>Ah@c@6=RoUT#itLD9}P+=}8V*LKH$72m|k!vnDb?3Y=|yi`_#-=-=*8owqt zBKf@hu-xLTuDhaPZH zR=c);yi)vNSeX%{O713okNDZH-`(@`rLqeP^TuUiGhweDm76uRAa6+WN~v@=V?Mo( zQCWk>v0up>rA7|UG4r}o+xwV)dWs859$@kwu9|oy3mfX|Y)n4N!DQPIOeUR;$tM?J z^2miaH&1V@rJ19WnWb}*2g{5|zAclREGk=+o4j9k@Zixyvqt1&N4vXRezLUO(BzWx z*r)SH;fRpDUw&kEanA7Mo|=W(Mdn1;WwOVnqqGnEZepd2kE$nDn$y=qf zi_qQKHIvfOrR172Ba_FfpOambpEY!JeonHeCVDDvnaBy7g0tmL;c+~VuXCK*_l?WVVtP0tYKB(uwACSRwQ$l`Hpe%a(P zkf#^$TfkfR1F{)76ue%xsHmW*WF6Qqk|(NVCTnnGX7URyrG_O_%jJ(AIXJhd+I2ZI~Xx^1fKDwwQ)p9?+$mA!?T-}T!iQ0&L_CO@%)|I zjFE*Su>8~I3dbeOYv4}!-Bo7pImxA#j6lAAYrES~?GnaPr8v3Le|sGG_c;BcKYJl)G=D!Y-)DxbVwJ}EW0V92=S zrSkcFHS;x^ET}zdcs4dGHd6YSRq~j|;~AQ)9NM1F})xFX$y=U+@eidCF`@)D;TS9AJ#dOGn{_K(XZcT`Eg*6^aiZ1Q}S zKYsSsS1EZ1;s#k*g-2dIg~>BjGLw6;s?6k3t}wm1R#!>Z054ACb?NEn=^KlSM(1YX zeS-V{IoNCQobWh-qbZNAckVVcI}daJ)Nt=^naOwQ)%}`Y-QeV{-S7$>IeKK)KY3f2 zQY|T!pWe%pExWbNN~Tn8pOxU35;CIu6RK|CtjQHs@jSl9hq4}1902(;(?*$J^&j8f z{*HBUL*UmQzQtk>y}t7T8+Te@0^Uryz?Q1XHY~6N3*eZRp3Z%P`J^{FU7McHUBmp6 zx46>uA!uGT96`4~$m9_m+HP1&&+V8d8AA(-unChFtMNVaE!?<%9dEpE6Q>`2Ld%ZB zbMkXFz4vCN-Ud}NJwt4mzk_gFL3uaTt5qv5h)t2wry$82)I{i{!e?9FA zPB&c1=>u1By7(JTf4YbxyspQ^shP>@iJZQfo_>lc4&upcHM5eHIB=&wS8c3`6NhAT zolN{!6|GlZPE-2h%dnz?(S`V|Q1aw(zt1TifluwzYGKbyZmyM?%%m9~J$Y;^;76h? z9{iJ6YB5cw*G@lAPuIrtl$G38C;hpN@3qTuZ*QgVXLLS4*WGhUV1dl!@tZmQbOxul&tzBe{#%>R{7-eX$sVeWo$X89#im(w-FXM6 zYtqyE?!*$thec z=atKLAB9hz$>h2?WMUtlwR_2t{PB9|c1ijcocP3Fa)>WEc&7KtC9*zKA5ZH7_LrN9 z=LT=>p1gv6@17Ef&6j+&`>2vLs7tZOm2CWy%`z&PT8D1{MY%&`LrurydmD@5O_Vpe$xC(E*R3$l#;=BDCiBzNw=v~YKfItQSzjlwIN1clt@t^y z%;cN&bn(~B@A{V07x7bJxS#a&lKV>|e*@DUkKvZO$wEA^JLd7GyFcP|@h6;a#5Bn$ zC`_KOJ2-cE_Lvd4w|B8;-@3VUM%(1Ax;$eZm3#nl_h$MZPfwr6G`-Z%JC?c*+vxT5 zQdiY0S?VT`chmmO>FIar>EF}S4WDvtuYAtw>@Df8rr*8O&&3P%lCRL)U%>H3`$fqE z$sUT6j(W*V+%V~@^xdaF-Xy=(!>1j+W8cN4zUGa1P3Ge@F^WswQlBr)`*GXmZ@I<| zTRC0&1E*8|#_7#JaXR7Wo%-=={p5Qr_2Dl&@lWd~KZ9TKE0>y|p1z!(evfIA*_rRw zz3|Rd)El2g?rYE;ACezx(5>VneezPn0s27R5M6l~|3_Z3K(ejD(F2al>d@i9L$VIY z8d#8CL05bt8JPZnIj3RCrxaW+{1G*l4bnn>^VlwT^^w75Do!2wteUV+)hHdyK+)RWc9s zkxle{i0SMmV=GpySf$}!6%Rk`@B@4I!e8&+*@rdnb9t(7>((11>7JAXPjqwIXvB{@zGUOKr|roLZb3 zpK)DkW9pjJLm7X~IHpCP(>pfb=bcoydsDY%{8s9W&obtx#y7dI@oD>vnwUCmLMrRD z$&KfxmhFZiFME#dbX}@!wc71^?0wiF?fUjB-ROb=ucUs;s8FwYg^G2nm#a|rq!X&P z?l7ot-&3zkm47O=y4=Fjx0k8dvRdtxsSEMgD^_fFa-*}mXU{7?rEJebCZ*P-a#yA1 zr1m*>Tk7TPC#v3(dNQMQ&6*we>vG7MoogS|?6TC28MmYc6y2D)sC26%Yc9&1nd*Gd zsrww+^?)_0@uhB0Ev(YKP431v=NyoARjRO3%Pz+s*Y?rWtc;6OyVd)!%=cxkPi@OM z{mYDNGM>*^Uhlb#e#iBhm~lnhyEAUgXwtEAl`2&#pg)6KKbt!Kq)|7erl)GOsa9@F zYFp~VRIjzEhf-&5NHuTXXm5P4h&SJ42)|%Nbbuo7j(lh-T+h+3abKKbC9N@;jsN(s zg0`7*@@5dne=_fbN#ykNnvTY3>1U26?dLV|%;}GueqIl92wM7?qxqM9UfaNR(9itO z{JcgYM}FqvuVVd)oc-Z780W~(Jp8!aB%SlVBd4F&Z(J)s^YHIw{>bU)wIX-R&piCG zO}PHZ>F4zVcwIUdH4@Af8_M@nwp>FXI>jS#{_s8v23iLeT$sS z^4gq};OBF}Jp2c0S^6WVpVt?Sl%IL{dz(LU`gv{A1o@eVznA$Vr=Qm~aY$8q-$Ne$ zSSR}vIsLpQ3g_u*KlAX%I_Zy`eqK-Ysr<~tAM4zC{k#^d76zNJKg|Ek&+E93lArmX z`FRc4`SLRlf3|I($k~5hKgJr^><@D^>DOB95A1*B^z)jcHS#kLe{)-ZbU)byltAXCD66=8v3yUZd4n ze&&DX=k;AD%g;Rg$J+WM=lXeVSfTvP!+*B;n)v{k(2%w*1V) zf1Is9a{77A+q3dB5C2Q%kDPv9H}}5$%)?)3{>bU)wTtEO$&ULQ^YG_mA7S1HlgR1k zHGuoc&piBCbh|%t`hSI|r~J&rkFtH+{gKnpYX)=VXC8j`k2(7jIsLqTkRv9^nA6h? z>S^nboPJ(oc(eS>!+*N@Bd4F&;LVqxdH7#6f8_K}Zj9^A@$p{@f-ww#&~v z{DaLOIsLp=uof=J0K#5^YG6zf8_M@8oy`dXCD4G=8v3yULW|S{LI6Dp!p-GpVt;P!vjh`FXr!W{>bUC zi;Xcze&(_Myv&lk4?yJf^P0vR=)|GpC2!zlZfFa{75KWsCA9 z{bwHj?&go2{&p>KypW%H_}iO5a{77Q<~8y&4}bKb4?yJf^P10BqYmeP||yE^$L!Z zpLzJ3n?G{;StDVn{LI78`(V!gL{2~JDV!}o^YCM{Zudt{KWi^sAV2f)w=#d^^s`RG zB>9<#zpD8or=Rs2rpeDd{DU%g^e1xq*B*pg5Arh)|9m9O`(P3|{gXPN4ut&7>EZUs zDzn2MIsKm;kt9FM&piAuS^p!apLHhc;Q{g3&OH3NNSL!f%)7wTyfnZxjEPWQ75PcZ z+swqZ=E}z-&r{xb7RHb$-++94`0*gGP~Pboj44q*eig)l1en0eJ)ElaTZI`lDmQ{_qUJZHz;a?|e+C z+ZoR_&L_DKq;vSVkKvSJ`#umk_ZikPsVhHoptL_e8*`tDoc^Bhw3eSaP}+}=Hrv-9 zIsIqC(?fpd;Xls&k<-5ro>S##9{zsjkDPwiQz?|6dHAvD_WndpKkKnvBR})-cQk+G z^j`|k!}2o^|5@f|z7n4FzCAS~S&O_e7=!+J9=`;S=dLx*nIrFjeCN-lTXA212j}z1 zJnk2}PCD-c5IOr<8gFuY)GF~a4}Uz@^hZvAeRw*_&piBFZT*qczgstKJNcQ1zp42n zr~d$WPL`i}_#Zca6APJg%F zc%PP^dH8#oKXUq~;6+stPdNL}{LlRB@uF%fKlAXvVf~Ms>!05rHMr$x9{zZY?0@9x z{^QB(DStQQ;UA8KIsK8-f8Rj7KICUkPcvvS6#mHR&pRIH9`ZB)Gk>cSlH{-QGY>x# z=Il@8Tz{(*@wqzu$aypSb6tro?T?)PXW)57e&*rdX#U9QpK(%>d@Min@Lyy8$m!qz zWO#Njd4AJ5eC$tK+{R`5U=lg~*{9$&FF$j7=x>OGIsK8-|Cdv-y!_1Rp&z^Ic7Npb zuYl)h`I(0wr-0l2k<ZTg$^OQi9_|mUy2YIS z$my>%7@tMuXHF0OxU22{$mu^5p62p15C54+m~;J+)Bi>ejwkXnr-$pGZ|jeo{s}|y zxk7&C;pb;q=3IZ|^kGa5_F; z$bSsfTv;olKwLfe-HCVPXD9u94kNb@b7K@$mw4X&oKF!hyO71 zM^1m8+4x>ve&*pn#Qc%d-w&Qi@-q*AJjOl%k<&i`p6T*44}V`yL z#-?+wKXUr_x)a}n%g;RgrOh8X{Vn17Tz=-^Z)E<+>F)_ol?Elx7xVC6VE)MIe;%F# z zSG4sp)U!ym^q`Xi@5^KN`Ej2)KmWz55WlJzHY`cH%BQ2CjM{{-_# zPX9yj94|lf@Z+sGowGlY)4v3sv*l+V{?_J?oc^!jxk`TK;qPGn$mwr!59-9o&piBt z%pW=Zli+zqe&*qiV@@A{$mw4T&)f1d|1*CJd=URW`hz_Dr&@m^=lWTXxY`~i&lmIX zUuXWv>92hs{y$!R=HV}I{>bUy1D@mMXCD5i%+H*^f87`@W3uJ9+s*#R?>YTFy%sz}w4TPucYaS_kA8jv&V86Un)ETMZ)Qo}2Ox4j z##RsF|Am{B_?b6CK0)ip&FN(qX6#rtaxVMP!+6iuvdqJe(SYfk_Z9gN-iYwWG7!tg zV>tu)&foQAK92iuTGBV>Ttzbon`ry`BWHhhgQuhX%){T({E^dt2t2*zXCD4)=8v5I zW8le`pLzJ>GYlVZzLlT(pZVW}r_`P${b&AX{tfUnke_+@xlb_X z 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